linux正则表达式
linux正则表达式grep和egrep正则表达式:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep,sed, awk,这三个都是针对文本的行才操作的。 grep 过滤器语法: grep [-cinvABC]'word'filename -n 显示行号-c count统计符合要求的行数-v 取反,不包含所选字符的-i 不区分大小写-r 会把目录下面所有的文件遍历例如: grep -r 'root' ./-A 后面跟数字,A2表示打印符合要求的行及下面二行-B 后面跟数字,B2表示打印符合要求的行及上面二行-C 后面跟数字,C2表示打印符合要求的行及上下各二行^ 行首,开头$ 行尾,结尾空行用 ^$ 表示 可以做一个别名alias grep="grep --color" 写入到.bashrc里面;以后输入grep命令时查找的关键字符会颜色显示,方便区分。过滤带有某个关键词的行并输出行号,颜色显示关键词# grep -n --color 'root' passwd 1:root:x:0:0:root:/root:/bin/bash11:operator:x:11:0:operator:/root:/sbin/nologin# grep -o --color 'root' passwd | wc -l4加-o 统计包含关键词的个数;过滤不带有某个关键词的行,并输出行号;# grep -nv 'nologin' /etc/passwd1:root:x:0:0:root:/root:/bin/bash6: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:600:501::/home/user1:/bin/bash23:mysql:x:27:27:MySQLServer:/var/lib/mysql:/bin/bash 过滤以nologin结尾的,系统禁止登陆的所有用户;# grep 'nologin$' /etc/passwdbin: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/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 示例,打印关键字halt所在行的A2 B2 C2# grep -A2 'halt' passwd halt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin# grep -B2 'halt' passwd sync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/halt# grep -C2 'halt' passwd sync: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/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin把所有以#号开头的行去除# grep -v '^#' /etc/inittab id:3:initdefault:去除所有空行和以#号开头的行# grep -v '^#' /etc/crontab |grep -v '^$'SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/示例说明,打印数字或字母开头,及不是字母和数字开头的;# cat test.txt helloworldabcabc11111#differt1234567899123def代表任意一个数字,整个命令意思筛选出包含任意一个数字的行;# grep '' test.txt abc111111234567899123def[^0-9]代表除0-9之外的任意一个字符,整个命令的意思是筛选出不包含数字的行,只要这一行中含有非数字即可,(即不全是数字)# grep '[^0-9]' test.txt helloworldabcabc11111#differt123def^[^0-9]代表不是数字开头的;# grep '^[^0-9]' test.txt helloworldabcabc11111#differt代表任意一个英文字母;# grep '' test.txt helloworldabcabc11111#differt123def[^a-z]代表除英文字母以外的;# grep '[^a-z]' test.txt abc11111#differt1234567899123def^[^a-z]代表不是英文字母开头的文本;# grep '^[^a-z]' test.txt #differt1234567899123def[ ] 如果是数字的话就用这样的形式,当然有时候也可以用这样的形式即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写。另外[]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。过滤任意一个字符与重复字符# grep 'h..t' /etc/passwdhalt:x:7:0:halt:/sbin:/sbin/halt'.'点表示任意的一个字符,上面例子为把符合h与t之间有2个任意字符的行过滤出来。'*'代表零个或多个任意的字符'ooo*'代表oo,ooo,oooo 或者更多的o# grep 'ooo*' /etc/passwdroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin'.*'表示零个或多个任意字符,等于所有的,空行也包含在内。# grep '.*' /etc/passwd |wc -l24# wc -l /etc/passwd24 /etc/passwd指定要过滤字符出现的次数{ }内部为数字,表示前面字符要重复的次数。表示两个O即包含OO的行。{ }左右都需要加脱意字符\ grep -E 代表增强版的grep即egrep,使用egrep不需要脱意;# grep 'o\{2\}' /etc/passwdroot:x:0:0:root:/root:/bin/bashlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin# grep -E 'o{2}'passwd # egrep 'o{2}' passwd# cat test.txt root:hotabcdespooolspoolspolspl示例,过滤字母o出现1到3次的行# grep 'o\{1,3\}' test.txt root:hotspooolspoolspol{ } 还可以表示一个范围,格式为{n1,n2} n1<n2表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。egrep为grep的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。grep -E = egrep1、筛选一个或一个以上前面的字符 字符后面使用+# cat test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# egrep 'o+' test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash# egrep 'oo+' test.txt root:x:0:0:root:/root:/bin/bashrooooot:x:0:0/roooooot:/bin/bash# egrep 'ooo+' test.txt rooooot:x:0:0/roooooot:/bin/bash2、筛选零个或一个前面的字符 字符后面使用?# egrep 'o?' test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# egrep 'oo?' test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash# egrep 'ooo?' test.txt root:x:0:0:root:/root:/bin/bashrooooot:x:0:0/roooooot:/bin/bash# egrep 'oooo?' test.txt rooooot:x:0:0/roooooot:/bin/bash3、筛选字符串1或字符串2包含里面任意一个字符串的打印出来# egrep 'aaa|111|ooo' test.txt rooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4、egrep中()的应用# egrep 'r(oo)|(mo)n' test.txt root:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash用( )表示一个整体,例如(oo)+ 表示1个'oo'或者多个'oo'# egrep '(oo)+' test.txt root:x:0:0:root:/root:/bin/bashrooooot:x:0:0/roooooot:/bin/bash5、egrep中[ ]的应用 方括号内的字符为其中的一个;[^o]为除了字母o之外的;示例:r开头t结尾的;;# egrep 'rt' test.txt rot:x:0:0:rot:/rot:/bin/bashr开头后面有o的# egrep 'r' test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bashrooooot:x:0:0/roooooot:/bin/bashr开头后面不是o的;# egrep 'r[^o]' test.txt rrtrtxt为结尾的前面字符不是o的; # egrep '[^o]t' test.txt rrtrtx. * + ? 符号的总结. 表示任意一个字符(包括特殊字符 空格 # $ ?)* 表示零个或多个*前面的字符.* 表示任意个任意字符(包含空行)+ 表示1个或多个+前面的字符? 表示0个或1个?前面的字符其中,+ ? grep不支持,egrep才支持。"ro.*t" 表示以ro开头一直到t结尾的# grep 'ro.*t' test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bashrooooot:x:0:0/roooooot:/bin/bashgrep如果需要筛选字符串| 管道需要加脱意\才可以使用linux 正则表达式sedsed、awk工具可以实现文本替换并且把替换的文本输出到屏幕上sed和awk都是流式编辑器,是针对文档的行来操作的。sed通常用来替换操作。示例的文本内容,以下操作根据此文本。# cat test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1、打印某一行sed -n 'n'p filename 单引号内的n是一个数字,表示第几行;p也可以写到引号内;示例,打印passwd第3-5行;# sed -n '3,5'p /etc/passwddaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin打印所有行# sed -n '1,$'p /etc/passwd打印某一行,并且要显示行号,需要和grep一起使用;# grep -n '.*' test.txt | sed -n '1'p1:rrt2、打印包含某个字符串的行字符串需要用//括起来;grep中的特殊符号^ $ . * 同样适用于sed中。# sed -n '/root/'p /etc/passwdroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin打印包含/sbin/nologin的行,/需要进行脱意;# sed -n '/\/sbin\/nologin/'p passwd 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/nologin打印以d开头的行;打印以in结尾的;打印r与o字母中间有2个任意字符的;打印包含2个o及多个o的行;# sed -n '/^d/'p test.txt daemon:x:2:2:daemon:/sbin:/sbin/nologin# sed -n '/in$/'p test.txt daemon:x:2:2:daemon:/sbin:/sbin/nologin# sed -n '/r..o/'p test.txtrooooot:x:0:0/roooooot:/bin/bash# sed -n '/ooo*/'p test.txtroot:x:0:0:root:/root:/bin/bashrooooot:x:0:0/roooooot:/bin/bash3、-e可以实现多个行为# sed -e '1'p -e '/111/'p -n test.txt rot:x:0:0:rot:/rot:/bin/bash11111111111111111111111111111111可以用-e写多个;-e相当于传送带,先匹配最前面的打印,再匹配后面的打印,所以第一行会打印2次;# sed -e '/root/p' -e '/bash/p' -n 1.txtroot:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinuser1:x:500:500::/home/user1:/bin/bashuser2:x:501:501::/home/user2:/bin/bash -e后面也可以用;分号;-n不能写到-e的后面,可以写在-e的前面或最后面;# sed -e '/root/p;/bash/p' -n 1.txtroot:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinuser1:x:500:500::/home/user1:/bin/bashuser2:x:501:501::/home/user2:/bin/bash 4、删除某行或者多行‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。 示例,删除第一行;删除1-3行;删除包含root关键词的行;删除第3行到最后一行所有行;# sed '1'd test.txt root:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# sed '1,3'd test.txt rooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# sed '/root/'d test.txtrot:x:0:0:rot:/rot:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# sed '3,$'d test.txt rot:x:0:0:rot:/rot:/bin/bashroot:x:0:0:root:/root:/bin/bash5、替换字符或替换字符串示例,替换第一行字母r为R;替换1-2行中ot为to;替换所有行中ot为to;# sed '1s/r/R/g' test.txt RRt# sed '1,2s/ot/to/g' test.txt rto:x:0:0:rto:/rto:/bin/bashroto:x:0:0:roto:/roto:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooot:x:0:0/roooooot:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa# sed 's#ot#to#g' test.txt rto:x:0:0:rto:/rto:/bin/bashroto:x:0:0:roto:/roto:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologinrooooto:x:0:0/roooooto:/bin/bash11111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa与vim编辑器里面替换一样的命令格式,s代表替换,g代表全局,不加g的话只替换行的第一个;可以使用# @作为分隔符。1s代表只替换第一行;1,3s代表第一行到第三行;不加行数的话默认为全部行。 示例,删除文档中所有的数字's///g'如删除文档中所有的字母's///g'删除所有的数字和字母's///g'# sed 's///g' test.txt rot:x:::rot:/rot:/bin/bashroot:x:::root:/root:/bin/bashdaemon:x:::daemon:/sbin:/sbin/nologinrooooot:x::/roooooot:/bin/bashaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa示例,删除文档中所有的字母# sed 's///g' 1.txt ::0:0:/://::11:0::/://::11:0::/://::0:0:/://1111111111111111111111111111111示例,删除文档中不是英文字母的(数字和特殊符号)# sed 's/[^a-z]//g' 1.txt rotxrotbinbashoperatorxoperatorrootsbinnologinoperatorxoperatorroootsbinnologinrooootxroooootbinbashaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa示例,删除文档中不是数字的(英文字母和特殊符号)# sed 's/[^0-9]//g' 1.txt 00110110001111111111111111111111111111111 示例,把文档中的小写字母全部替换为大写字母's//\u&/g' # sed 's//\u&/g' 1.txt ROT:X:0:0:/ROT:/BIN/BASHOPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGINOPERATOR:X:11:0:OPERATOR:/ROOOT:/SBIN/NOLOGINROOOOT:X:0:0:/ROOOOOT:/BIN/BASH1111111111111111111111111111111AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA示例,把文档中的大写字母全部替换为小写字母's//\l&/g' # sed 's//\l&/g' 1.txt rot:x:0:0:/rot:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinoperator:x:11:0:operator:/rooot:/sbin/nologinroooot:x:0:0:/rooooot:/bin/bash1111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa替换的同时加-n p 打印特定的行;# sed -n '1s//\u&/g'p 1.txt ROT:X:0:0:/ROT:/BIN/BASH6、调换二个字符串的位置sed-r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/'[^:]非冒号,不是冒号的所有字符-r,--regexp-extended在脚本中使用扩展正则表达式; 加r选项的意思为后面不用再加脱意\ ( )括号括起来是分段的意思,\3\2\1 是代表3调换1,后面的内容调换到前面示例,aa与ff调换;加-r选项不用加脱意符号\;不加-r ( )括号左右都需要加\脱意;调换多行用最后一个;# cat 1.txt aa:bb:cc:dd:ee:ff# sed -r 's/(aa)(.*)(ff)/\3\2\1/' 1.txtff:bb:cc:dd:ee:aa# sed 's/\(aa\)\(.*\)\(ff\)/\3\2\1/' 1.txt ff:bb:cc:dd:ee:aa# sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 1.txt ff:bb:cc:dd:ee:aa示例,rot与/bin/bash进行调换# grep 'rot' test.txtrot:x:0:0:rot:/rot:/bin/bash# grep 'rot' test.txt |sed 's/\(rot\)\(.*\)\(\/bin\/bash\)/\3\2\1/'/bin/bash:x:0:0:rot:/rot:rot# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/\3\2\1/'sed:-e 表达式 #1,字符 18:“s”的未知选项# grep 'rot' test.txt |sed -r 's/(rot)(.*)(\/bin\/bash)/\3\2\1/'/bin/bash:x:0:0:rot:/rot:rot加-r后()内的/bin/bash 也还需要脱意才可以;-i 选项 直接替换字符,并且保存原文件里面。使用i选项前,记得备份原文件。# sed -r -i 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 1.txt # cat 1.txt ff:bb:cc:dd:elinux正则表达式awkawk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行。awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的。awk常用来分段;awk不用加任何参数就可以实现 + ? * .| 这些特殊符号;1、截取文档中的某个段# head -n2 passwd |awk -F: '{print $1}'rootbin# head -n2 passwd |awk -F: '{print $0}'root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin# head -n2 passwd |awk -F: '{print $1,$3,$7}'root 0/bin/bashbin 1/sbin/nologin-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。 Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。{ }内可以打印多个字段$1,$3,$7 打印第1、3、7段,中间用逗号隔开;打印分段默认分隔符为空格,可以自定义分隔符,分隔符需要用双引号括起来;也可以OFS定义输出分隔符;# awk -F: '{print $3,$4}' 1.txt |head -50 01 12 23 44 7# awk -F: '{print $3":"$4}' 1.txt |head -50:01:12:23:44:7# awk -F: 'OFS="#"{print $3,$4}' 1.txt |head -50#01#12#23#44#7# head -n2 passwd |awk -F: '{print$1"#""@"$3"#"$7}'root#@0#/bin/bashbin#@1#/sbin/nologin注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用 { } 括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用“”双引号括起来。2、匹配字符或字符串# awk -F: '$1~/me/' passwd games:x:12:100:games:/usr/games:/sbin/nologin# awk -F: '$1~/user/' passwd user1:x:600:501::/home/user1:/bin/bash可以让某个段去匹配,~ 表示匹配的意思,以冒号分隔第一字段然后匹配//里的关键字;# awk -F: '/root/ {print $1,$3} /user/ {print $1,$3}' passwd root 0operator 11ftp 14saslauth 499user1 600awk还可以多次匹配,如上例全文匹配包含root关键词的行,再匹配包含user的行,打印所匹配的第1、3段。3、条件操作符判断第3个字段为0的# awk -F: '$3=="0"' passwd root:x:0:0:root:/root:/bin/bash# awk -F: '$3==10' passwd uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin判断第3个字段为10的并且打印该行的第7字段;# awk -F: '$3==10 {print $7}' passwd /sbin/nologin# awk -F: '$3=="600"' passwd user1:x:600:501::/home/user1:/bin/bash awk中是可以用逻辑符号判断的,比如 ‘==’ 就是等于,也可以理解为 ‘精确匹配’ 另外也有 >, ‘>=, ‘<, ‘<=, ‘!= 等等,值得注意的是,在和数字比较时,若把比较的数字用双引号引起来后,那么awk不会认为是数字,而认为是字符,不加双引号则认为是数字。示例,双引号括起来认为是字符;加单引号和不加则认为是数字;# awk -F: '$3>"500"' passwd | sort -t: -k 3 -n shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinvcsa:x:69:69:virtualconsole memory owner:/dev:/sbin/nologinsshd:x:74:74:privilege-separatedssh:/var/empty/sshd:/sbin/nologindbus:x:81:81:systemmessage bus:/:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologinnobody:x:99:99:nobody:/:/sbin/nologinuser1:x:600:501::/home/user1:/bin/bash# awk -F: '$3>500' passwd | sort -t: -k 3 -n user1:x:600:501::/home/user1:/bin/bash# awk -F: '$3>'500'' passwd | sort -t: -k 3 -n user1:x:600:501::/home/user1:/bin/bash!= 为不匹配,第7字段不等于/sbin/nologin的行,需要用双引号括起来。# awk -F: '$7!="/sbin/nologin"' passwd 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:600:501::/home/user1:/bin/bashmysql:x:27:27:MySQLServer:/var/lib/mysql:/bin/bash除了针对某一个段的字符进行逻辑比较外,还可以两个段之间进行逻辑比较。示例,加双引号之后把数字当字符看;# awk -F: '$3>"5" && $3<"7"' passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdownvcsa:x:69:69:virtualconsole memory owner:/dev:/sbin/nologinuser1:x:600:501::/home/user1:/bin/bash示例,加单引号之后为数字比较;#awk -F: '$3>'5' && $3<'7' {print }' passwdshutdown:x:6:0:shutdown:/sbin:/sbin/shutdown另外还可以使用 && “并且”和|| “或者” 的意思。示例,打印第3段大于第4段,并且第7段为/bin/bash的行;# awk -F: '$3>$4 && $7=="/bin/bash"' passwd user1:x:600:501::/home/user1:/bin/bash示例,打印第3段小于第4段,或者第7段为/bin/bash的行;# awk -F: '$3<$4 || $7=="/bin/bash"' passwd root:x:0:0:root:/root:/bin/bashadm: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/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologingames:x:12:100:games:/usr/games:/sbin/nologingopher:x:13:30:gopher:/var/gopher:/sbin/nologinftp:x:14:50:ftpuser:/var/ftp:/sbin/nologinuser1:x:600:501::/home/user1:/bin/bashmysql:x:27:27:mysqlserver:/var/lib/mysql:/bin/bash4、awk的内置变量awk常用的变量有:NF :用分隔符分隔后一共有多少段NR :行数{print NR":"NF} 列出行号,以冒号分隔,列出共有多少段;# head -5 passwd |awk -F: '{print NR":"NF}'1:72:73:74:75:7# head -5 passwd |awk -F: '{print NF}'77777# head -5 passwd |awk -F: '{print NR}'# head -5 passwd |awk -F: '{print $NF}'/bin/bash/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologinNF 表示是多少段,而$NF是最后一段的值, 而NR则是行号。5、awk中的数学运算awk还可以对各个段的值进行数学运算:# awk -F: '{(tot=tot+$3)};END {print tot};' passwd 1720这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的。示例,if判断,如第一段的值为root,打印整行;# awk -F: '{if ($1=="root") print $0}' passwd root:x:0:0:root:/root:/bin/bash示例,for循环,定义sum变量,i值为第3段的值;求第3段的和;# sum=0;for i in `awk -F: '{print $3}' passwd`;dosum=$[($sum+$i)];done;echo $sum1720
页:
[1]