9.1 正则介绍_grep上
9.2 grep中
9.3 grep下
9.4/9.5 sed
9.6/9.7 awk
9.8扩展
9.1 正则介绍_grep上
grep [-cinvABC] 'word' filename
-c 行数
[root@xinlinux-02 ~]# grep -c "login" /etc/passwd
17
-i 不区分大小写
[root@xinlinux-02 ~]# grep -n "a" 1.txt
1:aaaaaaaaaa
3:aaaaaaaaaa
[root@xinlinux-02 ~]# grep -ni "a" 1.txt
1:aaaaaaaaaa
2:AAAAAAAAAAAAAA
3:aaaaaaaaaa
4:AAAAAAAAAA
-n 显示行号
[root@xinlinux-02 ~]# grep -n "a" 1.txt
1:aaaaaaaaaa
3:aaaaaaaaaa
-v 取反
[root@xinlinux-02 ~]# grep -v "a" 1.txt
AAAAAAAAAAAAAA
AAAAAAAAAA
-A 后面跟数字,过滤出符合要求的行以及下面n行
[root@xinlinux-02 ~]# cat 1.txt
AAA
aaaa
123
465
145
[root@xinlinux-02 ~]# grep -A2 "123" 1.txt
123
465
145
ifconfig |grep -A 1 "ens33" | tail -1 |awk -F ' ' '{print $2}' #方便拿网卡ip地址
[root@xinlinux-02 ~]# ifconfig |grep -A 1 "ens33" | tail -1 |awk -F ' ' '{print $2}'
192.168.233.130
-B 后面跟数字,过滤出符合要求的行以及上面n行
[root@xinlinux-02 ~]# grep -B2 "123" 1.txt
AAA
aaaa
123
-C 后面跟数字,过滤出符合要求的行以及上下各n行
[root@xinlinux-02 ~]# grep -C2 "123" 1.txt
AAA
aaaa
123
465
145
-r 目录 遍历该目录下所有子目录
[root@xinlinux-02 ~]# grep "passwd" /etc/
grep: /etc/: 是一个目录
[root@xinlinux-02 ~]# grep -r "passwd" /etc/
/etc/login.defs:# passwd command) should therefore be configured elsewhere. Refer to
/etc/default/nss:# If set to TRUE, the passwd routines in the NIS NSS module will not
/etc/default/nss:# use the passwd.adjunct.byname tables to fill in the password data
9.2 grep中
###^在外面表示以什么开头,在方括号里面表示反义、非意
grep -n 'root' /etc/passwd
#/etc/passwd 找含有root的行并显示行号
grep -nv 'nologin' /etc/passwd
#取反,/etc/passwd 找含有不包含nologin的行并显示行号
grep '[0-9]' /etc/inittab
#/etc/inittab里面过滤出带数字的行
grep -v '[0-9]' /etc/inittab
#/etc/inittab里面过滤出不包含数字的行
grep -v '^#' /etc/inittab
#/etc/sos.conf里面过滤出不含注释符#的行
grep -v '^#' /etc/inittab |grep -v '^$' == grep -v '^#
| ^$' /etc/inittab
#/etc/inittab内过滤出非注释行和非空行
grep '^[^a-zA-Z]' test.txt
#过滤出以非字母开头的行
9.3 grep下
egrep为grep的增强版,可以识别特殊字符,不需要用脱义符"\"
“ . ”与“ ? ”的区别
1、" . "表示任意一个字符,和前面的字符没有任何关系 (不能为0个字符),例:grep " r..t" /etc/passwd
2、"?"表示前面的字符为0或1个 例:ro?t 可以表示rot rt
" * "星号表示任意字符,以星号前面一个字符为标准,出现0-n次
" .* "表示零个或者多个字符,空行也包含在内
grep 'r.o' test.txt
#" . "点表示任意一个字符,过滤出text.txt内含有r( )0的行;()表示任意一个字符
grep 'o*o' test.txt
# " * "代表(可为0)任意个*号前面的那个字符
grep '.*' test.txt
# " .* "表示匹配任意所有字符,包括空行
grep 'o\{2\}' /etc/passwd == egrep 'o{2}' /etc/passwd == grep -E 'o{2}' /etc/passwd
# " { } "花括号表示范围,过滤/etc/passwd内包含2个o的行
egrep 'o+' /etc/passwd
# " + "加号表示+号前字符出现1次或以上,过滤/etc/passwd内出现一次o以上的行
egrep 'oo?' /etc/passwd
# " ? "表示问号前一个字符出现0次或者1次,过滤/etc/passwd内含有oo、o的行
egrep ''root | nonlogin' /etc/passwd
#过滤出/etc/passwd内含有root或者nonogin的行
egrep '(oo){2}' /etc/passwd
#过滤/etc/passwd内出现2次oo的行
9.4/9.5 sed
#sed能实现grep的功能,但是麻烦,也不会显示颜色;所以sed主要用于替换
#sed也支持正则表达式,包括特殊字符
查找字符串
sed -n '/root/ 'p 1.txt
# ' ' 单引号里面如果是字符串的话需要加上双斜杠//
指定行
sed -n '2'p 1.txt #打印出1.txt的第二行
#' ' 单引号里面如果是数字的话,表示打印指定行,不需要加双斜杠
指定范围行
sed -n ' 2,6'p 1.txt #打印出1.txt的第二行到第六行
sed -n ' 2,$'p 1.txt #打印出1.txt的第二行到行尾
sed -n ' 1,$'p 1.txt #打印出1.txt的全文
-e表示在一条命令执行多个操作,相互不会影响
sed -e '1'p -e'/111/'p -n 1.txt
#打印1.txt第一行的同时打印含有字符串111的行
ps:如果多个命令间查找的结果相同,会重复打印出来
sed查找打印不区分大小写
#在p前面加一个大写的i,
sed -n '/root/ 'Ip 1.txt
#打印1.txt内不区分大小写的root字符串的行
sed删除并打印删除后的内容d(d只是删除屏幕不显示)
sed '1, 10'd 1.txt #删除1.txt内第1到10行的内容后打印出来
sed '/root/'d 1.txt #删除所含root字符串所在行后打印出来
sed -r #使特殊字符生效,不用使用转义字符
sed -n '/r*\+t/'p /etc/passwd
相当于
sed -nr '/r*+t/'p /etc/passwd
加-i ,表示直接替换文本 (-i删除是修改文件内容)
sed -i "1,$s/root/xin/g" /etc/passwd
#将全文的root替换成xin
sed -i '1, 10'd 1.txt #删除文档1.txt第一到十行的文本内容
sed替换(与vim的替换相似)
sed '1,10s/root/toor/g' 1.txt
#将1.txt第一到十行内全局替换,root换成toor
1、替换内容时,有/,需要用\
head passwd |sed 's/\/sbin\/nologin/123/g'
2、或者使用@、#等替换分隔符
head passwd |sed 's@/sbin/nologin@123@g'
sed 's/[a-zA-Z]//g #把英文字母全部删除,相当于替换为空
将第一段和最后一段调换位置
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’
([^:]+) 非冒号,一个或多个 1
:(.*): 贪婪匹配,一直匹配到最后一个冒号 2
([^:]+) 非冒号,一个或多个 3
#前面用小括号()括起来的,后面要用反斜杠\数字去表示
\3:\2:\1 将1,2,3分别代表([^:]+) 、:(.*): 、([^:]+),即\1:\2:\3,调换顺序就是调换位置
sed -r #插入字符 (常用)
sed -r ‘s/(.*)/aaa:&/’ #在所有行行首加上aaa
sed -r ‘s/(.*)/&:aaa/’ #在所有行行尾加上aaa
sed -r ‘1s/(.*)/aaa:&/’ #在行首加入aaa
sed -r ‘1,5s/(.*)/aaa:&/ 在第1到5行加入aaa
#s前写入数字或者范围就是具体数加的位置
sed -r 's/(.*)/#&/' 1.txt 给1.txt所有行首加一个#
sed追加(行后):a\命令
将this is a test line 追加到以test开头的行后面
sed '/^test/a\this is a test line ' file
在 1.txt文件第二行之后插入this is a test line :
sed -i '2a\this is a test line' 1.txt
sed插入(行前):i\命令
将this is a test line 追加到以test开头的行前面
sed '/^test/i\this is a test line ' file
在 1.txt文件第五行之前插入this is a test line :
sed -i '5i\this is a test line' 1.txt
9.6/9.7 awk
#支持分段,可以针对段做匹配,支持正则表达式(也支持特殊符号,不需要加脱义字符"/")
#若是不-F指定分隔符,会默认空格或者空字符为分隔符
1、
awk -F ':' '{print $1}' 1.txt
#选取1.txt通过awk用":"冒号分段,取$1第一段内容
awk -F ':' '{print $1,$3,$4}' 1.txt
#取$1、$3、$4第一段、第三段、第四段内容
awk -F ':' '{print $0}' 1.txt
#$0取所有段的内容
awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
#手动添加分隔符
2、awk匹配功能
awk '/oo/' 1.txt
#将含有oo字符串的匹配出来
awk -F ':' '$1~/oo/'1.txt
#将第一段含有oo字符串的匹配出来
3、awk支持多个表达式一起写
awk -F ':' '/root/ {print $1,$3} /user/ {print $3,$4}' 1.txt
#将含有root的行打印第一段和第三段内容,同时将含有user的行打印第三段和第四段内容
4、awk数学运算表达式
awk -F ':' '$3==1000' /etc/passwd
#匹配第三段等于1000的行
awk -F ':' '$3==''1000''' /etc/passwd
#匹配第三段等于通过ascii配对1000获得值的行
#针对数字的不要加双引号,加了双引号系统会通过ASCII码进行匹配
awk -F ':' '$3==1000 {print $1}' /etc/passwd
#匹配第三段等于1000的行列出第一段
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
#" != "表示不等于; 匹配第七行不等于/sbin/nologin的行
5、awk字段间比较
awk -F ':' '$3>$4' /wtc/passwd
#匹配第三段大于第四段的行
awk -F ':' '$3==$4' /wtc/passwd
#匹配第三段等于第四段的行
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
#匹配第三段大于5且小于7的行
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
#匹配第三段大于1000或者第七段等于/bin/bash的行
6、OFS内置变量
awk -F ':' '{OFS="#"} 匹配条件 {print $1,$3,$4}' /etc/passwd
#将匹配到的第一、三、四段的内容用"#"号分隔符分隔
#{OFS="#"},OFS:内置变量,表示指定print时用到的分隔符
#两个花括号之间写匹配的条件
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$3,$4}}' /etc/passwd
#匹配第三段内容大于1000的行,将第一、第三、第四段输出并用"#"号隔开
7、内置变量NF(段数)、NR(行号)
$NF #最后一段的内容
$NR #第几行的第几列,比如第一行第一列,第二行第二列
$0 #表示整行
awk -F ':' '{print NF}'
#将段数显示出来
awk -F ':' '{print NF":"$0}' /etc/passwd
#将所有段的段数显示出来
awk -F ':' '{print NR}'
#将行号显示出来
awk -F ':' '{print NR":"$0}' /etc/passwd
#将所有段的行号显示出来
awk 'NR>40' /etc/passwd
#把从第41行开始的行显示出来
awk -F ':' 'NR<20 && $1~/roo/' /etc/passwd
#把行号小于20行且第一段为roo的匹配出来
awk -F ':' '{print $NR":"$NF}' /etc/passwd
#passwd一共只有7段, 所以$NF=$7;$NR则是从$1开始一直下去
8、赋值"="号,赋值后分隔符会消失
head -n3 /etc/passwd |awk -F ':' '$1="root" '
#将passwd的第一段内容赋值为root
head -n3 /etc/passwd |awk -F ':' {OFS=":"} '$1="root" '
#将赋值后的内容定义分隔符为":"冒号
awk -F ':' '{if ($1="root") {print $0}}' /etc/passwd
#将passwd的第一段内容赋值为root,然后输出所有段
9、"=="等于号
head -n3 /etc/passwd |awk -F ':' '$1=="root" '
#匹配第一段为root的内容
10、求和第三段所有列的和 (tot表示求和,默认从0开始)
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
#{(tot=tot+$3)}:tot值表示每次循环都会把第三段的值相加,即第一行的第三段加第二行的第三段,一直循环加下去,就是求和第三段所有列的和
11、以指定分隔符分隔的两种方法
1、在print内段间插入"分隔符"
awk -F ':'{print $1"#"$2"#"$3"#"$4"#"$5} 1.txt #以#做分隔符
2、通过内置变量OFS
awk -F ':' '{OFS="#"} {print $1,$2,$3,$4,$5} 1.txt #以#做分隔符
加上双引号”“之后,相当于sort不加-n。就代表1000不再是数字,而是一个字符串,是以ASSIC码计算的。
9.8扩展
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/