Linux三剑客值awk命令详解

Posted wutao666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux三剑客值awk命令详解相关的知识,希望对你有一定的参考价值。

一、awk介绍

AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

快速掌握awk的技巧:只要记住awk是以行为单位读入和输出的。

二、awk命令模式

-F 指定字段一个或多个分割符 例如:-F‘[:#/]‘   定义三个分隔符
-v 定义或修改一个awk内部的变量
NR 行号
RS 输入记录的分割,以分割符分割之后,使之成为新的行(即读入行的时候遇到指定分隔符,就把分割替换成 )。
ORS 输出的记录分隔符,默认为新行。(即读入行的时候遇到 之后把 用指定的分隔符代替,然后读入一行,并合并为同一行)
$NF 表示最后一列
$0 显示当前一整行
$N N为数字,表示第几列。例如:$1表示用-F指定分隔符分隔后的第一列,$2...$N以此类推
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
~ 匹配字段,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
> 大于
< 小于
>= 大于等于
<= 小于等于
!=  不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配1个或1个以上
// 正则匹配符
print 输出、打印

三、使用演示

1、演示文本

[[email protected] data]# cat test.txt 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
wt:x:1000:1000:wt:/home/wt:/bin/bash
test2:x:1001:1001::/home/test2:/bin/bash

2、{}命令代码块及print的使用

?{}  代码块

?print   输入、打印内容

 1 [[email protected] data]# awk {print} test.txt 
 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 3 halt:x:7:0:halt:/sbin:/sbin/halt
 4 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
 5 operator:x:11:0:operator:/root:/sbin/nologin
 6 games:x:12:100:games:/usr/games:/sbin/nologin
 7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 8 ntp:x:38:38::/etc/ntp:/sbin/nologin
 9 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
10 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
11 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
12 dbus:x:81:81:System message bus:/:/sbin/nologin
13 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
14 nobody:x:99:99:Nobody:/:/sbin/nologin
15 abrt:x:173:173::/etc/abrt:/sbin/nologin
16 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
17 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
18 wt:x:1000:1000:wt:/home/wt:/bin/bash
19 test2:x:1001:1001::/home/test2:/bin/bash

3、NR的使用

?显示行号

[[email protected] data]# awk {print NR} test.txt 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

?指定行号,与"=="一起使用(下列例如为显示文本第二行)

[[email protected] data]# awk NR==2 {print} test.txt 
halt:x:7:0:halt:/sbin:/sbin/halt

4、$0的使用

?$0显示当前的一行

[[email protected] data]# awk {print NR $0} test.txt 
1shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2halt:x:7:0:halt:/sbin:/sbin/halt
3mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
4operator:x:11:0:operator:/root:/sbin/nologin
5games:x:12:100:games:/usr/games:/sbin/nologin
6ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7ntp:x:38:38::/etc/ntp:/sbin/nologin
8apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
9tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
10sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
11dbus:x:81:81:System message bus:/:/sbin/nologin
12postfix:x:89:89::/var/spool/postfix:/sbin/nologin
13nobody:x:99:99:Nobody:/:/sbin/nologin
14abrt:x:173:173::/etc/abrt:/sbin/nologin
15systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17wt:x:1000:1000:wt:/home/wt:/bin/bash
18test2:x:1001:1001::/home/test2:/bin/bash
19

5、-F与$N(N为数字)、$NF的使用

#例子说明:使用-F选项指定分隔符为":"冒号,输入切割后的$1(第一列)和$NF(最后一列)

1 [[email protected] data]# awk -F ":" NR==2 {print $0} test.txt 
2 halt:x:7:0:halt:/sbin:/sbin/halt
3 [[email protected] data]# awk -F ":" NR==2 {print $1,$NF} test.txt 
4 halt /sbin/halt

#例子说明:使用-F选项指定分隔符为" 0/"(空格、数字0、/),取出文件的权限644

 1 [[email protected] data]# stat test.txt 
 2   File: ‘test.txt’
 3   Size: 891           Blocks: 8          IO Block: 4096   regular file
 4 Device: 802h/2050d    Inode: 3407880     Links: 1
 5 Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
 6 Access: 2018-09-30 19:04:00.755834056 +0800
 7 Modify: 2018-09-30 19:03:12.389575356 +0800
 8 Change: 2018-09-30 19:03:57.494833754 +0800
 9  Birth: -
10 [[email protected] data]# stat test.txt |awk -F "[ 0/]" NR==4{print $3}
11 644

6、>=和<=的使用(其他运算法与之相同)

#例子说明:输出行号大于5的行

[[email protected] data]# awk NR>=5{print NR,$0} test.txt 
5 games:x:12:100:games:/usr/games:/sbin/nologin
6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7 ntp:x:38:38::/etc/ntp:/sbin/nologin
8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
9 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
10 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
11 dbus:x:81:81:System message bus:/:/sbin/nologin
12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 abrt:x:173:173::/etc/abrt:/sbin/nologin
15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 wt:x:1000:1000:wt:/home/wt:/bin/bash
18 test2:x:1001:1001::/home/test2:/bin/bash
19 

#例子说明:输出行号小于5的行

[[email protected] data]# awk NR<=5{print NR,$0} test.txt 
1 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2 halt:x:7:0:halt:/sbin:/sbin/halt
3 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
4 operator:x:11:0:operator:/root:/sbin/nologin
5 games:x:12:100:games:/usr/games:/sbin/nologin

7、&&与||的使用

#例子说明:输出行号大于5且小于10的行

[[email protected] data]# awk NR>5 && NR<10 {print NR,$0} test.txt 
6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
7 ntp:x:38:38::/etc/ntp:/sbin/nologin
8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
9 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

#例子说明:输出行号小于5或行号大于10的行

[[email protected] data]# awk NR<5 || NR>10 {print NR,$0} test.txt 
1 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2 halt:x:7:0:halt:/sbin:/sbin/halt
3 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
4 operator:x:11:0:operator:/root:/sbin/nologin
11 dbus:x:81:81:System message bus:/:/sbin/nologin
12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 abrt:x:173:173::/etc/abrt:/sbin/nologin
15 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 wt:x:1000:1000:wt:/home/wt:/bin/bash
18 test2:x:1001:1001::/home/test2:/bin/bash
19

8、//和~、+的使用

?//  使用正则匹配的格式,//中间放置匹配的内容

?~  匹配//中防止的内容

?+  匹配一个或者多个

例子说明:列出/etc/servicesx文件中(http|https|mysql|ssh|telnet|ftp)的端口号,由于/etc/service的文件内容每行有多个空格,所以使用"+"把多个空格和/合并为一个再进行切割。

可以看如下例子加"+"符号与不加"+"所使用的$N的N的数字为多少。

 1 [[email protected] ~]# awk -F "[ /]" $1~/^(http|https|ssh)$/{print $0} /etc/services
 2 ssh             22/tcp                          # The Secure Shell (SSH) Protocol
 3 ssh             22/udp                          # The Secure Shell (SSH) Protocol
 4 http            80/tcp          www www-http    # WorldWideWeb HTTP
 5 http            80/udp          www www-http    # HyperText Transfer Protocol
 6 http            80/sctp                         # HyperText Transfer Protocol
 7 https           443/tcp                         # http protocol over TLS/SSL
 8 https           443/udp                         # http protocol over TLS/SSL
 9 https           443/sctp                        # http protocol over TLS/SSL
10 ssh             22/sctp                 # SSH
11 [[email protected] ~]# awk -F "[ /]" $1~/^(http|https|ssh)$/{print $1,$14} /etc/services
12 ssh 22
13 ssh 22
14 http tcp
15 http udp
16 http sctp
17 https 
18 https 
19 https 
20 ssh 22
21 [[email protected] ~]# awk -F "[ /]+" $1~/^(http|https|ssh)$/{print $1,$2} /etc/services
22 ssh 22
23 ssh 22
24 http 80
25 http 80
26 http 80
27 https 443
28 https 443
29 https 443
30 ssh 22

注意:不加"+"符号,从例子可以看到,虽然通过加大$N的N的数值,但是却不能使全部需要匹配的服务得到对应的端口号,这是因为每个服务名称与端口号之间空格的个数不一致所导致的(跟服务名的字符长度有关),导致每行的$N增加,而且每行增加的列数还不一样;加"+"符号的,可以看到所有匹配的服务都得到了对应的端口号,符号"+"使$N(N为数字)匹配得更精准,所有指定多个分隔符的时候建议使用符号"+"。

 9、RS的使用

技术分享图片
  1 [[email protected] data]# awk BEGIN{RS=":"}{print $0} test.txt 
  2 shutdown
  3 x
  4 6
  5 0
  6 shutdown
  7 /sbin
  8 /sbin/shutdown
  9 halt
 10 x
 11 7
 12 0
 13 halt
 14 /sbin
 15 /sbin/halt
 16 mail
 17 x
 18 8
 19 12
 20 mail
 21 /var/spool/mail
 22 /sbin/nologin
 23 operator
 24 x
 25 11
 26 0
 27 operator
 28 /root
 29 /sbin/nologin
 30 games
 31 x
 32 12
 33 100
 34 games
 35 /usr/games
 36 /sbin/nologin
 37 ftp
 38 x
 39 14
 40 50
 41 FTP User
 42 /var/ftp
 43 /sbin/nologin
 44 ntp
 45 x
 46 38
 47 38
 48 
 49 /etc/ntp
 50 /sbin/nologin
 51 apache
 52 x
 53 48
 54 48
 55 Apache
 56 /usr/share/httpd
 57 /sbin/nologin
 58 tss
 59 x
 60 59
 61 59
 62 Account used by the trousers package to sandbox the tcsd daemon
 63 /dev/null
 64 /sbin/nologin
 65 sshd
 66 x
 67 74
 68 74
 69 Privilege-separated SSH
 70 /var/empty/sshd
 71 /sbin/nologin
 72 dbus
 73 x
 74 81
 75 81
 76 System message bus
 77 /
 78 /sbin/nologin
 79 postfix
 80 x
 81 89
 82 89
 83 
 84 /var/spool/postfix
 85 /sbin/nologin
 86 nobody
 87 x
 88 99
 89 99
 90 Nobody
 91 /
 92 /sbin/nologin
 93 abrt
 94 x
 95 173
 96 173
 97 
 98 /etc/abrt
 99 /sbin/nologin
100 systemd-network
101 x
102 192
103 192
104 systemd Network Management
105 /
106 /sbin/nologin
107 polkitd
108 x
109 999
110 998
111 User for polkitd
112 /
113 /sbin/nologin
114 wt
115 x
116 1000
117 1000
118 wt
119 /home/wt
120 /bin/bash
121 test2
122 x
123 1001
124 1001
125 
126 /home/test2
127 /bin/bash
View Code

10、ORS的使用

技术分享图片
 1 [[email protected] data]# cat test.txt 
 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 3 halt:x:7:0:halt:/sbin:/sbin/halt
 4 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
 5 operator:x:11:0:operator:/root:/sbin/nologin
 6 games:x:12:100:games:/usr/games:/sbin/nologin
 7 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 8 ntp:x:38:38::/etc/ntp:/sbin/nologin
 9 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
10 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
11 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
12 dbus:x:81:81:System message bus:/:/sbin/nologin
13 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
14 nobody:x:99:99:Nobody:/:/sbin/nologin
15 abrt:x:173:173::/etc/abrt:/sbin/nologin
16 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
17 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
18 wt:x:1000:1000:wt:/home/wt:/bin/bash
19 test2:x:1001:1001::/home/test2:/bin/bash
20 
21 [[email protected] data]# awk BEGIN{ORS="="}{print $0} test.txt 
22 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown=halt:x:7:0:halt:/sbin:/sbin/halt=mail:x:8:12:mail:/var/spool/mail:/sbin/nologin=operator:x:11:0:operator:/root:/sbin/nologin=games:x:12:100:games:/usr/games:/sbin/nologin=ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin=ntp:x:38:38::/etc/ntp:/sbin/nologin=apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin=tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin=sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin=dbus:x:81:81:System message bus:/:/sbin/nologin=postfix:x:89:89::/var/spool/postfix:/sbin/nologin=nobody:x:99:99:Nobody:/:/sbin/nologin=abrt:x:173:173::/etc/abrt:/sbin/nologin=systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin=polkitd:x:999:998:User for polkitd:/:/sbin/nologin=wt:x:1000:1000:wt:/home/wt:/bin/bash=test2:x:1001:1001::/home/test2:/bin/bash==
View Code

 


以上是关于Linux三剑客值awk命令详解的主要内容,如果未能解决你的问题,请参考以下文章

shell命令三剑客之awk命令详解,cut命令,linux里记录行踪(操作记录)

Linux三剑客AwkSedGrep 命令详解

Linux三剑客awk命令篇二:命令操作符

Linux文本三剑客之一——awk详解——awk看这两篇就够啦~PS:文末有练习,来练练手吧

linux awk命令详解

Linux文本处理三剑客grepsedawk用法详解