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个以上
// 正则匹配符
print 输出、打印

三、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

启动兼容模式;将有如下限制:
<1>无法识别\x
<2>当FS被设置为单个空间时,只有空格和Tab充当字段分隔符,换行符不被设置为分隔符
<3>之后行不能有?和:
<4>关键字函数的同义词FUNC不被识别
<5>运算符**和**=不能代替^和^=

-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 我是空行
View Code

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
View Code

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
View Code

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
View Code

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==
View Code

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
View Code

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
View Code

 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
View Code

 

posted @ 2018-09-30 20:08  深巷老猫  阅读(3736)  评论(0编辑  收藏  举报