第九章正则

9.1 正则介绍_grep上

9.2 grep中

9.3 grep下

9.4/9.5 sed

9.6/9.7 awk

9.8扩展

9.9课堂笔记

 

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
aaaaa
AAAA
AAA
aaaa
123
465
145
[root@xinlinux-02 ~]# grep -A2 "123" 1.txt
123
465
145
 
-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的增强版,可以识别特殊字符,不需要用脱义符"\"
 
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
sed  '1, 10'd 1.txt     #删除1.txt内第1到10行的内容后打印出来
sed  '/root/'d 1.txt    #删除所含root字符串所在行后打印出来
 
sed -r    #使特殊字符生效
 
 
加-i ,可直接删除查找行内容     (有些危险)
sed   -i   '1, 10'd 1.txt    #删除
 
sed替换(与vim的替换相似)
sed '1,10s/root/toor/g'   1.txt     
#将1.txt第一到十行内全局替换,root换成toor
 
sed -r  '1,10s/ro+/toor/g'   1.txt        
 
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,调换顺序就是调换位置
 
 

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(行号)
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值表示每次循环都会把第三段的值相加,即第一行的第三段加第二行的第三段,一直循环加下去,就是求和第三段所有列的和
 
 

9.8扩展

把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
把这里面的所有练习题做一下
 
 

9.9课堂笔记

一、ps:笔记修改
raid5:  没有单独盘作为校验盘,而是每块盘上有校验位;磁盘上的数据与该盘的校验数据分布在不同盘上
 
raid6:用了两个校验算法,假设两种校验数据为p和q,pq则分布在不同的两个数据盘上
 
 
二、|  与 ||   &与&&   (面试可能问到)
 
1、|  与 || 的区别
|   管道符,用于将上条命令的结果作为第二条命令执行的参数
||  (又称短路或)表示上条命令执行失败后才会执行第二条命令
 
2、&与&&的区别
&    不管第一条命令执行是否成功,都执行第二条命令
&& (短路与)    第一条命如果执行失败,则不执行第二条命令
 
 
三、grep
1、-A
ifconfig  |grep  -A 1 "ens33" | tail -1 |awk -f ' '   '{print $2}'                        #方便拿网卡ip地址
 
也可以定义网卡名称,在来过滤ip
a=ens33
ifconfig  |grep  -A 1 $a | tail -1 |awk -f ' '   '{print $2}'
 
2、grep  "过滤词"  文件名
 
3、-n   #显示行号
 
-i   #  过滤不区分大小写
 
-r       #寻遍当前目录所有子目录
grep -rn  "nologin" /etc/       #将/etc/目录下所有含有nologin的都过滤出来并显示行号
 
 
四、grep/egrep正则
#egrep使用( | 、 {} 、 +、  ?)这四种特殊字符不需要使用转义字符“\”
 
#" ^ " 
放到外面表示以什么什么开头,如果放到[]里,意味着是[]里的字符的反义、非意
 
“ . ”与“  ? ”的区别
1、" . " 表示任意一个字符,和前面的字符没有任何关系 (不能为0个字符),例:grep " r..t"  /etc/passwd
2、"?"表示前面的字符为0或1个   例:ro?t    可以表示rot   rt
 
" * "星号表示任意字符,以星号前面一个字符为标准,出现0-n次
 
" .* "表示零个或者多个字符,空行也包含在内
 
"{ }"大括号,让大括号前面的字符重复括号里面的次数
例:"o{2}"  重复出现2次o
        "o{1,3}"  重复出现1-3次o
grep -n "o\{2\}" /etc/passwd          #过滤出passwd里o出现2次的内容并显示行号
等同于
gerp -E -n "o{2}" /etc/passwd
等同于
egerp -n "o{2}" /etc/passwd
 
egrep "(oo){2}" /etc/passwd   #过滤oo出现2次的内容
 
 
五、sed( 主要用于替换
1、打印某行
sed -n  'n' p  filename      
#单引号内的n若是数字,表示第几行;若是区间,表示范围
sed -n '2'p   /etc/passwd
sed -n '1,3'p   /etc/passwd      #打印1-3行passwd的内容
 
sed -n  '/n/' p  filename 
# n若是字符串,要加双斜杠,表示所含该字符串的行   p表示打印
 
sed -n '2'p  /etc/passwd          #打印第二行
sed -n '2,5'p  /etc/passwd    #  打印第二行到第五行
sed -n '25,$'p  /etc/passwd   #打印第25行到结尾
sed -n '/root/'p  /etc/passwd   #打印root所在的行
 
sed -n '/^r/'p  /etc/passwd  #打印以r开头的内容
 
#用到嵌套时,单引号在里面,双引号在外面;其他情况单引号、双引号通用
例:"'hello',i am "
 
sed -r     # 加-r有特殊符号不用使用转义字符可以执行
 
sed -n  '/r*\+t/'p  /etc/passwd
相当于
sed -nr  '/r*+t/'p   /etc/passwd
 
sed -e  
 
sed -n  'n'Ip  filename   #p前面加大写的i,表示不区分大小写
sed -n '/root/'Ip  /etc/passwd
 
sed  -i   '7'd   /etc/passwd       #-i表示直接替换文本,d表示第几行
sed  -i   "n"   /etc/passwd     
 #n就是像vim一般模式替换字符进行的操作一样 ,1,$s/root/xin/g 
例: sed -i  "1,$s/root/xin/g" /etc/passwd     
 
将第一段和最后一段调换位置
sed -r ‘s/([^:]+):(.*):([^:]+)/\3:\2:\1/’
[^:]+ : 非冒号,一个或多个 1
:(.*): :贪婪匹配,一直匹配到最后一个冒号 2
[^:]+ :非冒号,一个或多个 3
前面用小括号()括起来的,后面用反斜杠\数字去表示
 
注意:
1、替换内容时,有/,需要用\
head passwd |sed 's/\/sbin\/nologin/123/g'
2、或者使用@、#等替换分隔符
head passwd |sed 's@/sbin/nologin@123@g'
 

 

sed 's/[a-zA-Z]//g    #把英文字母全部删除,相当于替换为空

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9.1 正则介绍_grep上
9.2 grep中
9.3 grep下
9.4/9.5 sed
9.6/9.7 awk
9.8扩展
9.9课堂笔记
 
 
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
aaaaa
AAAA
AAA
aaaa
123
465
145
[root@xinlinux-02 ~]# grep -A2 "123" 1.txt
123
465
145
 
-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的增强版,可以识别特殊字符,不需要用脱义符"\"
 
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
sed  '1, 10'd 1.txt     #删除1.txt内第1到10行的内容后打印出来
sed  '/root/'d 1.txt    #删除所含root字符串所在行后打印出来
 
sed -r    #使特殊字符生效
 
 
加-i ,可直接删除查找行内容     (有些危险)
sed   -i   '1, 10'd 1.txt    #删除
 
sed替换(与vim的替换相似)
sed '1,10s/root/toor/g'   1.txt     
#将1.txt第一到十行内全局替换,root换成toor
 
sed -r  '1,10s/ro+/toor/g'   1.txt        
 
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,调换顺序就是调换位置
 
 
 
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的行
 
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的行
 
5、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的行,将第一、第三、第四段输出并用"#"号隔开
 
6、内置变量NF(段数)、NR(行号)
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开始一直下去
 
7、赋值"="号,赋值后分隔符会消失
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,然后输出所有段
 
8、"=="等于号
head -n3 /etc/passwd |awk -F ':' '$1=="root" '
#匹配第一段为root的内容
 
9、求和第三段所有列的和     (tot表示求和,默认从0开始)
awk -F ':' '{(tot=tot+$3)}; END {print tot}'  /etc/passwd
# {(tot=tot+$3)} tot值表示每次循环都会把第三段的值相加,即第一行的第三段加第二行的第三段,一直循环加下去,就是求和第三段所有列的和
 
 
9.8扩展
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
把这里面的所有练习题做一下
 
 
9.9课堂笔记

 

转载于:https://www.cnblogs.com/Lucky-LGX/p/9512766.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值