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个以上 |
// | 正则匹配符 |
输出、打印 |
三、使用演示
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
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==
以上是关于Linux三剑客值awk命令详解的主要内容,如果未能解决你的问题,请参考以下文章
shell命令三剑客之awk命令详解,cut命令,linux里记录行踪(操作记录)