9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 9.4/9.5 sed 9.6/9.7 awk 原

 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 

9.1 正则介绍_grep上

9.2 grep中

9.3 grep下

扩展

把一个目录下,过滤所有*.php文档中含有eval的行

grep -r --include="*.php" 'eval' /data/

一、 grep

  • 正则就是一串有规律的字符串

  • 掌握好正则对于编写shell脚本有很大帮助

  • 各种编程语言中都有正则,原理是一样的

  • 本章将要学习grep/egrep、sed、awk

grep/egrep命令

  • grep命令:过滤出指定关键字的行;

  • 格式:grep [参数] ‘字符’ filename 

  • grep -n 显示符号要求的行,并显示行号

  • grep -c 打印符合要求的行数

  • grep -v 打印不符合要求的行,取反的意思

  • grep -r 会把目录下的所有文件全部遍历;-r针对的是目录,如果不加-r只能针对文件

  • grep -i 忽略大小写

  • grep -A2 打印符合要求的行以及下面两行

  • grep -B2 打印符合要求的行以及上面两行

  • grep -C2 打印符合要求的行以及上下两行

  • grep -w 匹配一个完整的单词

  • grep -E 特殊符号脱意==egrep

  • centos7中自带 --color显示颜色 ;

  • grep 跟特殊符号的话,要用单引号

  • grep --include 包含

  • grep -l 只打印出含有匹配字符串的文件名,不输出具体匹配行的数据

过滤出包含root字符的行。

[root@linux-151 ~]# grep 'root' test.txtroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin

grep –n 过滤出包含root的行,并显示行号;

[root@linux-151 ~]# grep -n 'root' test.txt1:root:x:0:0:root:/root:/bin/bash10:operator:x:11:0:operator:/root:/sbin/nologin

test.txt中包含root字符的一共有几行。

[root@linux-151 ~]# grep -c 'root' test.txt2

过滤出不包含nologin的行;

[root@linux-151 ~]# grep -v 'nologin' test.txtroot: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/haltlem:x:1000:1000::/home/lem:/bin/bashuser3:x:1004:1003::/home/user3:/sbin/nolonginuser4:x:1005:1003::/home/user4:/sbin/nolonginuser5:x:1007:1006::/home/user5:/bin/loginuser7:x:1009:1009::/home/user7:/bin/bash

grep –i 不区分大小写

[root@linux-151 ~]# grep -i 'biin' test.txtroot:x:0:0:root:/root:/biin/bashBiin:x:1:1:bin:/bin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sBiin/nologinsync:x:5:0:sync:/sbin:/Biin/syncshutdown:x:6:0:shutdown:/sbiin:/sbin/shutdown

[root@linux-151 ~]# grep 'biin' test.txtroot:x:0:0:root:/root:/biin/bashshutdown:x:6:0:shutdown:/sbiin:/sbin/shutdown

grep –A2 打印符合要求的行以及下面两行;

[root@linux-151 ~]# grep -nA2 'root' test.txt1:root:x:0:0:root:/root:/biin/bash2-Biin: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@linux-151 ~]# grep -nB2 'spool' test.txt3-daemon:x:2:2:daemon:/sbin:/sbin/nologin4-adm:x:3:4:adm:/var/adm:/sBiin/nologin5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

--

7-shutdown:x:6:0:shutdown:/sbiin:/sbin/shutdown8-halt:x:7:0:halt:/sbin:/sbin/halt9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

--

17-polkitd:x:998:996:User for polkitd:/:/sbin/nologin18-tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

19:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

grep –C2 打印符合要求的行以及这行上下各两行;

[root@linux-151 ~]# grep -nC2 'halt' test.txt6-sync:x:5:0:sync:/sbin:/Biin/sync7-shutdown:x:6:0:shutdown:/sbiin:/sbin/shutdown8: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

grep/egrep示例:

  • grep -n 'root' test.txt

  • grep -nv 'nologin' test.txt

  • grep '[0-9]'/etc/inittab

  • grep -v '[0-9]'/etc/inittab

  • grep '[^0-9]' inittab                     #非0-9 只要不是一个数字 ,方括号里面的反义 取反非的意思

  • grep '^[^0-9]' inittab                  #以什么开头 以一个什么字母开头 非数字   外面是开头  里面就是非

  • grep -v '^#' /etc/inittab                                 #号开头的行

  • grep -v '^#' /etc/inittab|grep -v '^$'

  • grep '^[^a-zA-Z]' test.txt   #非a-Z  方括号里面的反义 取反非的意思

  • grep 'r.o' test.txt              #任意的一个字符         

  • grep 'oo*' test.txt

  • grep '0*0' passwd       #左边的0开始 0到N次

  • grep '.*' test.txt       #匹配所有字符

  • grep 'o{2}' /etc/passwd   #o花括号

  • grep -E 'o{2}' passwd   #前面一个字符的重复范围 !  o花括号2 代表出现2次o

  • egrep 'o{2}' /etc/passwd  #和上面道理一样

  • egrep 'o+' /etc/passwd     

  • grep 'o\+o' passwd      #加号表示 +号前面这个字符1次或者多次

  • egrep 'o+o' passwd     #和上面一样

  • egrep 'oo?' /etc/passwd

  • grep 'o\?l' passwd    #有的时候就是ol 没有的时候就l 表示0个或者1个前面的字符

  • grep 'root\|nologin' passwd    # root 或者 nologin \ 拖意

  • egrep 'root|nologin' /etc/passwd  # 和上面一样 

  • grep 'root\|nologin\|ftp' passwd  # 和上面一样 再多一个 或者

  • grep -i 'root\|nologin\|ftp' passwd  # 和上面一样 再加了一个不区分大小写

  • egrep '(oo){2}' /etc/passwd  #一个组合oo

  • [0-9]:这里的方括号,表示方括号里面的任意一个字符;只要有一个数字,不管是几,就算符合要求。

过滤出包含数字的行 ; grep '[0-9]' test1.txt

[root@linux-151 ~]# grep '[0-9]' test1.txtroot:x:0:0:root:/root:/biin/bash123123Biin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sBiin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

aaaa1111bbbb

11111111sync:x:5:0:sync:/sbin:/Biin/syncshutdown:x:6:0:shutdown:/sbiin:/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

过滤出所有不包含数字的行; grep -nv 'nologin' test.txt

[root@linux-151 ~]# grep -nv '[0-9]' test1.txt8:BBBBBBB11:asgfhavkhasd

过滤出不以#开头的行,方便查看某个文件的配置

[root@linux-151 ~]# grep -nv '^#' 2.txt10:dbadfasdfervadsv13:123`123dv15:12312312316:

过滤出不以#或者开头的行不包括空行

[root@linux-151 ~]# grep -v '^#' 2.txt |grep -v '^$'

dbadfasdfervadsv

123`123dv

123123123

过滤出不以字母开头的行

grep '^[^a-zA-Z]' test.txt

[root@linux-151 ~]# grep '^[^a-zA-Z]' test.txt11111111111

!@@@@$$$$$$

111111a22222222

过滤出不包含特殊符号的行

grep -v '^[^a-zA-Z0-9]' 2.txt

[root@linux-151 ~]# grep -v '^[^a-zA-Z0-9]' 2.txt

dbadfasdfervadsv

123`123dv

123123123

正则里面的特殊符号

  • 1 . 表示 任意一个字符

  • 2 * 表示 零个或多个前面的字符

  • 3 .* 表示零个或多个任意字符,空行也包含在内;以r开头o结尾。

  • 4 ? 表示0个或者1个前面的字符,使用的时候要\ 脱意一下

  • 5 + 表示一个或者多个+前面的字符

  • 6 | 在正则表达式里面表示或者,可以写多个,是特殊符号,要使用脱意 或者-E 或者 egrep

  • 7 () 括号表示一个整体,{1,3}大括号表示一个范围 ? +(){} |都是特殊符号,要使用必须脱意或者-E 或者egrep

+  *  和的区别  *号0次或者多次  +号没有0次这样说法 1次2次3次

 

六周第二次课

9.4/9.5 sed

9.4/9.5 sed

  • sed命令比grep更强大,除了拥有查找功能外,还拥有替换功能

  • sed命令格式:sed -n 'n'p filename ,单引号内的n是数字,表示第几行;

  • sed 可以实现grep的大部分功能 ,但是不显示颜色

  • sed -n 是打印符合条件的行,p是print打印的意思

  • sed -r 脱义(去除特殊符号本身的意义,使其代表特殊意义)

  • sed -e 进行多次命令,和;效果一行

  • sed '/[0-9]'d 2.txt d表示删除不包含数字的行;不是真正的删除,是不显示,相当于grep -v 取反

  • sed -n '/root/'Ip I 不区分大小写

  • sed -i ' [0-9]'d 2.txt -i 是真正删除掉文档里面不包含数字的行;一半不建议使用。

  • 正则中 | 表示或者,并且要sed两次表示

  • sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' 1.txt 以:为分割符,将第一段和最后一段互相替换,\1表示第一个()内容,\2表示第二个()内容,\3表示第三个内容。

  • sed -r 's/(.*)/aaa:&/g' 1.txt

sed实例1:

  • sed -n '5'p test.txt

  • sed -n '1,5'p test.txt

  • sed -n '1,$'p test.txt

  • sed -n '/root/'p test.txt

  • sed -n '/^1/'p test.txt

  • sed -n 'in$'p test.txt

  • sed -n '/r..o/'p test.txt

  • sed -n 'oo*'p test.txt

  • sed -e '1'p -e '/111/'p -n test.txt

查找指定行

  1. 打印第5行;

[root@linux-151 ~]# sed -n '5'p 1.txtlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

  1. 打印第1-5行;

[root@linux-151 ~]# sed -n '1,5'p 1.txtroooot: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

  1. 打印全部内容可以用(1,$)表示;内容太多,就不显示全部内容。

[root@linux-151 ~]# sed -n '1,$'p 1.txtroooot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologin

user6:x:1008:1003::/home/wuzhou:/sbin/nologinuser7:x:1009:1009::/home/user7:/bin/bash

查找指定字符串的行

  1. 查找带有root字符的行;字符要用/ /括起来。

[root@linux-151 ~]# sed -n '/root/'p 1.txtroooot:x:0:0:root:/root:/bin/bash

  • 查询的内容也可以是正则;

  1. 查找以l开头的行

[root@linux-151 ~]# sed -n '/^l/'p 1.txtlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

  1. 查找以/login结尾的行;注意:这里需要将/login前面的/脱意一下。

[root@linux-151 ~]# sed -n '/\/login$/'p 1.txtuser5:x:1007:1006::/home/user5:/bin/login

  1. 查找包含r.o

[root@linux-151 ~]# sed -n '/r.o/'p 1.txtroooot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/rooot:/sbin/nologin

  1. 打印带有数字的行

[root@linux-151 ~]# cat 3.txt121212

ababab

[root@linux-151 ~]# sed -n '/[0-9]/'p 3.txt121212

  1. 打印以数字开头的行

[root@linux-151 ~]# sed -n '/^[0-9]/'p 1.txt1111bbaavv

  1. sed –e 可以进行多次命令;

[root@linux-151 ~]# sed -e '1'p -e '/111/'p -n 1.txtroooot:x:0:0:root:/root:/bin/bash1111bbaavv

删除某些行

sed实例2:

  • sed '1'd test.txt

  • sed '1,3'd test.txt

  • sed '/oot/'d test.txt

  1. 删除第1行

[root@linux-151 ~]# cat 3.txt121212

ababab

dfbnsofvas

sdg1wasdf2

!#D@!##!@#

[root@linux-151 ~]# sed '1'd 3.txt

ababab

dfbnsofvas

sdg1wasdf2

!#D@!##!@#

  1. 删除第1-3行

[root@linux-151 ~]# cat 3.txt121212

ababab

dfbnsofvas

sdg1wasdf2

[root@linux-151 ~]# sed '1,3'd 3.txt

sdg1wasdf2

!#D@!##!@#

  1. 删除带有ab字符的行

[root@linux-151 ~]# cat 3.txt121212

ababab

dfbnsofvas

sdg1wasdf2

[root@linux-151 ~]# sed '/ab/'d 3.txt121212

dfbnsofvas

sdg1wasdf2

!#D@!##!@#

sed替换功能

  • sed 's/[0-9]/a/g' 1.txt //将所有数字替换成a

  • sed 's/root/ROOT/g' 1.txt //将文件1.txt中root全部换成ROOT

  • sed '1,10s/root/ROOT/g' 1.txt //将文件1.txt前10行中root全部替换成ROOT

  • paste 1.txt 2.txt //将1.txt的内容和2.txt内容连在一起

  • sed -i '30,40s/^.*$/#&/g' 1.txt //前面加入加上#注释掉

  • sed -i 's/^/#/g' 1.txt //前面加入加上#注释掉

  • s 是替换的意思,g为全局替换,否者就替换一次,/可以用#@来替换字符

sed实例3:

  • sed '1,2s/ot/to/g' test.txt

  • sed 's#ot#to#g' test.txt

  • sed 's/[0-9]//g' test.txt

  • sed 's/[a-zA-Z]//g' test.txt

  • sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt

  • sed 's/^.*$/123&/' test.txt

  • sed -i 's/ot/to/g' test.txt

  1. 将1到2行中ot替换成to

[root@linux-151 ~]# head -5 1.txt|sed '1,2s/ot/to/'groooto:x:0:0:roto:/roto:/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

  1. /可以用#或者@来替换

[root@linux-151 ~]# head -5 1.txt|sed '1,2s#ot#to#'groooto:x:0:0:roto:/roto:/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

  1. 将数字全部删除

[root@linux-151 ~]# head -5 1.txt|sed 's/[0-9]//'groooot:x:::root:/root:/bin/bashbin:x:::bin:/bin:/sbin/nologindaemon:x:::daemon:/sbin:/sbin/nologinadm:x:::adm:/var/adm:/sbin/nologinlp:x:::lp:/var/spool/lpd:/sbin/nologin

  1. 只保留数字

[root@linux-151 ~]# head -5 1.txt|sed 's/[^0-9]//'g0011223447

  1. 删除所有字母

[root@linux-151 ~]# head -5 1.txt|sed 's/[a-zA-Z]//'g::0:0::/://::1:1::/://::2:2::/://::3:4:://://::4:7::///://

  1. 以:为分割,将第一段和最后一段调换位置;+ 在里面是特殊符号,要脱意 用 -r

[root@linux-151 ~]# head -5 1.txt|sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'g

/bin/bash:x:0:0:root:/root:roooot

/sbin/nologin:x:1:1:bin:/bin:bin

/sbin/nologin:x:2:2:daemon:/sbin:daemon

/sbin/nologin:x:3:4:adm:/var/adm:adm

/sbin/nologin:x:4:7:lp:/var/spool/lpd:lp

  1. ;分号可以进行多次匹配

[root@linux-151 ~]# sed -n '/root/p;/user5/p' 1.txtroooot:x:0:0:root:/root:/bin/bashuser5:x:1007:1006::/home/user5:/bin/login

  1. -e 进行多次命令,和;效果一行

[root@linux-151 ~]# sed -n -r -e '/root/'p -e '/user5/'p 1.txtroooot:x:0:0:root:/root:/bin/bashuser5:x:1007:1006::/home/user5:/bin/login

  1. 在每一行前面加上aaa: &表示前面()的内容

[root@linux-151 ~]# head -5 1.txt|sed -r 's/(.*)/aaa:&/g'aaa:roooot:x:0:0:root:/root:/bin/bashaaa:bin:x:1:1:bin:/bin:/sbin/nologinaaa:daemon:x:2:2:daemon:/sbin:/sbin/nologinaaa:adm:x:3:4:adm:/var/adm:/sbin/nologinaaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

\1 表示前面()的内容

[root@linux-151 ~]# head -5 1.txt|sed -r 's/(.*)/aaa:\1/g'aaa:roooot:x:0:0:root:/root:/bin/bashaaa:bin:x:1:1:bin:/bin:/sbin/nologinaaa:daemon:x:2:2:daemon:/sbin:/sbin/nologinaaa:adm:x:3:4:adm:/var/adm:/sbin/nologinaaa:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

  1. -i 会直接更改文件本身的内容

sed -i 's/^/#/g' 3.txt

[root@linux-151 ~]# sed -i 's/^/#/g' 3.txt

[root@linux-151 ~]# cat 3.txt

#121212#ababab#dfbnsofvas#sdg1wasdf2#!#D@!##!@#

  

六周第三次课

9.6/9.7 awk

扩展

把这里面的所有练习题做一下

http://www.apelearn.com/study_v2/chapter14.html

9.6/9.7 awk

  • awk也是流式编辑器,针对文档中的行和段进行操作 awk可以分为几个部分:

  • 匹配字符或者字符串

  • 截取文档中的某一段

  • 条件操作符

  • 数学运算

  • 内置变量

实例1:

  • head -n2 test.txt|awk -F ':' '{print $1}'

  • head -n2 test.txt|awk -F ':' '{print $0}'

  • awk -F ':' '{print $1"#"$2"#"$3"#"$4}'

  • awk '/oo/' test.txt

  • awk -F ':' '$1 ~/oo/' test.txt

  • awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt

  • awk -F ':' '$3=="0"' /etc/passwd

  • awk -F ':' '$3>="500"' /etc/passwd

  • awk -F ':' '$3>=500' /etc/passwd

  • awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

匹配字符或者字符串

匹配root的行

[root@linux-151 ~]# awk '/root/' 1.txtroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin

 awk可以做到匹配某一段中的某个字符,以:分隔,匹配第一段中带有root的行

[root@linux-151 ~]# awk -F ':' '$1 ~ /root/' 1.txtroot:x:0:0:root:/root:/bin/bash

awk匹配字符可以使用正则

[root@linux-151 ~]# awk '/ooo?/' 1.txtroot: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/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin

awk自带脱意功能,grep脱意需要-E或者egrep,sed脱意需要-r选项

[root@linux-151 ~]# awk -F ':' '/oo+/' 1.txtroot: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/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin

grep -E

[root@linux-151 ~]# grep -E 'oo+' 1.txtroot: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/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin

sed –r

[root@linux-151 ~]# sed -n -r '/oo+/'p 1.txtroot: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/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologin

截取文档中的某一段

  • awk –F '分隔符' 如果不指定分隔符,默认会以空格或者空白字符分隔。

打印第一段

[root@linux-151 ~]# head -5 1.txt |awk -F ':' '{print $1}'

root

bin

daemon

adm

lp

打印全部内容;$0表示全部内容

[root@linux-151 ~]# head -5 1.txt |awk -F ':' '{print $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

打印第1段~第4段

[root@linux-151 ~]# head -5 1.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

  • 注意:这里打印出来了第1到第4段,但是内容没有分隔符,这里我们加个分隔符,分隔符要以双引号引起来;后面我们会介绍一个变量OFS来进行分隔。

[root@linux-151 ~]# head -5 1.txt |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'

root#x#0#0bin#x#1#1daemon#x#2#2adm#x#3#4lp#x#4#7

  • awk可以支持多个匹配

匹配到root打印第1和第3段,匹配到user打印第1,第3,第4段。

[root@linux-151 ~]# awk -F ':' '/root/{print $1,$3} /user/ {print $1,$3,$4}' 1.txt

root 0operator 11

tss 59 59

user3 1004 1003

user4 1005 1003

user5 1007 1006

user6 1008 1003

user7 1009 1009

  • |在正则里面表示或者

打印出匹配到root或者user的行

[root@linux-151 ~]# awk '/root|bash/' 1.txtroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinlem:x:1000:1000::/home/lem:/bin/bashuser7:x:1009:1009::/home/user7:/bin/bash

||也是并且的意思,但是用法还是有一点区别。

[root@linux-151 ~]# awk '/root/||/bash/' 1.txtroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinlem:x:1000:1000::/home/lem:/bin/bashuser7:x:1009:1009::/home/user7:/bin/bash

条件操作符

  • == 等于,精确匹配

  • >大于

  • >= 大于等于

  • < 小于

  • <= 小于等于

  • != 不等于

打印出第3段等于0的行

[root@linux-151 ~]# awk -F ':' '$3=='0'' 1.txt

打印出第3段大于等于500的行

[root@linux-151 ~]# awk -F ':' '$3>='500'' 1.txt

systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologinpolkitd:x:998:996:User for polkitd:/:/sbin/nologinchrony:x:997:995::/var/lib/chrony:/sbin/nologinlem:x:1000:1000::/home/lem:/bin/bashuser3:x:1004:1003::/home/user3:/sbin/nolonginuser4:x:1005:1003::/home/user4:/sbin/nolonginuser5:x:1007:1006::/home/user5:/bin/loginuser6:x:1008:1003::/home/wuzhou:/sbin/nologinuser7:x:1009:1009::/home/user7:/bin/bash

注意'500'和"500"区别:双引号引起来的500会把它当成字符,会按照阿斯玛排序,单用号引起来的500是数字。

[root@linux-151 ~]# awk -F ':' '$3>="500"' 1.txtshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologin

systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologindbus:x:81:81:System message bus:/:/sbin/nologinpolkitd:x:998:996:User for polkitd:/:/sbin/nologintss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologinsshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

chrony:x:997:995::/var/lib/chrony:/sbin/nologin

打印出第7段不/sbin/nologin的行

[root@linux-151 ~]# awk -F ':' '$7!="/sbin/nologin"' 1.txtroot: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/haltlem:x:1000:1000::/home/lem:/bin/bashuser3:x:1004:1003::/home/user3:/sbin/nolonginuser4:x:1005:1003::/home/user4:/sbin/nolonginuser5:x:1007:1006::/home/user5:/bin/loginuser7:x:1009:1009::/home/user7:/bin/bash

并且&&和或者||

[root@linux-151 ~]# awk -F ':' '$3>'1000' && $3<'1009'' 1.txtuser3:x:1004:1003::/home/user3:/sbin/nolonginuser4:x:1005:1003::/home/user4:/sbin/nolonginuser5:x:1007:1006::/home/user5:/bin/loginuser6:x:1008:1003::/home/wuzhou:/sbin/nologin

或者||

[root@linux-151 ~]# awk -F ':' '$3>'1000' || $7=="/bin/bash"' 1.txtroot:x:0:0:root:/root:/bin/bashlem:x:1000:1000::/home/lem:/bin/bashuser3:x:1004:1003::/home/user3:/sbin/nolonginuser4:x:1005:1003::/home/user4:/sbin/nolonginuser5:x:1007:1006::/home/user5:/bin/loginuser6:x:1008:1003::/home/lem:/sbin/nologinuser7:x:1009:1009::/home/user7:/bin/bash

两个字段进行运算

[root@linux-151 ~]# awk -F ':' '$3>$4' 1.txtsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltoperator:x:11:0:operator:/root:/sbin/nologin

systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologinpolkitd:x:998:996:User for polkitd:/:/sbin/nologinchrony:x:997:995::/var/lib/chrony:/sbin/nologinuser3:x:1004:1003::/home/user3:/sbin/nolonginuser4:x:1005:1003::/home/user4:/sbin/nolonginuser5:x:1007:1006::/home/user5:/bin/loginuser6:x:1008:1003::/home/lem:/sbin/nologin

awk内置变量

  • awk常用的变量有OFS,NR和NF

  • OFS 用来指定分隔符号

  • NR 表示行数

  • NF 表示段数

指定#为分隔符

[root@linux-151 ~]# awk -F ':' '{OFS="#"} $3>"5" {print $1,$2,$3,$4}' 1.txt

shutdown#x#6#0halt#x#7#0mail#x#8#12nobody#x#99#99systemd-bus-proxy#x#999#997dbus#x#81#81polkitd#x#998#996tss#x#59#59postfix#x#89#89sshd#x#74#74chrony#x#997#995

用awk打印前5行,并显示行号

[root@linux-151 ~]# head -5 1.txt|awk -F ':' '{print NR":"$0}'1: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

用awk打印20行以后的行,并显示行号

[root@linux-151 ~]# awk -F ':' 'NR>20 {print NR":"$0}' 1.txt21:chrony:x:997:995::/var/lib/chrony:/sbin/nologin22:lem:x:1000:1000::/home/lem:/bin/bash23:user3:x:1004:1003::/home/user3:/sbin/nolongin24:user4:x:1005:1003::/home/user4:/sbin/nolongin25:user5:x:1007:1006::/home/user5:/bin/login26:user6:x:1008:1003::/home/lem:/sbin/nologin27:user7:x:1009:1009::/home/user7:/bin/bash

awk中可以使用if判断

[root@linux-151 ~]# awk -F ':' '{OFS="#"} {if($3>'1000'){print $1,$2,$3}}' 1.txt

user3#x#1004user4#x#1005user5#x#1007user6#x#1008user7#x#1009

awk中的数学运算

  • awk可以更改段值

将第一段全部更改为root

[root@linux-151 ~]# head -5 1.txt|awk -F ':' '$1="root"'

root x 0 0 root /root /bin/bash

root x 1 1 bin /bin /sbin/nologin

root x 2 2 daemon /sbin /sbin/nologin

root x 3 4 adm /var/adm /sbin/nologin

root x 4 7 lp /var/spool/lpd /sbin/nologin

  • awk可以计算某个段的值

求第3段和

[root@linux-151 ~]# awk -F ':' '{(oto=oto+$3)}; END {print oto}' 1.txt9694

打印出第一段是root的行

[root@linux-151 ~]# awk -F ':' '{if ($1=="root") {print $0}}' 1.txtroot:x:0:0:root:/root:/bin/bash

猜你喜欢

转载自blog.csdn.net/weixin_42213920/article/details/81784939