shell学习第七天之Linux三剑客grep,sed,awk

简介: shell学习第七天之Linux三剑客grep,sed,awk

三剑客之一-----sed

  • sed [选项] '命令' 文件路径
  • 选项
选项 作用
-r 支持扩展元字符
-i 写入文件,即操作会保存
-e 可以指定多个命令,也可用“;”分割多个命令,按顺序执行
-n 静默模式,取消默认控制台输出

  • 命令
命令 作用 例子
a 追加内容 sed ‘3a Hi’ test.txt
d 删除 sed ‘3,5d’ test.txt
s 匹配局部替换 sed ‘s/hi/nihao/’ test.txt
c 匹配到的整行替换 sed ‘2c this is a text.’ test.txt
p 打印,可与选项-n结合使用 sed -rn ‘3,5p’ test.txt
r 读文件 sed ‘/nihao/r test1.txt’ test.txt
w 写文件 sed ‘3,5w test1.txt’ test.txt

地址(定址)

地址用于决定对那些进行编辑。地址形式可以是数字,正则表达式,或两者的结合,正则要用“/模式/”格式。如:

  • sed -r ‘3,$d’ test.txt ----->删除第三行到最后一行
  • sed -r ‘3,10d’ test.txt ----->删除第三行到第十行
  • sed -r '3,+10d' test.txt ----->删除第三行和后面的十行
  • 暂存空间

命令模式 作用 例子
h 将模式空间内容到的存入暂存空间(覆盖) sed -r ‘3h’ test.txt
H 将模式空间内容到的存入暂存空间(追加) sed -r ‘3H’ test.txt
g 将暂存空间的内容复制到模式空间(覆盖) sed -r ‘1h;3g’ test.txt
G 将暂存空间的内容复制到模式空间(追加) sed -r ‘1h;3G’ test.txt
x 暂存空间内容与模式空间内容互换 sed -r ‘3h;4x’ test.txt

sed中使用外部变量

  • sed -ri ‘4a$var1’ test.txt ,单引号中的$var1不行
    应该sed -ri “4a$var1” test.txt,或者sed -ri '4a'"$var1"
  • sed -ri “$a$var1” test.txt,会出现歧义,应该sed -ri "\$a$var1" test.txt
  • sed常见操作
  • sed -r ‘3s/[ \t]*#*/#/’ test.txt ----->给第三行加注释,有则不加

三剑客之一-----grep

  • 分类
  • grep:支持基本的正则元字符
  • egrep:支持扩展的元字符
  • fgrep:不支持元字符,字面解释所有的字符
  • grep [选项] 模式 文件1 文件2…
  • 找到:返回0
    没找到:返回1
    找不到指定文件:2
  • 选项
选项 作用
-i ignore,忽略大小写
-l 只列出匹配行所在的文件名
-q quit,静默
-v 反向查找,只显示不匹配的行
-R,-r 递归针对目录
-A after,显示匹配到行的后面指定行数
-B before,显示匹配行的前面指定行数
-C context,显示匹配行的前后指定行数

三剑客之一------awk

  • 语法形式:awk [options] 'commands' filenames,与sed一样,也是一行一行(一行为一个记录)处理文件
  • option:-F , 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)
  • commands,包括三部分:
    BEGIN{} {} END{}
    行处理前 行处理 行处理后
  • eg: awk ‘BEGIN{print “start”} {print “ok”} END{print “end”}’ /etc/hosts

效果如下:


20200717160058984.png

记录与字段相关的内部变量

变量 作用 实例
$0 awk变量$0保存当前记录的内容 awk ‘{print $0}’ /etc/passwd
NR 当前记录所在行数,每个文件都从1开始 awk ‘{print NR,$0}’ test.txt /etc/passwd
FNR 当前记录所在行数,文件之间是连贯的 awk ‘{print NR,$0}’ test.txt /etc/passwd
NF 当前记录的字段数 awk ‘{print $NF}’ /etc/passwd
FS 输入字段分隔符 默认是空格或制表符,可以修改
OFS 输出字段分隔符 默认是空格
RS 输入记录分隔符,默认是换行符,即一行一个记录,依次对行处理 awk ‘BEGIN{RS=":"} {print $0}’ /etc/passwd
ORS 输出记录之间的的分隔符,默认是换行符 awk ‘BEGIN{ORS=""} {print $0}’ /etc/passwd

  • 格式化输出
  • print函数,类似python中的函数,默认换行
  • eg:awk -F: ‘{print “用户:” $1}’ /etc/passwd
  • printf函数,类似C语言中的函数,默认不换行,-表示左对齐,默认右对齐
  • eg: awk -F: ‘{printf “%-10s,%-5s,%-5s\n”,$1,$,2,$3}’ /etc/passwd
  • 模式和动作
  • 正则表达式
  • 匹配记录(整行), eg : awk ‘/^root/’ /etc/passwd
  • 匹配字段 (~,!~)eg : awk -F ‘$1 ~ /^hxd/’ /etc/passwd
  • 比较表达式,包括 < , > , = , != , <= , >=
    eg : awk -F":" '$3==0 ’ /etc/passwd
  • 条件表达式,if else,if else if else,while,for 均适用
  • awk ‘{if() {} else {}}’ filename
  • awk ‘{if () {} else if () {} else {}}’ filename
  • awk ‘{while () {}}’ filename
  • awk ‘{for () {}}’ filename
  • 算数运算,包括 + - * / % ^(幂)
  • eg : awk -F":" ‘$3 * 10 >500’ /etc/passwd
  • 逻辑操作符和复合模式
  • $$----->逻辑与,eg : awk -F":" ‘$1 ~ /root/ && $3<=15’ /etc/passwd
  • || ----->逻辑或,eg : awk -F":" ‘$1 ~ /root/ || $1 ~ /hxd/’ /etc/passwd

! ------>逻辑非,eg : awk -F":" ‘!($1 ~ /root/ || $1 ~ /hxd/)’ /etc/passwd

范围模式,eg : awk -F":" ‘/^root/,/^hxd/’ /etc/passwd ,匹配从root开始的行到hxd开始的行

  • 三目运算符a?b:c , eg : awk -F ‘{print($7>$10 ? “high” $7 : “high” $10)}’ filedata
  • awk内部的数组
    就类似于C语言中的数组
  • 遍历数组:awk -F":" '{ username[x++]=$1} END{for (i in username) {print username[i]} }' /etc/passwd
  • 计数器:awk -F":" '{shells[$NF]++} END{for (i in shells) {print "shell:",i,"num:",shells[i]} }' /etc/passwd
  • 注意:
  • awk里面这个{}里面的多条命令应用分号隔开
  • 里面定义的变量输出时不需要加$


目录
相关文章
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
456 9
|
3月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
370 2
|
5月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
661 1
|
7月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
228 4
|
7月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
449 3
|
8月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
695 25
|
8月前
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
197 18
|
9月前
|
存储 IDE Linux
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
本文详细介绍了在VMware虚拟机中安装CentOS 6.8的全过程。首先,需确保已安装VMware并开启V-CPU虚拟化功能,可通过BIOS设置或使用LeoMoon CPU-V工具检测。接着,下载CentOS镜像文件,并在VMware中新建虚拟机,配置CPU、内存、硬盘等参数。最后,加载ISO镜像启动虚拟机,按照提示完成CentOS的安装,包括语言、键盘、存储方式、地区、密码设置及硬盘分区等步骤。安装完成后,以root用户登录即可进入系统桌面,开始学习Linux命令和操作。
957 12
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
|
6月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
290 60