shell中文本处理工具三剑客grep、sed、awk
1、grep
全称是Globally search a Regular Expression and Print,grep是贪婪模式,只要符合条件全收
grep -E = egrep 扩展的grep
(1)grep root passwd
过滤root关键字
(2)grep -i root passwd
忽略大小写
(3)grep -E "\<root" passwd
root字符之前不能有字符
(4)grep -E "root\>" passwd
root字符之后不能有字符
(5)grep -数字 root passwd
显示过滤行以及上面几行和下面几行
(6)grep -n root passwd
显示匹配的行所在行号
(7)grep -A数字 root passwd
显示过滤行以及下面几行
(8)grep -B数字 root passwd
显示过滤行以及上面几行
(9)grep -v
反向过滤
练习1:只抓取在中间的root,root开头的root结尾的不要。
思路是先抓取所有含root的,然后抓取root开头或者root结尾的,最后一反向过滤。
grep字符数量匹配规则
^westos
以westos开头
westos$
以westos结尾
w....s
w开头s结尾中间4个任意字符
.....s
s结尾前面5个任意字符
*
字符出现任意
?
0到1次
+
1次到任意次
{n}
n次
{m,n}
m到n次
{0,n}
0-n次
{,n}
0-n次
{m,}
最少m次
(lee){2}
lee字符串出现2次
练习脚本2:请显示系统中能被su命令切换的用户名称
思路是passwd文件中bash或者sh结尾的就是可以su切换的。
2、sed流编辑器
命令格式: sed 参数 命令 处理对象
(1)p
打印
sed -n 5p westos
显示第五行
sed -n 3,5p westos
显示3到5行
sed -n '3p;5p' westos
显示3和5行
sed -n 1,5p westos
显示1-5行
sed -n '5,$p' westos
显示5到最后一行
sed -n '/^root/p' westos
显示以root开头的行
(2)d
删除
sed 5d westos
删除第五行
sed '/^#/d' westos
把#开头的行删除
sed '/^UUID/!d' westos
除了UUID以外的行都删除
sed '5,$d' westos
删除5到最后一行
(3)a
添加(下方加)
sed '5a hello world' westos
第五行添加hello word
sed '5a hello\nworld' westos
第五行添加hello 换行word
sed '/^#/a hello world' westos
以#开头的行添加hello word
(4)c
替换
sed '/^#/c hello world' westos
把以#开头的行替换成hello world
sed '5chello world' westos
把第五行替换成hello world
(5)w
把符合的行写到指定文件中
sed '/^UUID/w westofile' westos
把westos中UUID开头的行写入westosfile中
(6)i
插入(上面加)
sed '5ihello westos' westos
第五行插入hello westos
(7)r
整合文件
sed '5r haha' westos
把haha这个文件整合到westos文件的第五行
sed -i '5r haha' westos
把处理过后的结果保存到原文件中
sed '=' passwd
表示加行号,但是是另外的一行
sed '=' passwd | sed 's/\n//g'
表示把换行符换为空,但是他是一行一行读取的,没法识别
sed '=' passwd | sed 'N;s/\n//g'
提前加载下一行,就可以成功替换
sed '=' passwd | sed 'N;s/\n//g' > westos
导出到westos文件
sed 'G' westos
表示每行后面空一行
sed '$G' westos
表示最后一行后面空一行
sed '$!G' westos
表示除了最后一行其他行后面空一行
sed字符替换:
(1)sed 's/:/###/g' westos
全文冒号替换为###
(2)sed 's/:/###/' westos
全文的每行第一次出现的冒号替换为###
(3)sed '1,5s/:/###/g' westos
1到5行冒号替换为###
(4)sed '1s/:/###/g' westos
第1行冒号替换为###
(5)sed '1s/:/###/g;5s/:/###/g' westos
第1行和第5行冒号替换为###
(6)sed '/lp/,/shutdown/s/:/###/g' westos
从lp到shutdown的冒号替换为###
(7)sed 's/\//###/g' westos
全文的/替换为###
(8)sed 's@/@###@g' westos
全文的/替换为###
如果要替换的字符是特殊字符,如/
,前面要加转译字符\
,即\/
。或者sed 's@/@%%%%%@g' westos
练习脚本3:假设selinux为关闭状态,Apache_port.sh此脚本后没有接入数字,提示‘请输入端口号’;如果后面的数字被占用了,提示‘该端口已被占用’;如果该端口没被占用,就把apache的端口修改为该数字。
效果如下图
3、报告生成器awk
awk -F 分隔符 BEGIN{ }{ }END{ } FILENAME
(1)westos
westos变量值
(2)“westos”
westos字符串
(3)/条件1|条件2/
条件1或者条件2
(4)/条件1/||/条件2/
条件1或者条件2
(5)/条件1/&&/条件2/
条件1并且条件2
(6)$0
所有的列
(7)$1
第一列
(8)$2
第二列
练习脚本4:统计在系统中能su切换的并且用户家目录不在/home下的用户数量
思路:第一步awk -F : '/bash$|sh$/&&$6!~/home/{print $1}' /etc/passwd
以冒号为分隔符的前提下,显示/etc/passwd中,bash或者sh结尾的并且第六列中没有home关键词的这行的第一列;第二步awk -F : 'BEGIN{N=0}/bash$|sh$/&&$6!~/^\/home/{N++}END{print N}' /etc/passwd
以冒号为分隔符的前提下,统计/etc/passwd中,bash或者sh结尾的并且第六列中没有以/home开头的行数。
练习脚本5:统计进程中的内存使用量的总和
思路:第一步ps ax -o %mem | awk 'BEGIN{N=0}{N+=$1}END{print N}'
列出所有进程的内存,刚开始令N为0,过程中连加,最后输出N值;第二步ps ax -o %mem | awk 'BEGIN{N=0}!/%MEM|0.0/{N+=$1}END{print N}'
为了优化,把%MEM和0.0的行忽略不计,会加速。