Linux三剑客之awk命令详解
一、awk介绍
AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
快速掌握awk的技巧:只要记住awk是以行为单位读入和输出的。
二、awk常用选项和命令
-F | 指定字段一个或多个分割符 例如:-F'[:#/]' 定义三个分隔符 |
-v | 定义或修改一个awk内部的变量 |
NR | 行号 |
FS | 字段的分隔符,默认为空格,跟-F选择一样 |
OFS | 输出的字段分隔符,默认为空格(即把空格替换成指定的字符串) |
RS | 输入记录的分割,以分割符分割之后,使之成为新的行(即读入行的时候遇到指定分隔符,就把分割替换成\n)。 |
ORS | 输出的记录分隔符,默认为新行。(即读入行的时候遇到\n之后把\n用指定的分隔符代替,然后读入一行,并合并为同一行) |
$NF | 表示最后一列 |
$0 | 显示当前一整行 |
$N | N为数字(N>0),表示第几列。例如:$1表示用-F指定分隔符分隔后的第一列,$2...$N以此类推 |
{} | 命令代码块,包含一条或多条命令 |
; | 多条命令使用分号分隔 |
~ | 匹配字段,与==相比不是精确比较 |
!~ | 不匹配,不精确比较 |
== | 等于,必须全部相等,精确比较 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于,精确比较 |
&& | 逻辑与 |
|| | 逻辑或 |
+ | 匹配1个或1个以上 |
// | 正则匹配符 |
输出、打印 |
三、AWK的选项
选项 | 描述 |
-f progfile --file=progfile |
从脚本文件中读取awk命令 |
-F fs --field-separator=fs |
指定字段一个或多个分割符 例如:-F'[:#/]' 定义三个分隔符 |
-v var=val --assign var=val |
定义或修改一个awk内部的变量 |
-b --characters-as-bytes |
将所有输入数据视为单字节字符。posix选项或覆盖这个选项 |
-c --traditional |
在兼容模式下运行。在兼容模式下,gawk的行为与UNIX awk相同;没有一个可以识别特定于gn的扩展 |
-C --copyright |
在标准输出和退出中成功打印GNU版权信息消息的简短版本 |
-d[file] --dump-variables[=file] |
将全局变量的排序列表、它们的类型和最终值打印到文件中。如果没有提供文件,gawk使用一个名为awkvars的文件 |
-e 'program-text' --source='program-text' |
使用程序文本作为AWK程序源代码。这个选项允许轻松地将库函数(通过-f和-file选项使用)与在命令行中输入的源代码混合使用。它主要用于shell脚本中使用的中型到大型AWK程序 |
-E file --exec=file |
与-f类似,这是最后一个处理的选项。这应该与#一起使用!脚本,特别是为CGI应用程序,以避免从URL向命令行传递选项或源代码(!)。这个选项禁止命令行变量赋值 |
-g --gen-pot |
扫描和解析AWK程序,并在标准输出上生成GNU .pot(可移植对象模板)格式文件,其中包含程序中所有可本地化字符串的条目。程序本身没有执行。 |
-h --help |
简短的打印帮助 |
-L [fatal] --lint[=fatal] |
提供关于可疑或不可移植到其他AWK实现的构造的警告 |
-n --non-decimal-data |
识别输入数据中的八进制和十六进制值 |
-N --use-lc-numeric |
使用句点作为小数点 |
-O --optimize |
在程序的内部表示上启用优化。目前,这包括简单的常数合并 |
-p[file] --profile[=file] |
将分析数据发送到PROFIX文件。默认值是DouthPo.OUT |
-P --posix |
启动兼容模式;将有如下限制: |
-r --re-interval | 允许在正则表达式匹配中使用区间表达式 |
-R --command file | 只有DGAWK。从文件读取存储的调试器命令 |
-S --sandbox |
在沙盒模式下运行GOWK,禁用Stand()函数,用GETLIN输入重定向,输出Read打印和打印的方向,并加载动态扩展。命令执行(通过管道)也被禁用。这有效地阻止了脚本访问本地资源(除了 |
-t --lint-old | 提供对UNIX AWK原始版本不可移植的结构的警告 |
-V --version | 打印AWK的版本信息 |
四、AWK的环境变量
变量 | 描述 |
$N | N为数字(N>0),表示第几列。例如:$1表示用-F指定分隔符分隔后的第一列,$2...$N以此类推 |
$0 | 显示当前一整行 |
$NF | 表示最后一列 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g) |
ENVIRON | 环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
NR | 行号(当前记录数) |
FNR | 同NR,但相对于当前文件 |
FS | 字段的分隔符,默认为空格,跟-F选择一样 |
OFS | 输出的字段分隔符,默认为空格(即把空格替换成指定的字符串) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 当前记录中的字段数 |
OFMT | 数字的输出格式(默认值是%.6g) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 输入记录的分割,以分割符分割之后,使之成为新的行(即读入行的时候遇到指定分隔符,就把分割替换成\n(默认是\n)) |
ORS | 输出的记录分隔符,默认为新行。(即读入行的时候遇到\n之后把\n用指定的分隔符代替,然后读入一行,并合并为同一行)(默认值是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是\034) |
五、AWK的运算符
运算符 | 描述 |
= += -= *= /= %= ^= **= | 赋值 |
条件表达式?值1:值2 | 三目运算符 |
|| | 逻辑或 |
&& | 逻辑与 |
~ ~! | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接符 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 幂运算符 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
六、AWK的内置的字符串函数
函数名称 | 描述 |
gsub(r,s) | 在整个$0中用s代替r |
gsub(r,s,t) | 在整个t中用s替代r |
index(s,t) | 返回s中字符串t的第一位置 |
length(s) | 返回s长度 |
match(s,r) | 测试s是否包含匹配r的字符串 |
split(s,a,fs) | 在fs上将s分成序列a |
sprint(fmt,exp) | 返回经fmt格式化后的exp |
sub(r,s) | 用$0中最左边最长的子串代替s |
substr(s,p) | 返回字符串s中从p开始的后缀部分 |
substr(s,p,n) | 返回字符串s中从p开始长度为n的后缀部分 |
七、AWK使用演示
1、演示文本
[root@WT 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 [root@WT 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的使用
•显示行号
[root@WT 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
•指定行号,与"=="一起使用(下列例如为显示文本第二行)
[root@WT data]# awk 'NR==2 {print}' test.txt halt:x:7:0:halt:/sbin:/sbin/halt
4、$0的使用
•$0显示当前的一行
[root@WT 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 [root@WT data]# awk -F ":" 'NR==2 {print $0}' test.txt 2 halt:x:7:0:halt:/sbin:/sbin/halt 3 [root@WT data]# awk -F ":" 'NR==2 {print $1,$NF}' test.txt 4 halt /sbin/halt
#例子说明:使用-F选项指定分隔符为" 0/"(空格、数字0、/),取出文件的权限644
1 [root@WT 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 [root@WT data]# stat test.txt |awk -F "[ 0/]" 'NR==4{print $3}' 11 644
6、>=和<=的使用(其他运算法与之相同)
#例子说明:输出行号大于5的行
[root@WT 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的行
[root@WT 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的行
[root@WT 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的行
[root@WT 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 [root@WT ~]# 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 [root@WT ~]# 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 [root@WT ~]# 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的数值可以获取到端口号,但是却不能使全部需要匹配的服务得到对应的端口号,这是因为-F选项指定的空格分隔符是一个一个匹配,而默认的awk命令是以空格+匹配空格,所以第二个例子指定[空格/]+就可以是所需查询的服务截取出端口了。
9、if( 条件){ 符合条件之后执行的语句 } else { 条件不成立时执行的语句 } AWK的流程控制语句 注意,如果执行语句不用{ }符号括起来,那么在后面加";"分号
1 [root@WT data]# awk '{if(NR%2==0){print NR,$0} else if(NR==19){print "我是空行"} else{print "我是奇数行"}}' test.txt 2 我是奇数行 3 2 halt:x:7:0:halt:/sbin:/sbin/halt 4 我是奇数行 5 4 operator:x:11:0:operator:/root:/sbin/nologin 6 我是奇数行 7 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 8 我是奇数行 9 8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 10 我是奇数行 11 10 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 12 我是奇数行 13 12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 14 我是奇数行 15 14 abrt:x:173:173::/etc/abrt:/sbin/nologin 16 我是奇数行 17 16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 18 我是奇数行 19 18 test2:x:1001:1001::/home/test2:/bin/bash 20 我是空行 21 [root@WT data]# awk '{if(NR%2==0) print NR,$0; else if(NR==19) print "我是空行";else print "我是奇数行";}' test.txt 22 我是奇数行 23 2 halt:x:7:0:halt:/sbin:/sbin/halt 24 我是奇数行 25 4 operator:x:11:0:operator:/root:/sbin/nologin 26 我是奇数行 27 6 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 28 我是奇数行 29 8 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 30 我是奇数行 31 10 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 32 我是奇数行 33 12 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 34 我是奇数行 35 14 abrt:x:173:173::/etc/abrt:/sbin/nologin 36 我是奇数行 37 16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 38 我是奇数行 39 18 test2:x:1001:1001::/home/test2:/bin/bash 40 我是空行
10、BEGIN { 初始化某些变量 } { 根据初始化的变量执行语句 } END { 结束之后执行的语句 }
语句说明:BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。
[root@WT data]# wc -l test.txt 19 test.txt [root@WT data]# awk 'BEGIN{i=1}{i+=1}END{print i}' test.txt 20
12、while循环
例子说明:让演示文本每行语句输出两次
1 [root@WT data]# awk '{i=1;while(i<=2){print $0;i+=1}}' test.txt 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 3 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 4 halt:x:7:0:halt:/sbin:/sbin/halt 5 halt:x:7:0:halt:/sbin:/sbin/halt 6 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 7 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 8 operator:x:11:0:operator:/root:/sbin/nologin 9 operator:x:11:0:operator:/root:/sbin/nologin 10 games:x:12:100:games:/usr/games:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 14 ntp:x:38:38::/etc/ntp:/sbin/nologin 15 ntp:x:38:38::/etc/ntp:/sbin/nologin 16 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 17 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 18 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 19 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 22 dbus:x:81:81:System message bus:/:/sbin/nologin 23 dbus:x:81:81:System message bus:/:/sbin/nologin 24 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 25 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 26 nobody:x:99:99:Nobody:/:/sbin/nologin 27 nobody:x:99:99:Nobody:/:/sbin/nologin 28 abrt:x:173:173::/etc/abrt:/sbin/nologin 29 abrt:x:173:173::/etc/abrt:/sbin/nologin 30 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 31 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 32 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 33 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 34 wt:x:1000:1000:wt:/home/wt:/bin/bash 35 wt:x:1000:1000:wt:/home/wt:/bin/bash 36 test2:x:1001:1001::/home/test2:/bin/bash 37 test2:x:1001:1001::/home/test2:/bin/bash
13、do-while循环
1 [root@WT data]# awk '{i=1;do{print $0;i+=1}while(i<1)}' 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
14、RS的使用
1 [root@WT 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
15、ORS的使用
1 [root@WT 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 [root@WT 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==
16、FS的使用
1 [root@WT data]# awk 'BEGIN{FS=":"}{print $1}' test.txt 2 shutdown 3 halt 4 mail 5 operator 6 games 7 ftp 8 ntp 9 apache 10 tss 11 sshd 12 dbus 13 postfix 14 nobody 15 abrt 16 systemd-network 17 polkitd 18 wt 19 test2
17、OFS的使用
1 [root@WT data]# echo "1 2"|awk 'BEGIN{OFS="&"}{$1=$1;print $0}' 2 1&2
18、for循环的使用
格式:
for(初始表达式;终止条件;步长表达式) {语句}
例子说明:把演示文本的每行语句输出两次
1 [root@WT data]# awk '{for(i=0;i<2;i++){print $0}}' test.txt 2 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 3 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 4 halt:x:7:0:halt:/sbin:/sbin/halt 5 halt:x:7:0:halt:/sbin:/sbin/halt 6 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 7 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 8 operator:x:11:0:operator:/root:/sbin/nologin 9 operator:x:11:0:operator:/root:/sbin/nologin 10 games:x:12:100:games:/usr/games:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 14 ntp:x:38:38::/etc/ntp:/sbin/nologin 15 ntp:x:38:38::/etc/ntp:/sbin/nologin 16 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 17 apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 18 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 19 tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin 20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 21 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin 22 dbus:x:81:81:System message bus:/:/sbin/nologin 23 dbus:x:81:81:System message bus:/:/sbin/nologin 24 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 25 postfix:x:89:89::/var/spool/postfix:/sbin/nologin 26 nobody:x:99:99:Nobody:/:/sbin/nologin 27 nobody:x:99:99:Nobody:/:/sbin/nologin 28 abrt:x:173:173::/etc/abrt:/sbin/nologin 29 abrt:x:173:173::/etc/abrt:/sbin/nologin 30 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 31 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin 32 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 33 polkitd:x:999:998:User for polkitd:/:/sbin/nologin 34 wt:x:1000:1000:wt:/home/wt:/bin/bash 35 wt:x:1000:1000:wt:/home/wt:/bin/bash 36 test2:x:1001:1001::/home/test2:/bin/bash 37 test2:x:1001:1001::/home/test2:/bin/bash
19、AWK的数组使用
#awk数组简单使用
1 [root@WT ~]# awk 'BEGIN{arr[0]="hello world";arr[1]="hello world2";for(i in arr)print arr[i]}' 2 hello world 3 hello world2 4 [root@WT ~]# awk 'BEGIN{arr[0]="hello world";arr[1]="hello world2";for(i=0;i<length(arr);i++)print arr[i]}' 5 hello world 6 hello world2
#统计IP数量
1 [root@WT data]# cat test2.txt 2 10.0.0.5 3 10.0.0.2 4 10.0.0.2 5 10.0.0.1 6 10.0.0.3 7 10.0.0.4 8 10.0.0.5 9 10.0.0.8 10 10.0.0.7 11 10.0.0.4 12 10.0.0.6 13 10.0.0.19 14 10.0.0.1 15 10.0.0.1 16 [root@WT data]# awk '{arr[$1]++} END {for(key in arr) print arr[key],key}' test2.txt |sort -nr 17 3 10.0.0.1 18 2 10.0.0.5 19 2 10.0.0.4 20 2 10.0.0.2 21 1 10.0.0.8 22 1 10.0.0.7 23 1 10.0.0.6 24 1 10.0.0.3 25 1 10.0.0.19