您的位置:首页 > 其它

20151203正则第五部分(awk)

2015-12-04 09:16 281 查看
描述: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 ~]#

[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 ~]#

[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 ~]#

[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
[root@niejicai-linux ~]#

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
[root@niejicai-linux ~]#

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
roooooot@roooooot
rot@rot
rt@rt
root@root
@
user20@/bin/bash
user41@/bin/bash
user42@/bin/bash
user4@/bin/bash
user0@/bin/bash
[root@niejicai-linux ~]#

9.用 ':' 作为分隔符,把整个文档的第四段相加,求和
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: