9.1 正则介绍 grep(上)
1)正则解释
正则就是一串有规律的字符串;
grep 过滤关键词
< mkdir /grep/ >
< cp /etc/passwd /root/grep/ >
< grep 'nologin' passwd > 过滤nologin 自动标红了
< grep -c 'nologin' passwd > 显示行数
<grep -n 'nologin' passwd > 显示行号
< grep -ni 'nologin' passwd > 不区分大小写
< grep -v 'nologin' passwd > 除了nologin 的都过滤出来
<grep -r 'root' /etc/ > /遍历目录下所有包括子目录/孙目录的文件都列出来
<grep -nA2 'root' passwd > 把找到的root行列出来包括其下面的2行
<grep -nB2 'root' passwd > 把找到的root行列出来包括其上面的2行
<grep -nC2 'root' passwd > 把找到的root行列出来包括其上面和下面2行
9.2 正则 grep(中)
不要改系统下/etc/下的配置文件,否者可能系统出错,可以拷贝出来后修改备份文件。
<grep ‘[0-9]’ passwd > 包含0-9的任意数字的都列出来
<grep -n '^#' /etc/inittab >^ 以#开头的行
<grep -n '[^0-9]' /etc/inittab > 非0-9
[^] 在括号内取反
例如 [^0-9] 那就是非数字(包括字母+特殊符号)
例如[^a-zA-Z] 那就是非字母(包括数字+特殊符号)
例如[^0-9a-zA-Z]那就是非数字字幕(特殊符号)
<grep -n ' ^[^0-9]' /etc/inittab > 以一个非数字的字符开头的行
9.3 正则 grep(下)
<grep 'r.o' passwd> 点.匹配任意的一个字符
<grep 'oo' passwd> 星 匹配任意N个字符
<grep '.' passwd> 点星 . 任意一个任意字符
<grep 'o{2}' passwd> o出现两次 == <egrep 'o{2}' passwd> == <grep -E 'o{2}' passwd>
<grep 'o{0,3}' passwd> o出现0-3次
<egrep '(oo){2}' passwd> oo出现两次
<grep 'o+o' passwd> +加号表示前面o的1次或者N次=<egrep 'o+o' passwd>
<egrep 'o?t' passwd> ?前面o没有或者有一次
<egrep 'root|nologin' passwd> | 或者
==============================================================
9.4 sed(上)
sed 强项在于替换,替换指定字符。
(1)匹配
< sed '/root/'p test.txt > p 打印
会把匹配的信息打出来后,再把所有内容打印出来;若未匹配只打印所有内容。
< sed -n '/root/'p test.txt > -n 只打印匹配的信息
也支持 < sed -n '/r.t/'p test.txt >
< sed -n '/r*t/'p test.txt >
< sed -n '/o+t/'p test.txt > 需要脱义== < sed -nr '/o+t/'p test.txt > 不脱义
<sed -nr '/o{2}/'p test.txt> 匹配2个o
<sed -nr '/root|bush/'p test.txt>匹配或
(2)打印
<sed -n '2'p test.txt> 打印第2行
<sed -n '2,5'p test.txt> 打印2-5行
<sed -n '25,$'p test.txt>打印25行之后的内容
<sed -n '1,$'p test.txt>打印全部
![](http://i2.51cto.com/images/blog/201801/22/780c9839ea3db14f59235b6418864a08.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) (3) 多个操作时
<sed -e '1'p -e '/bus/'p -n test.txt> 打印第1行 并匹配bus,若两个操作相同会输出两次
9.5 sed(下)
(1) p打印 d删除
<sed -n '/bus/'p test.txt> 只匹配小写的
<sed -n '/bus/'Ip test.txt> +I 大写i,匹配大小写
< wc -l test.txt> 查看总行数
< sed '1,45'd test.txt>删除1-45行,实际上是排除掉 并不会真修改文件
< sed -i '1,45'd test.txt>删除1-45行,文件内容也被删除 -i
< sed -i '/user2/'d test.txt>> 删掉包含user2的行
(2)替换
<sed '1,10s/root/toor/g' test.txt>1-10行 root替换为toor
<sed '1,10s/ro+/r/g' test.txt |head > 将前10行ro+替换为r并用head查看
<head test.txt | sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'> 将第一个:和最后一个:调换
<head test.txt | sed -r 's/[a-zA-Z]//g'> 将英文字母全部删除掉
<head test.txt | sed -r 's/(.*)/aaa:&/'> 所有行前+aaa字符
如果sed的表达式里面有了特殊符号,就要用上,否则你就得加\
grep 的-r和这个sed不是一个意思。
==============================================================
9.6 awk(上)
支持分段打印 ,若未指定分隔符,默认以空格和空白字符打印。
(1)打印段
<awk -F ':' '{print $1}' test.txt> 打印以:分割的第一段
<awk '{print $0}' test.txt> 打印所有段 ==cat指令
< awk '{print $1}' 1.txt> 不指定分隔符按默认
< awk '{print $2,$1}' 1.txt> 打印 列2和列1
<awk '{print $1"##"$3}' 1.txt > 打印第1和3列并输出分割
<awk '/oo/' test.txt > 输出包含oo的列
<awk -F ':' '$1 ~ /oo/' test.txt> 输出第一段包含oo的列 ~匹配
也支持 且不需要使用脱义字符 \
<awk -F ':' '$1 ~ /o+/' test.txt>
<awk -F ':' '/root/ {print $1,$3} /user/ {print $3,$4}' test.txt>
若匹配root打印1和3段,匹配user打印3和4段
<egrep 'root|user' test.txt>
<awk -F ':' '/root|user/ {print $0}' test.txt>
<awk -F ':' $3==0 '{print $0}' test.txt> ==<awk -F ':' $3==0' test.txt> 默认&0 第3段
<awk -F ':' $3>=1000 '{print $0}' test.txt> !=<awk -F ':' $3>="1000" '{print $0}' test.txt>
加双引号是按ascill计算的
加上双引号后按普通的字符处理,不是数字了, 那么比较大小就是按 ASCII码来。
不加就是按常规数字,给你举一个例子:
常规数字 10>5
但按字符, 10<5 ,因为它排序的时候是一位一位的比较大小,10和5比较,实际上是1和5比较。
<awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt> 第7段不等于
==============================================================
9.7 awk(下)
<awk -F ':' '$3<$4' test.txt> 段3小于段4的行
<awk -F ':' '$3>"5" && $3<"7" ' test.txt> 并且
<awk -F ':' '$3>1000 || $7=="/sbin/nologin" ' test.txt> 或
< awk -F ':' '{OFS="#"} {if($3>1000) print( $1,$3,$7)}' test.txt> 指定分隔符OFS
NR 行 NF 段
< awk -F ':' ' {print( NR":" $0)}' test.txt> 增加行号NR
< awk -F ':' ' {print( NF":" $0)}' test.txt> 增加段号NF
< awk -F ':' 'NR<=10 && $1~/root|sync/' test.txt> 打印前10行包函root或sync
< awk -F ':' '{print $NR ":"$NF}' test.txt> 加$代表通配打印1-7,2-7……N-7,后面不存在就为空
awk 是按行处理文件的,每一行都有awk内置变量:NF,NR
NF:是按给定的分隔符,分出来总的段数, 所有$NF,指最后一段。
NR:是当前行的行号。$NR,表示 第N行的第N段。
老师的示例中,每行有7段,所以,前面7行,第一列,分别显示当前行的段。如第一行显示第一段,第二行显示 第二段,第三行显示 第三段。。。。
< awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt> 将所有第3段求和此处的for省略掉了