20151203正则第五部分(awk)

描述:awk 可以实现grep 和sed的功能(grep主要是查找,sed最主要是用来替换), awk还可以用来分段!
最主要是用来查找替换的!

测试环境:cp /etc/passwd /test.txt
 以及  cp /etc/passwd /1.txt
1.1
-F来显示分割符,$3表示第三段
[root@niejicai-linux ~]# awk -F ':' '{print $3}' 1.txt  |head -5   以:为分割符输出第3段,显示前5行。
0
1
2
3
4
[root@niejicai-linux ~]# awk -F ':' '{print $3,$4}' 1.txt |head -5
 默认分割符,是空格,下面我们还可以通过分割符来进行分行。
0 0
1 1
2 2
3 4
4 7
方法一:(这种方法不是很标准,比较老套的方法)
[ root@niejicai-linux  ~]# awk -F ':' '{print $3 ":" $4}' 1.txt |head -5
0 :0
1 :1
2 :2
3 :4
4 :7
方法二:主要是用奥OFS的参数来实现,注意看格式!
[ root@niejicai-linux ~]#  awk -F ':' 'OFS="@" {print $3,$4}' 1.txt  |head -5
0@0
1@1
2@2
3@4
4@7


1.2
 输出带有root的行
[ root@niejicai-linux ~]#  awk '/root/' 1.txt    
root:x:0:0: root: /root:/bin/bash
operator:x:11:0:operator: /root:/sbin/nologin

[ root@niejicai-linux ~]#  awk -F ':' '/root/{print $3}' 1.txt        输出带有root的行同时,分别打印出第三段!
0
11
[ root@niejicai-linux ~]#  awk -F ':' '/root/{print  NR":" $3}' 1.txt      输出带有root的行的第三段,并且显示行号,最后用:号分开显示! NR表示行号
1:0                   这里是第一行的第三段是0。
11:11               这里是第十一行的第三段是11,然后用:号分开。

[root@niejicai-linux ~]# awk -F':' '{print NR":" $3}' 1.txt  
 输出1.txt下面的所有的第三段,并且输出行号!行号和第三段的内容用:分开显示!
1:0
2:1
3:2
。。
[ root@niejicai-linux ~]#  awk -F ':'  '{print NR":" NF}' 1.txt
                                                          NR表示行号,NF显示段数!
1:7                   这里表示在1.txt里面,第1行,有7段。
2:7                   这里表示在1.txt里面,第2行,有7段。
。。                 按照这样的显示,列出来。

[root@niejicai-linux ~]# awk '/ro*t/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
hacluster:x:496:493:heartbeat user:/var/lib/heartbeat/cores/hacluster:/sbin/nologin

[root@niejicai-linux ~]# awk '/ro?t/' 1.txt
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
hacluster:x:496:493:heartbeat user:/var/lib/heartbeat/cores/hacluster:/sbin/nologin

[root@niejicai-linux ~]# awk '/r(oo)+t/' 1.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[ root@niejicai-linux ~]#  awk '/root|ftp/' 1.txt         ( 匹配查找包含root和ftp的行)。
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[ root@niejicai-linux ~]#  awk -F ':' '$1~/root/' 1.txt        按:号进行分段,然后输出第1段是root的,整行数据!        $1表示第1段,~表示匹配。(所以'$1~/roo/'表示是第1段是root的行)
root:x:0: 0:root:/root:/bin/bash

[root@niejicai-linux ~]# awk -F ':' '$1~/root/ {print $3}' 1.txt     表示是第1段是root的行,然后输出第3段的内容!  (这里是精度匹配grep 和sed都无法实现)。
0

[root@niejicai-linux ~]# awk -F ':' '$1~/root/ || $3>500 {print NR":"$0}' 1.txt
                                 ||这里是表示或者的意思,'$1~/root/' 表示第1段是root的行;(或者)
$3>500 {print NR":"$0}'   表示第3段大于500 的,然后输出行号以及整行,($0表示整行的意思)
1:root:x:0:0:root:/root:/bin/bash 
33:xiaonie:x:501:501::/home/xiaonie:/bin/bash
34:user1:x:502:503::/home/user1:/bin/bash
35:user2:x:5505:5505::/home/user2:/bin/bash
36:user10:x:5506:5507::/home/user10:/bin/bash
37:user20:x:505:505::/home/user20:/bin/bash
38:user41:x:5562:500::/home/user41:/bin/bash
39:user42:x:5561:500::/home/user42:/bin/bash
40:user4:x:509:500:user4,ddddddddddd,aaaaaaaaaaa,111111111111111:/home/user444:/bin/bash
41:user0:x:5563:5563::/home/user0:/bin/bash

[ root@niejicai-linux ~]#  awk -F ':' '$1=="root" || $3>500 {print NR ":"$0}' 1.txt
          $1=="root"表示精准匹配,     ($0表示整行的意思)
 
1:root:x:0:0:root:/root:/bin/bash
35:xiaonie:x:501:501::/home/xiaonie:/bin/bash
36:user1:x:502:503::/home/user1:/bin/bash
37:user2:x:5505:5505::/home/user2:/bin/bash
38:user10:x:5506:5507::/home/user10:/bin/bash
39:user20:x:505:505::/home/user20:/bin/bash
40:user41:x:5562:500::/home/user41:/bin/bash
41:user42:x:5561:500::/home/user42:/bin/bash
42:user4:x:509:500:user4,ddddddddddd,aaaaaaaaaaa,111111111111111:/home/user444:/bin/bash
43:user0:x:5563:5563::/home/user0:/bin/bash

[ root@niejicai-linux ~]#  awk -F ':' '$1=="root" && $3>500 {print NR ":"$0}' 1.txt
表示并且的意思,这里没有符合要求

[root@niejicai-linux ~]# awk -F ':' '$1=="root" && $3<500 {print NR ":"$0}' 1.txt
1:root:x:0:0:root:/root:/bin/bash                        <也是可以的,>也是可以的。

[root@niejicai-linux ~]# awk -F ':' 'NR>20 && $3<500 {print NR":" $0}' 1.txt
21:rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
22:avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
23:pulse:x:498:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
24:haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
25:ntp:x:38:38::/etc/ntp:/sbin/nologin
26:apache:x:48:48:Apache:/var/www:/sbin/nologin
27:saslauth:x:497:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
28:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
29:abrt:x:173:173::/etc/abrt:/sbin/nologin
30:gdm:x:42:42::/var/lib/gdm:/sbin/nologin
31:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
32:tcpdump:x:72:72::/:/sbin/nologin
34:hacluster:x:496:493:heartbeat user:/var/lib/heartbeat/cores/hacluster:/sbin/nologin
[root@niejicai-linux ~]# awk -F ':' '$7!="sbin/nologin" {print NR":" $0}' 1.txt
 第7段不等于"sbin/nologin"的,输出来!
1:root:x:0:0:root:/root:/bin/bash
。。。。
43:user0:x:5563:5563::/home/user0:/bin/bash
[root@niejicai-linux ~]# awk -F ':'  '$3<$4 {print NR":" $0}' 1.txt  
 通过段和段之间进行比较$3和$4进行比较
6:adm:x: 3: 4:adm:/var/adm:/sbin/nologin
7:lp:x: 4: 7:lp:/var/spool/lpd:/sbin/nologin
11:mail:x: 8: 12:mail:/var/spool/mail:/sbin/nologin
12:uucp:x: 10: 14:uucp:/var/spool/uucp:/sbin/nologin
14:games:x: 12: 100:games:/usr/games:/sbin/nologin
15:gopher:x: 13: 30:gopher:/var/gopher:/sbin/nologin
16:ftp:x: 14: 50:FTP User:/var/ftp:/sbin/nologin
36:user1:x: 502: 503::/home/user1:/bin/bash
38:user10:x: 5506: 5507::/home/user10:/bin/bash
[root@niejicai-linux ~]# awk -F ':' 'NR>30 {print NR":" $0}' 1.txt    还可以用大于多少行的
31:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
32:tcpdump:x:72:72::/:/sbin/nologin
33:niejicai:x:500:500:niejicai:/home/niejicai:/bin/bash
34:hacluster:x:496:493:heartbeat user:/var/lib/heartbeat/cores/hacluster:/sbin/nologin
35:xiaonie:x:501:501::/home/xiaonie:/bin/bash
36:user1:x:502:503::/home/user1:/bin/bash
37:user2:x:5505:5505::/home/user2:/bin/bash
38:user10:x:5506:5507::/home/user10:/bin/bash
39:user20:x:505:505::/home/user20:/bin/bash
40:user41:x:5562:500::/home/user41:/bin/bash
41:user42:x:5561:500::/home/user42:/bin/bash
42:user4:x:509:500:user4,ddddddddddd,aaaaaaaaaaa,111111111111111:/home/user444:/bin/bash
43:user0:x:5563:5563::/home/user0:/bin/bash
[root@niejicai-linux ~]# awk -F ':' 'NR>20&&NR<30  {print NR":" $0}' 1.txt       
大于20行并且小于30行
21:rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
22:avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
23:pulse:x:498:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
24:haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
25:ntp:x:38:38::/etc/ntp:/sbin/nologin
26:apache:x:48:48:Apache:/var/www:/sbin/nologin
27:saslauth:x:497:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
28:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
29:abrt:x:173:173::/etc/abrt:/sbin/nologin

[root@niejicai-linux ~]# awk -F ':' 'OFS=":", $7=$3+$4 {print $0}' 1.txt   还可以实现加减法
root:x:0:0:root:/root:0
。。。
user42:x:5561:500::/home/user42:6061
user4:x:509:500:user4,ddddddddddd,aaaaaaaaaaa,111111111111111:/home/user444:1009
user0:x:5563:5563::/home/user0:11126

1.3
计算第3段的总和,把uid全部加起来!
[ root@niejicai-linux ~]# wc -l 1.txt
43 1.txt
[root@niejicai-linux ~]# awk -F ':' '{(sum=sum+$3)};END  {print sum}' 1.txt
33436
[root@niejicai-linux ~]# awk -F ':' '{(sum=sum+$1)}; END {print sum}' 3.txt
5
[ root@niejicai-linux ~]# cat 3.txt
a:1
2:b
3:c
d:4
[root@niejicai-linux ~]# awk -F ':' '{(sum=sum+$2)}; END {print sum}' 3.txt
5
[ root@niejicai-linux ~]# cat 3.txt
a: 1
2:b
3:c
d: 4
这里如果是字母的话,就是转换为0

[root@niejicai-linux ~]# awk -F ':' '{print $3}' 1.txt           列出所有第3段的内容
0
0
。。。。。
5562
5561
509
5563
用shell来表示:
[root@niejicai-linux ~]# sum=0; for i in `awk -F ':' '{print $3}' 1.txt`; do sum=$[$sum+$i]; done; echo $sum
33436
用awk表示如下:
[root@niejicai-linux ~]# awk -F ':' '{(sum=sum+$3)};END {print sum}' 1.txt
33436
awk还可用if
[root@niejicai-linux ~]# awk -F ':' '{if ($1=="root") print $0}' 1.txt
root:x:0:0:root:/root:/bin/bash

1.4
awk练习题
1.用awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt)
[root@niejicai-linux ~]# awk '{print $0}' test.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
。。。
user0:x:5563:5563::/home/user0:/bin/bash
2.查找所有包含 'bash' 的行
[root@niejicai-linux ~]# awk '/bash/' test.txt
root:x:0:0:root:/root:/bin/bash
niejicai:x:500:500:niejicai:/home/niejicai:/bin/bash
。。。。
user0:x:5563:5563::/home/user0:/bin/bash
3.用 ':' 作为分隔符,查找第三段等于0的行
[root@niejicai-linux ~]# awk -F ':' '$3==0{print $0}' test.txt
root:x:0: 0:root:/root:/bin/bash
4.用 ':' 作为分隔符,查找第一段为 'root' 的行,并把该段的 'root' 换成 'toor' (可以连同sed一起使用)
[root@niejicai-linux ~]# awk -F ':' '$1=="root"' test.txt |sed 's/root/toor/g'
toor:x:0:0:toor:/toor:/bin/bash
toor
5.用 ':' 作为分隔符,打印最后一段
[root@niejicai-linux ~]# awk -F ':' '{print$NF}' test.txt   
$NF表示最后一段!(NF表示段)
7
。。。
6.打印行数大于20的所有行  
[root@niejicai-linux ~]# awk 'NR>20' test.txt       NR表示行
pulse:x:498:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
。。。。。
7.用 ':' 作为分隔符,打印所有第三段小于第四段的行
[root@niejicai-linux ~]# awk -F ':' '$3<$4 {print $0}' test.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
user1:x:502:503::/home/user1:/bin/bash
#user10:x:5506:5507::/home/user10:/bin/bash
[root@niejicai-linux ~]# awk -F ':' '$3<$4' test.txt
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
user1:x:502:503::/home/user1:/bin/bash
#user10:x:5506:5507::/home/user10:/bin/bash
8.用 ':' 作为分隔符,打印第一段以及最后一段,并且中间用 '@' 连接 (例如,第一行应该是这样的形式 'root@/bin/bash' )
[root@niejicai-linux ~]# awk -F ':' '{print $1 "@" $NF}' test.txt
root@/bin/bash
bin@/sbin/nologin
daemon@/sbin/nologin
adm@/sbin/nologin
lp@/sbin/nologin
sync@/bin/sync
shutdown@/sbin/shutdown
halt@/sbin/halt
mail@/sbin/nologin
uucp@/sbin/nologin
operator@/sbin/nologin
games@/sbin/nologin
gopher@/sbin/nologin
ftp@/sbin/nologin
nobody@/sbin/nologin
dbus@/sbin/nologin
usbmuxd@/sbin/nologin
vcsa@/sbin/nologin
rtkit@/sbin/nologin
avahi-autoipd@/sbin/nologin
pulse@/sbin/nologin
haldaemon@/sbin/nologin
ntp@/sbin/nologin
apache@/sbin/nologin
saslauth@/sbin/nologin
postfix@/sbin/nologin
abrt@/sbin/nologin
gdm@/sbin/nologin
sshd@/sbin/nologin
tcpdump@/sbin/nologin
niejicai@/bin/bash
hacluster@/sbin/nologin
xiaonie@/bin/bash
user1@/bin/bash
user2@/bin/bash
#user10@/bin/bash
@
user20@/bin/bash
user41@/bin/bash
user42@/bin/bash
user4@/bin/bash
user0@/bin/bash

9.用 ':' 作为分隔符,把整个文档的第四段相加,求和




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值