博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则 (grep、sed、awk)
阅读量:5730 次
发布时间:2019-06-18

本文共 19346 字,大约阅读时间需要 64 分钟。

hot3.png

正则

一、grep、egrep工具的使用

1.1 grep的用法

概念:它使用单个字符串来描述或匹配一系列符合某个句法则规则的字符串; 正则表示式通常用来检索和替换那些符合某个模式的文本内容。 无论是查找某个文档,还是查询某个日志文件并分析其内容,都会用正则表示式。 正则就是一串有规则的字符串; 掌握好正则对于编写shell脚本有很大帮助; 各种变成语言中都有正则,原理是一样的。 命令格式:grep [-cinvrABC] 'word' filename 常用选项如下:

  • -c 表示打印符合要求的行数;
  • -i 表示忽略大小写;
  • -n 表示输出符合要求的行及其行号;
  • -v 表示打印不符合要求的号;
  • -r 遍历所有的子目录
  • -A 后面跟一个数字,例如-A2表示打印符合要求的行及下面的两行;
  • -B 后面跟一个数字,例如-B2表示打印符合要求的行及上面的两行;
  • -C 后面跟一个数字,例如-C2表示打印符合要求的行及上下各两行。
  • gerp不带选项:grep 'nologin' passwd

输入图片说明

为什么显示红色,那是因为系统自定义别名

[root@ying01 grep]# which grepalias grep='grep --color=auto'    /usr/bin/grep
  • grep -c 查看符合要求的行数
[root@ying01 grep]# grep -c 'nologin' passwd 17
  • grep -n 显示行
[root@ying01 grep]# grep -n 'nologin' passwd          //包含nologin的行2:bin:x:1:1:bin:/bin:/sbin/nologin3:daemon:x:2:2:daemon:/sbin:/sbin/nologin4:adm:x:3:4:adm:/var/adm:/sbin/nologin5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10:operator:x:11:0:operator:/root:/sbin/nologin11:games:x:12:100:games:/usr/games:/sbin/nologin12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin13:nobody:x:99:99:Nobody:/:/sbin/nologin14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin15:dbus:x:81:81:System message bus:/:/sbin/nologin16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin24:user5:x:1006:1008::/home/ying111:/sbin/nologin26:user7:x:1050:1007::/home/xxx:/sbin/nologin
  • grep -i 不区分大小写显示出来
[root@ying01 grep]# grep -ni 'nologin' passwd 2:bin:x:1:1:bin:/bin:/sbin/nologin3:daemon:x:2:2:daemon:/sbin:/sbin/NOlogin                 //大写的NOlogin4:adm:x:3:4:adm:/var/adm:/sbin/nologin5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10:operator:x:11:0:operator:/root:/sbin/nologin11:games:x:12:100:games:/usr/games:/sbin/nologin12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin13:nobody:x:99:99:Nobody:/:/sbin/nologin14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin15:dbus:x:81:81:System message bus:/:/sbin/nologin16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin24:user5:x:1006:1008::/home/ying111:/sbin/nologin26:user7:x:1050:1007::/home/xxx:/sbin/nologin
  • grep -v取反
[root@ying01 grep]# grep -vni 'nologin' passwd     //除了nologin的显示出来1:root:x:0:0:root:/root:/bin/bash                            6:sync:x:5:0:sync:/sbin:/bin/sync7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown8:halt:x:7:0:halt:/sbin:/sbin/halt20:user1:x:1000:1020::/home/user1:/bin/bash21:nba:x:1001:1002::/home/nba:/bin/bash22:user3:x:1002:1009::/home/user3:/bin/bash23:user4:x:1004:1008::/home/user4:/bin/bash25:user6:x:1007:1007::/home/user6:/bin/bash27:user8:x:1051:1051::/home/user8:/bin/bash28:user10:x:1052:2000::/home/user10:/bin/bash29:user11:x:1053:2000::/home/user11:/bin/bash30:user12:x:1054:1054::/home/user12:/bin/bash31:user13:x:1055:1055::/home/user13:/bin/bash32:user14:x:1056:2010::/home/user14:/bin/bash33:user15:x:1057:1057::/home/user15:/bin/bash34:user17:x:1058:2020::/home/user17:/bin/bash35:user18:x:1059:1059::/home/user18:/bin/bash
  • grep -r 遍历所有的子目录
[root@ying01 grep]# grep 'root' /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin[root@ying01 grep]# grep -r 'root' /etc/ > /tmp/grep.log     //把找到的有关root的内容都写入到grep.log[root@ying01 grep]# grep passwd /tmp/grep.log                //在这里面过滤到passwd有关内容/etc/passwd:root:x:0:0:root:/root:/bin/bash/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin/etc/passwd-:root:x:0:0:root:/root:/bin/bash/etc/passwd-:operator:x:11:0:operator:/root:/sbin/nologin/etc/postfix/main.cf:# the system passwd file in the chroot jail is just not practical.
  • grep -A2 会把包含root的行以及这行下面的两行打印出来
[root@ying01 grep]# grep -A2 'root' passwd               root:x:0:0:root:/root:/bin/bash                       //有root的行bin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/NOlogin--operator:x:11:0:operator:/root:/sbin/nologin          //有toot行games:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin[root@ying01 grep]# grep -nA2 'root' passwd           //显示行号-n                  1:root:x:0:0:root:/root:/bin/bash2-bin:x:1:1:bin:/bin:/sbin/nologin3-daemon:x:2:2:daemon:/sbin:/sbin/NOlogin--10:operator:x:11:0:operator:/root:/sbin/nologin11-games:x:12:100:games:/usr/games:/sbin/nologin12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  • grep -B2 会把包含root的行以及这行上面的两行打印出来
[root@ying01 grep]# grep -nB2 'root' passwd1:root:x:0:0:root:/root:/bin/bash                       //root在第一行,所以上面就没有内容--8-halt:x:7:0:halt:/sbin:/sbin/halt9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10:operator:x:11:0:operator:/root:/sbin/nologin         //有root行,输出了上面2行
  • grep -C2 会把包含root的行以及这行上下各两行打印出来
[root@ying01 grep]# grep -nC2 'root' passwd1:root:x:0:0:root:/root:/bin/bash2-bin:x:1:1:bin:/bin:/sbin/nologin3-daemon:x:2:2:daemon:/sbin:/sbin/NOlogin--8-halt:x:7:0:halt:/sbin:/sbin/halt9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin10:operator:x:11:0:operator:/root:/sbin/nologin          //此行有root,上下都有2行输出11-games:x:12:100:games:/usr/games:/sbin/nologin12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

1.2 grep正则表达式具体用法

grep中特殊符号释义

符号 释义
. 表示任意一个字符
* 表示*之前零个或者多个字符
{} 表示一个范围
+ 表示匹配一个或多个+前面的字符
? 表示零个或多个任意字符
表示或者
  • 先用cat -n 查看inittab文件
[root@ying01 grep]# cat -n inittab      1    # inittab is no longer used when using systemd.     2    111111112233kdkkdkdkd     3    12345678999999999     4    55iqwyqwyiwqunxzcbzbc     5    # multi-user.target: analogous to runlevel 3     6    #graphical.target: analogous to runlevel 5     7    #     8    %%%To view current default target, run:     9    # systemctl get-default    10    adjkawkask###ladkla54    11    88888555558888888888    12    &&systemctl set-default TARGET.target    13    iahdiwajdiwd65sa5d4s    14    kasnjkasjdksj    15      sdsadsa    16    iiiinsklk#lafjask#
  • 注意 ^的用法

^# 以#开头;

[root@ying01 grep]# grep -n '^#' inittab1:# inittab is no longer used when using systemd.5:# multi-user.target: analogous to runlevel 36:#graphical.target: analogous to runlevel 57:#9:# systemctl get-default

[^#] 除#号开头的行

[root@ying01 grep]# grep -n '[^#]' inittab1:# inittab is no longer used when using systemd.2:111111112233kdkkdkdkd3:123456789999999994:55iqwyqwyiwqunxzcbzbc5:# multi-user.target: analogous to runlevel 36:#graphical.target: analogous to runlevel 58:%%%To view current default target, run:9:# systemctl get-default10:adjkawkask###ladkla5411:8888855555888888888812:&&systemctl set-default TARGET.target13:iahdiwajdiwd65sa5d4s14:kasnjkasjdksj15:  sdsadsa16:iiiinsklk#lafjask#

^[^0-9] 不是以数字开头

[root@ying01 grep]# grep -nv '^[^0-9]' inittab2:111111112233kdkkdkdkd3:123456789999999994:55iqwyqwyiwqunxzcbzbc11:88888555558888888888

[^0-9] 不是数字的行

[root@ying01 grep]# grep -nv '[^0-9]' inittab3:1234567899999999911:88888555558888888888
  • **点. **如"r.o" :表示任意一个字符
[root@ying01 grep]# touch 12.txt[root@ying01 grep]# vi 12.txt[root@ying01 grep]# cat 12.txt hdashdadadriooodskadnroooorooor>ooor
>>>>oooooroommnnvrnnnvooorrrnnnoooohooooomerooffffrrrrrrmmmmmmooooffffr.dddddr....oooorrr.eer*kdksooor*ojnc122

输入图片说明

  • 星号* 星号前面对象可以有0个或者多个重复的
  • 如"r*o" :0个或者多个r; 表现为:rrrro或者 ro或者o,r的数量可以为0~任意
  • 如''o*r': 0个或者多个o; 表现为:ooooor或者 or或者r,o的数量可以为0~任意
  • 如"r*": 0个或者多个r; 表现为:rrrrrr或者 rr或者r,r的数量可以为0~任意

输入图片说明

输入图片说明

  • 组合".*" 代表全部字符
[root@ying01 grep]# grep -n '.*' 12.txt 1:hdashdadadriooodskadnroooorooor>ooor
>>>>oooooroommnnvrnnnvooorrrnnnoooo4:hooooomerooffffrrrrrrmmmmmmooooffff5:r.dddddr....oooorrr.eer*kdksooor*ojnc122[root@ying01 grep]# grep -n 'ho.*ff' 12.txt 4:hooooomerooffffrrrrrrmmmmmmooooffff
  • +表示匹配1个或者多个+前面的字符;
  • +前面必须要有1个,而*可以匹配0个,所以两者输出就不一样了;观察下图
  • 注意:\ + 就是 + 的意思,它加\,就是为了转义;后面我们用egrep

输入图片说明

  • 问号? :过滤出零个或者一个指定的字符;如:o?r 表现为: or、r、orrr等

输入图片说明

1.3 egrep用法

用grep进行正则表达式时候需要为一些符号脱义,就需要添加脱义字符\;或者用grep -E选项;而egrep可以完美表达;

  • 为了表达"0{2}"的本意,对比三种用法;

输入图片说明

  • 之前+的用法,直接用egrep ;

输入图片说明

  • 符号| :表示或者的意思;可以添加多个|,匹配多个内容;

输入图片说明

二、sed工具的使用

sed介绍:sed工具主要是替换的文本输出到屏幕上,而且还有其他更丰富的功能。 sed命令格式:sed -n 'n' p filename,单引号内的n是一个数字,表示几行。 -n选项的作用就是只显示我们要打印的行,无关紧要的内容不显示。

2.1 sed基本用法 -n -e

  • -n 只显示我们需要查找的内容显示出来
[root@ying01 sed]# cp /etc/passwd 111.txt[root@ying01 sed]# ls111.txt [root@ying01 sed]# sed -n '/root/'p 111.txt root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin
  • 指定一个区间打印 'n,n+m'
[root@ying01 sed]# sed -n '2,6'p 111.txt bin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/sync
  • sed命令加上-e选项可以实现多个行为
[root@ying01 sed]# sed -e '1'p -e '/bus/'p -n 111.txt root:x:0:0:root:/root:/bin/bashdbus:x:81:81:System message bus:/:/sbin/nologin

2.2 字符串的删除

  • 删除某些行(并非删除)-d,把剩下的行数都显示出来;可以认为过滤掉
[root@ying01 sed]# sed '1,30'd 111.txt        //过滤掉1-30行,注意用逗号“,”user13:x:1055:1055::/home/user13:/bin/bashuser14:x:1056:2010::/home/user14:/bin/bashuser15:x:1057:1057::/home/user15:/bin/bashuser17:x:1058:2020::/home/user17:/bin/bashuser18:x:1059:1059::/home/user18:/bin/bash
  • sed真正删除选中的行数,是选项:-i
[root@ying01 sed]# cp 111.txt 112.txt[root@ying01 sed]# ls111.txt  112.txt  [root@ying01 sed]# wc -l 112.txt 35 112.txt[root@ying01 sed]# sed -i '1,32' 112.txt sed:-e 表达式 #1,字符 4:遗漏命令[root@ying01 sed]# sed -i '1,32'd 112.txt       //-i可以真正删除掉被过滤的行数[root@ying01 sed]# wc -l 112.txt 3 112.txt[root@ying01 sed]# sed -i '/user*/'d 112.txt    //删除和user有关的行[root@ying01 sed]# wc -l 112.txt 0 112.txt

2.3 字符串的替换

  • 替换字符或字符串,参数s表示替换的动作,g表示本行全局替换,如果不加g则只替换本行出现的一个,用法同vim
[root@ying01 sed]# sed '1,5s/oo/kmk/g' 111.txt |head    //替换1-5行的“oo”为“kmk”,rkmkt:x:0:0:rkmkt:/rkmkt:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spkmkl/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologin          //超过5行,此处不替换operator:x:11:0:operator:/root:/sbin/nologin
  • 也可以用表达式 + * . ?等特殊字符,因为需要转义,所以需要用-r选项
[root@ying01 sed]# sed -r '1,5s/ro+/r/g' 111.txt |headrt:x:0:0:rt:/rt:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin
  • 调整两个字符串的位置;比如:第一段和最后一段替换位置
[root@ying01 sed]# cat 111.txt |head -3root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin[root@ying01 sed]# head -3 111.txt | sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'/bin/bash:x:0:0:root:/root:root/sbin/nologin:x:1:1:bin:/bin:bin/sbin/nologin:x:2:2:daemon:/sbin:daemon
  • 另类替换,也可以看成删除;就是把要替换的内容,替换为空,即变相删除;
[root@ying01 sed]# head -3 111.txt |sed 's/[a-zA-Z]//g'   //把所有字母替换为空,斜杠前面没内容,即为空::0:0::/://::1:1::/://::2:2::/://
  • 给某一行前后增加指定内容;\1或在&都可以表示字符串前面.
[root@ying01 sed]# head -3 111.txt |sed -r 's/(.*)/AAA:\1/'       //.*所有的内容,这里\1就是指代前面的括号AAA:root:x:0:0:root:/root:/bin/bashAAA:bin:x:1:1:bin:/bin:/sbin/nologinAAA:daemon:x:2:2:daemon:/sbin:/sbin/nologin[root@ying01 sed]# head -3 111.txt |sed -r 's/(.*)/AAA:&/'        //&也可以,指代括号AAA:root:x:0:0:root:/root:/bin/bashAAA:bin:x:1:1:bin:/bin:/sbin/nologinAAA:daemon:x:2:2:daemon:/sbin:/sbin/nologin[root@ying01 sed]# head -3 111.txt |sed -r 's/(.*)/AAA:&:BBB/'    //前后添加内容AAA:root:x:0:0:root:/root:/bin/bash:BBBAAA:bin:x:1:1:bin:/bin:/sbin/nologin:BBBAAA:daemon:x:2:2:daemon:/sbin:/sbin/nologin:BBB

三、awk工具的使用

awk也是流行的编辑器,针对文档中的行来操作,一行一行的操作;awk具备sed的所有功能,而且更强大。

3.1 截取文档中的某个段落

命令:awk -F ':' '{print $1}' -F选项的作用是指定分隔符,如果不加-F选项,以空格或者tab为分隔符。 print为打印的动作,用来打印某个字段。$1为第一段,$2为第二段,$0表示整行。

[root@ying01 awk]# cp /etc/passwd  222.txt[root@ying01 awk]# ls222.txt [root@ying01 awk]# head -5 222.txt |awk -F ':' '{print $1}'          //打印出来第一段,分隔符为冒号rootbindaemonadmlp[root@ying01 awk]# head -5 222.txt |awk -F ':' '{print $0}'          //$0表示整行,所有root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • 可以自定义内容,但内容要加双引号
[root@ying01 awk]# head -5 222.txt |awk -F ':' '{print $1"#"$2"#"$3"@"$4"%"}'  //添加分割符号root#x#0@0%bin#x#1@1%daemon#x#2@2%adm#x#3@4%lp#x#4@7%

3.2 匹配字符或者字符串

[root@ying01 awk]# head  222.txt |awk '/oo/' root:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[root@ying01 awk]# head  222.txt |awk -F ':' '$1~/oo/' root:x:0:0:root:/root:/bin/bash
  • awk支持特殊字符+等,且不必和grep那样+E,sed +r;
[root@ying01 awk]# head  222.txt |awk -F ':' '$1~/o+/' root:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownoperator:x:11:0:operator:/root:/sbin/nologin
  • awk支持多个表达式,下例中awk匹配玩root,再匹配test,它还可以只打印所匹配的段
[root@ying01 awk]# head  222.txt |awk -F ':' '/root/ {print $1,$3} /bash/ {print $1,$3,$7}'root 0root 0 /bin/bashoperator 11[root@ying01 awk]#

3.3 条件操作符

awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字。

  • 精确匹配 ==
[root@ying01 awk]# awk -F ':' '$3=="0"' 222.txt    //第三段等于0的值;注意0有双引号,想想为什么root:x:0:0:root:/root:/bin/bash[root@ying01 awk]# awk -F ':' '$3==0' 222.txt      //没有加双引号root:x:0:0:root:/root:/bin/bash
  • 范围匹配 >=
[root@ying01 awk]# awk -F ':' '$3>=1050' 222.txt    //注意此时数字1050不能加引号user7:x:1050:1007::/home/xxx:/sbin/nologinuser8:x:1051:1051::/home/user8:/bin/bashuser10:x:1052:2000::/home/user10:/bin/bashuser11:x:1053:2000::/home/user11:/bin/bashuser12:x:1054:1054::/home/user12:/bin/bashuser13:x:1055:1055::/home/user13:/bin/bashuser14:x:1056:2010::/home/user14:/bin/bashuser15:x:1057:1057::/home/user15:/bin/bashuser17:x:1058:2020::/home/user17:/bin/bashuser18:x:1059:1059::/home/user18:/bin/bash[root@ying01 awk]# awk -F ':' '$3>="1050"' 222.txt |head -5     //加上引号,可以看出daemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  • 不匹配 !=
[root@ying01 awk]# [root@ying01 awk]# awk -F ':' '$7!="/sbin/nologin"' 222.txt root:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltuser1:x:1000:1020::/home/user1:/bin/bashnba:x:1001:1002::/home/nba:/bin/bashuser3:x:1002:1009::/home/user3:/bin/bashuser4:x:1004:1008::/home/user4:/bin/bashuser6:x:1007:1007::/home/user6:/bin/bashuser8:x:1051:1051::/home/user8:/bin/bashuser10:x:1052:2000::/home/user10:/bin/bashuser11:x:1053:2000::/home/user11:/bin/bashuser12:x:1054:1054::/home/user12:/bin/bashuser13:x:1055:1055::/home/user13:/bin/bashuser14:x:1056:2010::/home/user14:/bin/bashuser15:x:1057:1057::/home/user15:/bin/bashuser17:x:1058:2020::/home/user17:/bin/bashuser18:x:1059:1059::/home/user18:/bin/bash
  • $3<$4,$3==$4等进行比较
[root@ying01 awk]#  awk -F ':' '$3<$4' 222.txt |head -5adm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  • || 或者
[root@ying01 awk]# awk -F ':' '$3>100 || $7=="/sbin/nologin"' 222.txt |tail -5user13:x:1055:1055::/home/user13:/bin/bashuser14:x:1056:2010::/home/user14:/bin/bashuser15:x:1057:1057::/home/user15:/bin/bashuser17:x:1058:2020::/home/user17:/bin/bashuser18:x:1059:1059::/home/user18:/bin/bash
  • && 并且
[root@ying01 awk]# awk -F ':' '$3>100 && $7=="/sbin/nologin"' 222.txt |tail -5systemd-network:x:192:192:systemd Network Management:/:/sbin/nologinpolkitd:x:999:997:User for polkitd:/:/sbin/nologinchrony:x:998:996::/var/lib/chrony:/sbin/nologinuser5:x:1006:1008::/home/ying111:/sbin/nologinuser7:x:1050:1007::/home/xxx:/sbin/nologin

3.4 awk的内置变量

awk常用的变量有OFS,NF和NR,OFS和-F选项有类似的功能; 也是用来定义分隔符的,但是它实在输出的时候定义; NF表示用分割符分割后一共有多少段; NR表示行号。

  • OFS的用法如下,print打印时的分割符:
[root@ying01 awk]# awk -F ':' '{OFS="#"}  {print $1,$3,$6}' 222.txt |head -5  //#为分隔符root#0#/rootbin#1#/bindaemon#2#/sbinadm#3#/var/admlp#4#/var/spool/lpd[root@ying01 awk]# awk -F ':' '{OFS="%"}  {print $1,$3,$6}' 222.txt |head -5  //%为分隔符  root%0%/rootbin%1%/bindaemon%2%/sbinadm%3%/var/admlp%4%/var/spool/lpd
  • NF表示段
[root@ying01 awk]# awk -F ':' '{print NF":"$0}' 222.txt |head -57:root:x:0:0:root:/root:/bin/bash7:bin:x:1:1:bin:/bin:/sbin/nologin7:daemon:x:2:2:daemon:/sbin:/sbin/nologin7:adm:x:3:4:adm:/var/adm:/sbin/nologin7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin[root@ying01 awk]# awk -F '/' '{print NF":"$0}' 222.txt |head -5    //以/为分隔符的效果4:root:x:0:0:root:/root:/bin/bash4:bin:x:1:1:bin:/bin:/sbin/nologin4:daemon:x:2:2:daemon:/sbin:/sbin/nologin5:adm:x:3:4:adm:/var/adm:/sbin/nologin6:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • NR表示行
[root@ying01 awk]# awk -F ':' '{print NR":"$0}' 222.txt |head -51:root:x:0:0:root:/root:/bin/bash2:bin:x:1:1:bin:/bin:/sbin/nologin3:daemon:x:2:2:daemon:/sbin:/sbin/nologin4:adm:x:3:4:adm:/var/adm:/sbin/nologin5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  • NR也可以为表达式;<= 、== 、 <= 等
[root@ying01 awk]# awk -F ':' 'NR<=8' 222.txt   //行数小于等与8root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/halt[root@ying01 awk]# awk -F ':' 'NR==2' 222.txt    //第二行bin:x:1:1:bin:/bin:/sbin/nologin[root@ying01 awk]# awk -F ':' 'NR>=30' 222.txt   //大于等于30行user12:x:1054:1054::/home/user12:/bin/bashuser13:x:1055:1055::/home/user13:/bin/bashuser14:x:1056:2010::/home/user14:/bin/bashuser15:x:1057:1057::/home/user15:/bin/bashuser17:x:1058:2020::/home/user17:/bin/bashuser18:x:1059:1059::/home/user18:/bin/bash
  • 表示式共同作用
[root@ying01 awk]# awk -F ':' 'NR<=8 && $1~/root|sync/'  222.txt root:x:0:0:root:/root:/bin/bashsync:x:5:0:sync:/sbin:/bin/sync

3.5 awk 的数学运算

  • =与==的区别,一个是赋值,即更改某些段的数值或字符,==是一个是判断(类似C语言)
[root@ying01 awk]# awk -F ':' '$1=="root"' 222.txt                       //==作为判断root:x:0:0:root:/root:/bin/bash[root@ying01 awk]# awk -F ':' '$1="root"' 222.txt |head -5               //=为赋值root x 0 0 root /root /bin/bashroot x 1 1 bin /bin /sbin/nologinroot x 2 2 daemon /sbin /sbin/nologinroot x 3 4 adm /var/adm /sbin/nologinroot x 4 7 lp /var/spool/lpd /sbin/nologin[root@ying01 awk]# awk -F ':' '{OFS="#"}$1="root"' 222.txt |head -5      //之前分割符没有了,可以在赋值的同时,指定分隔符root#x#0#0#root#/root#/bin/bashroot#x#1#1#bin#/bin#/sbin/nologinroot#x#2#2#daemon#/sbin#/sbin/nologinroot#x#3#4#adm#/var/adm#/sbin/nologinroot#x#4#7#lp#/var/spool/lpd#/sbin/nologin
  • awk对各段的值进行数学运算
[root@ying01 awk]# head -n 5 222.txt |awk -F ':' '{$7=$3+$4;print $0}'root x 0 0 root /root 0bin x 1 1 bin /bin 2daemon x 2 2 daemon /sbin 4adm x 3 4 adm /var/adm 7lp x 4 7 lp /var/spool/lpd 11
  • awk计算某个段的总和;
[root@ying01 awk]# awk -F ':' '{(aa=aa+$3)}; END {print aa}' 222.txt 19170[root@ying01 awk]# awk -F ':' '{(aa=aa+$4)}; END {print aa}' 222.txt 23071

这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的。

转载于:https://my.oschina.net/u/3851633/blog/1823677

你可能感兴趣的文章
CCNA实验之:网络地址转换(NAT)实验
查看>>
SeeSite在win7下不能装载提示md:117的解决方法
查看>>
【转】Python 可视化神器-Plotly Express
查看>>
计算机网络原理笔记-停止等待协议
查看>>
topcoder srm 662 div1
查看>>
Java基础之静态变量
查看>>
更换好的yum源
查看>>
NET牛人应该知道些什么?
查看>>
[Asp.Net web api]基于自定义Filter的安全认证
查看>>
洛谷P3763 [TJOI2017]DNA(后缀自动机)
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
NYOJ32:组合数(DFS入门)
查看>>
使用Callable和Future接口创建线程
查看>>
BZOJ 2568 比特集合
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
MongoDB培训
查看>>
机器学习开源项目精选TOP30
查看>>
python基础===对字符串进行左右中对齐
查看>>
一起谈.NET技术,ASP.NET缓存全解析6:数据库缓存依赖
查看>>
ABAP程序互调用:SUBMIT、CALL TRANSACTION、LEAVE TO TRANSACTION
查看>>