linux系统命令awk详解

目录

命令介绍

awk是行处理器

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。

awk处理过程

依次对每一行进行处理,然后输出

awk命令形式

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file

awk命令参数解释
  1. [-F|-f|-v] 大参数,其中-F指定分隔符;-f调用脚本;-v定义变量 var=value
  2. ’ ’ 引用代码块
  3. BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
  4. // 匹配代码块,可以是字符串或正则表达式
  5. {} 命令代码块,包含一条或多条命令
  6. ; 多条命令使用分号分隔
  7. END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
    awk内置变量,awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。

FNR 浏览文件的记录数

awk特殊要点/内置变量

print 打印指定内容的主要命令
$0 表示整个当前行或者整个文件的内容
$1 每行第一个字段
\t 制表符
\n 换行符
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&&  逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
-F’[:#/]’ 指定分隔符/字符串/正则表达式 这里是定义三个分隔符
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
FS BEGIN时定义分隔符
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名

实际演练

准备测试文本
#选取系统配置文件/etc/passwd前三行追加到/home/script/test.txt文件中
[root@myhost script]# pwd
/home/script
[root@myhost script]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 14 14:16 test.txt
[root@myhost script]# head -3 /etc/passwd  > /home/script/test.txt 
[root@myhost script]# cat /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
print 和 $0
[root@myhost script]# awk '{print}'  /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


[root@myhost script]# awk '{print $0}' /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@myhost script]# head -3 /home/script/test.txt | awk '{print}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@myhost script]# head -3 /home/script/test.txt |awk '{print $0}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#总结:awk '{print}' ==   awk '{print $0}' 
#完全打印输出每一行的内容
#######################################################################################

[root@myhost script]# awk '{print " "}'  /home/script/test.txt 
 
 
 
[root@myhost script]# 
#不输出文件每一行的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本

#######################################################################################

[root@myhost script]# awk '{print "a"}'  /home/script/test.txt 
a
a
a
[root@myhost script]# 
#输出相同个数的以a开头的行,一行只有一个a字母
$n
[root@myhost script]# awk -F  ":"  '{print $1}'  /home/script/test.txt
root
bin
daemon
#以":" 为分隔符,打印输出每一行的第一个字段的内容

#######################################################################################

[root@myhost script]# awk -F ":" '{print $1; print $2}' /home/script/test.txt
root
x
bin
x
daemon
x
#以":" 为分隔符,将每一行的第1个字段和第2个字段,分行输出,进一步理解一行一行处理文本

#######################################################################################

 [root@myhost script]# awk  -F ":" '{print $1,$3,$6}' OFS="\t"  /home/script/test.txt 
root    0       /root
bin     1       /bin
daemon  2       /sbin
#以":" 为分隔符,将每一行的第1个字段和第3个字段和第6个字段并以制表符作为新的分隔符进行打印输出

-F 指定分隔符/字符串/正则表达式
[root@myhost script]# cat /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@myhost script]# awk -F ":" '{print $1}'  test.txt /home/script/test.txt
root
bin
daemon

[root@myhost script]# awk -F ":" '{print $1 $2}'  /home/script/test.txt
rootx
binx
daemonx
#$1与$3相连输出,不分隔

[root@myhost script]# awk -F ":" '{print $1,$2}'  /home/script/test.txt   
root x
bin x
daemon x
#表达式里面多了一个逗号,打印输出时$1与$2使用空格分隔

[root@myhost script]# awk -F ":" '{print $1 " " $2}'  /home/script/test.txt 
root x
bin x
daemon x
#$1与$2之间手动添加空格分隔

[root@myhost script]# awk -F ":" '{print "Username:" $1 "\t\t Uid:" $3 }'  /home/script/test.txt 
Username:root            Uid:0
Username:bin             Uid:1
Username:daemon          Uid:2
#自定义格式内容输出


[root@myhost script]# awk -F ":" '{print NF}' /home/script/test.txt  
7
7
7
#显示每行总共有多少字段

[root@myhost script]# awk -F ":" '{print $NF}'  /home/script/test.txt  
/bin/bash
/sbin/nologin
/sbin/nologin
#将每行第NF个字段的值打印出来,NF的值是这行的总字段数,即可以理解为是打印输出每行最后一个字段的内容

[root@myhost script]# awk -F ":" ' NF==7 {print }'  /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
 #显示只有7个字段的行


[root@myhost script]# awk -F ":" 'NF>2{print $0}' /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#显示每行字段数量大于2的行

[root@myhost script]# awk '{print NR,$0}' /home/script/test.txt 
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
#显示输出每行的行号,每行的内容

[root@myhost script]# awk -F ":" '{print NR,NF,$NF,"\t",$0}' /home/script/test.txt
1 7 /bin/bash    root:x:0:0:root:/root:/bin/bash
2 7 /sbin/nologin        bin:x:1:1:bin:/bin:/sbin/nologin
3 7 /sbin/nologin        daemon:x:2:2:daemon:/sbin:/sbin/nologin
#依次打印输出每行行号,每行字段总数,每行最后一个字段的值,制表符,每行所有内容

[root@myhost script]# awk -F ":" 'NR==3{print}'  /home/script/test.txt   
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#显示输出第3行的内容

[root@myhost script]# awk -F ":" 'NR==2 || NR==3{print}'  /home/script/test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#显示输出第5行和第6行的内容

[root@myhost script]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.85     0.0.0.0         255.255.255.0   U     0      0        0 eth0
132.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.2.5     0.0.0.0         UG    0      0        0 eth0
[root@myhost script]# route -n|awk 'NR!=1{print}' 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.85     0.0.0.0         255.255.255.0   U     0      0        0 eth0
132.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.2.5     0.0.0.0         UG    0      0        0 eth0
#显示输出非第1行的内容

匹配代码块(正则表达式)
[root@myhost script]# cat /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@myhost script]# awk '/daemon/'  /home/script/test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#纯字符(串)匹配,显示输出包含字符(串)的行

[root@myhost script]# awk '/daemon/{print }'  /home/script/test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#纯字符(串)匹配,显示输出包含字符(串)的行

[root@myhost script]# awk '/daemon/{print $0}'  /home/script/test.txt  
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#纯字符(串)匹配,显示输出包含字符(串)的行
#以上三条命令结果一样

[root@myhost script]# awk '!/daemon/{print $0}'  /home/script/test.txt   
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#显示输出不匹配daemon的行

[root@myhost script]# awk '/daemon|root/{print}'  /home/script/test.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#显示输出包含daemon或root的行

[root@myhost script]# awk '!/daemon|root/{print}'  /home/script/test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
#显示输出不包含daemon或root的行

[root@myhost script]# awk -F: '/root/,/daemon/{print}'  /home/script/test.txt   
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#显示输出包含root~daemon区间的行

[root@myhost script]# awk '/[0][2][2]*/{print $0}'  /home/script/test.txt 
#显示输出包含02为数字开头的行,如02,022,0222...

[root@myhost script]# awk -F ":" '$1~/bin/{print $0}'  /home/script/test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
[root@myhost script]# awk -F: '{if($1~/bin/) print $0}'  /home/script/test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
#以":"为分隔符,显示输出第一个字段是bin的行

[root@myhost script]# awk -F: '$1!~/bin/{print $0}'  /home/script/test.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@myhost script]# awk -F: '{if($1!~/bin/) print $0}'  /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#以":"为分隔符,显示输出第一个字段不是bin的行

[root@myhost script]# awk -F: '$1!~/root|daemon/{print $0}'  /home/script/test.txt
bin:x:1:1:bin:/bin:/sbin/nologin
[root@myhost script]# awk -F: '{if($1!~/root|daemon/) print $0}'  /home/script/test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
#以":"为分隔符,显示输出第一个字段不是root也不是daemon的行
IF语句 必须用在{}中,且比较内容用()扩起来
[root@myhost script]# awk -F ":" '{if($1~/daemon/) print $0}' /home/script/test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#以":"为分隔符,显示输出第一个字段是daemon的行 (print简写)
[root@myhost script]# awk -F ":" '{if($1~/daemon/) {print $0}}'  /home/script/test.txt  
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#以":"为分隔符,显示输出第一个字段是daemon的行 (print全写)

[root@myhost script]# awk -F ":" '{if($1~/daemon/) {print $0} else {print $NF}}' /home/script/test.txt  
/bin/bash
/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#以":"为分隔符,显示输出第一个字段是daemon的整行,其他第一个字段不是daemon的行只显示输出本行最后一个字段 

[root@myhost script]# awk -F ":" '{if($3>1) print "large"; else print "small"}' /home/script/test.txt
small
small
large
#ID大于1的行,显示输出large,否则显示输出small。

[root@myhost script]# awk -F ":" 'BEGIN{A=0;B=0} {if($3>1) {A++; print "large"} else {B++; print "small"}} END{print A,"\t",B}' /home/script/test.txt 
small
small
large
1        2 
#ID大于1,A加1,否则B加1,最后显示输出的是large和small分别的总个数。
 
[root@myhost script]# awk -F ":" '{if($3<1) next; else print}' /home/script/test.txt  
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
#ID小于1的行跳过,否则显示输出

[root@myhost script]# awk -F ":" 'BEGIN{i=1} {if(i<NF) print NR,NF,i++ }' /home/script/test.txt   
1 7 1
2 7 2
3 7 3
[root@myhost script]# awk -F ":" 'BEGIN{i=1} {if(i<NF) print NR,NF,i++ }' /etc/passwd
1 7 1
2 7 2
3 7 3
4 7 4
5 7 5
6 7 6

[root@myhost script]# awk -F ":" 'BEGIN{i=1} {if(i<NF) {print NR,NF} i++ }' /home/script/test.txt
1 7
2 7
3 7
[root@myhost script]# awk -F ":" 'BEGIN{i=1} {if(i<NF) {print NR,NF} i++ }' /etc/passwd
1 7
2 7
3 7
4 7
5 7
6 7
#当i小于所在行字段总数时,输出指定的内容,否则跳过。

#另一种书写形式,三目运算符

[root@myhost script]# awk -F ":" '{print ($3>1 ? "yes":"no")}'  /home/script/test.txt
no
no
yes

[root@myhost script]# awk -F ":" '{print ($3>1 ? $3":\t yes":$3":\t no")}'  /home/script/test.txt
0:       no
1:       no
2:       yes
条件表达式 == != > >= < <=
[root@myhost script]# cat /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@myhost script]# awk -F ":" '$1=="daemon"{print $3}' /home/script/test.txt  
2
[root@myhost script]# awk -F ":" '{if($1=="daemon") print $3}' /home/script/test.txt 
2
#以":"为分隔符,显示输出第1个字段等于daemon的行的第3个字段的值 

[root@myhost script]# awk -F ":" '$1!="daemon"{print $3}' /home/script/test.txt
0
1
#以":"为分隔符,显示输出第1个字段不等于daemon的行的第3个字段的值 

[root@myhost script]# awk -F ":" '$3>1{print $0}' /home/script/test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#以":"为分隔符,显示输出第3个字段等于1的行

[root@myhost script]# awk -F":" '$3>=1{print $0}' /home/script/test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#以":"为分隔符,显示输出第3个字段大于等于1的行

[root@myhost script]# awk -F":" '$3<1{print $0}' /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
#以":"为分隔符,显示输出第3个字段小于1的行

[root@myhost script]# awk -F":" '$3<=1{print $0}' /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#以":"为分隔符,显示输出第3个字段小于等于1的行

[root@myhost script]# awk -F":" '$3=<1{print $0}' /home/script/test.txt 
awk: $3=<1{print $0}
awk:    ^ syntax error
#注意:小于等于是<=而不是=<,否则会报语法错误
逻辑运算符! && ||
[root@myhost script]# awk -F ":" '{if($1!~/daemon/) print $0 }'  /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@myhost script]# awk -F ":" '$1!~/daemon/ {print }' /home/script/test.txt  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
#逻辑非,$1匹配到daemon的行,不显示输出

[root@myhost script]# awk -F ":" '{if($3!=1) print }'  /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@myhost script]# awk -F ":" '$3!=1 {print }' /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#逻辑非,$3匹配到等于1的行,不显示输出


[root@myhost script]# awk -F ":" '$1~/daemon/ && $3>1 {print }' /home/script/test.txt  
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@myhost script]# awk -F ":" '{if($1~/daemon/ && $3>1) print }' /home/script/test.txt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#逻辑与,$1匹配daemon,并且要满足$3>1的行才能显示输出

[root@myhost script]# awk -F ":" '$1~/daemon/ || $3>=1 {print }' /home/script/test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@myhost script]# awk -F ":" '{if($1~/daemon/ || $3>=1) print }'  /home/script/test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#逻辑或,满足一个表达式成立就显示输出
数值运算
[root@myhost script]# cat /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@myhost script]# awk -F ":" '$3+$4 > 1' /home/script/test.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#加法运算

[root@myhost script]# awk -F ":" '/daemon|root/{print $3+10}' /home/script/test.txt 
10
12
#加法运算,第3个字段加10打印输出

[root@myhost script]# awk -F ":" '/daemon/{print $3-$4}' /home/script/test.txt 
0
#减法运算

[root@myhost script]# awk -F ":" '/daemon/{print $3*$4}' /home/script/test.txt
4
#乘法运算

[root@myhost script]# awk '/MemFree/{print $2/1024}' /proc/meminfo
13928.1
#除法运算

[root@myhost script]# awk '/MemFree/{print int($2/1024)}' /proc/meminfo
13928
#除法运算,并对最后的值取整
输出分隔符OFS
[root@myhost script]# cat /home/script/test.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@myhost script]# awk -F ":" '$1 ~ /bin/ && NR==2 {print NR,$4,$5,$6}' OFS="\t" /home/script/test.txt
2       1       bin     /bin     
#以":"为分隔符,显示输出字段6匹配bin且行号为2的行,其中输出每行行号,字段4,字段5,字段6的值,并使用制表符分割
输出处理结果到文件
①在命令代码块中直接输出  
route -n|awk 'NR!=1{print > "/home/script/fs.txt"}' 

[root@myhost script]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.85     0.0.0.0         255.255.255.0   U     0      0        0 eth0
132.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.2.5     0.0.0.0         UG    0      0        0 eth0
[root@myhost script]# route -n|awk 'NR!=1{print > "/home/script/fs.txt"}' 
[root@myhost script]# cat /home/script/fs.txt 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.85     0.0.0.0         255.255.255.0   U     0      0        0 eth0
132.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.2.5     0.0.0.0         UG    0      0        0 eth0
  
②使用重定向进行输出
route -n|awk 'NR!=1{print}' > /home/script/fs.txt

[root@myhost script]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.85     0.0.0.0         255.255.255.0   U     0      0        0 eth0
132.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.2.5     0.0.0.0         UG    0      0        0 eth0
[root@myhost script]# route -n|awk 'NR!=1{print}' > /home/script/fs.txt
[root@myhost script]# cat /home/script/fs.txt 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.2.85     0.0.0.0         255.255.255.0   U     0      0        0 eth0
132.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.2.5     0.0.0.0         UG    0      0        0 eth0
格式化输出
netstat -anp|head -5 |awk '{printf "%-8s %-8s %-8s %-10s %-20s %-20s\n",NR,$1,$2,$3,$4,$5}' 
printf表示格式化输出
%表示格式化输出分隔符
-数字表示长度为格式化输出时字段长度是多少个字符
s表示格式化输出的字段是字符串类型

[root@myhost script]# netstat -anp|head -5 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:33578               0.0.0.0:*                   LISTEN      42081/fdfs_trackerd 
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1478/rpcbind        
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      57843/nginx                
[root@myhost script]# netstat -anp|head -5 |awk '{printf "%-8s %-8s %-8s %-10s %-20s %-20s\n",NR,$1,$2,$3,$4,$5}' 
1        Active   Internet connections (servers             and                 
2        Proto    Recv-Q   Send-Q     Local                Address             
3        tcp      0        0          0.0.0.0:33578        0.0.0.0:*           
4        tcp      0        0          0.0.0.0:111          0.0.0.0:*           
5        tcp      0        0          0.0.0.0:8080         0.0.0.0:*  
#打印输出每行前指定字段,按照顺序第1个输出字符串类型(长度为8),第2个输出字符串类型(长度为8),第3个输出字符串类型(长度为8) 第4个输出字符串类型(长度为10) 第5个输出字符串类型(长度为20) 第6个输出字符串类型(长度为20)

[root@myhost script]# netstat -anp|awk '$6=="LISTEN" || NR==1 {print $0}'
Active Internet connections (servers and established)
tcp        0      0 0.0.0.0:33578               0.0.0.0:*                   LISTEN      42081/fdfs_trackerd 
tcp        0      0 0.0.0.0:1117                 0.0.0.0:*                   LISTEN     1478/rpcbind        
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      57843/nginx         
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      41204/sshd  

[root@myhost script]# netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s %-10s \n",NR,$1,$2,$4}'
1          Active     Internet   (servers   
3          tcp        0          0.0.0.0:22122 
4          tcp        0          0.0.0.0:111 
5          tcp        0          0.0.0.0:8080

while语句
[root@myhost script]# awk -F ":" 'BEGIN{i=1} {while(i<NF) print NF,$i,i++}' /home/script/test.txt 
7 root 1
7 x 2
7 0 3
7 0 4
7 root 5
7 /root 6
数组
[root@myhost script]# netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"\t",a[i]}'
CONNECTED        70
1556/cupsd       1
10155    1
10137    1
1500/rpc.statd   3
10156    1
13996    1
14244    1
13362    1
12660    1
1478/rpcbind     4
14155    1
280578   1
410296   1
ESTABLISHED      3
447818   1
I-Node   1
50453    1
STREAM   29
14176    1
and      1
13295    1
Foreign          1
12990    1
13684    1
LISTEN   14
[root@myhost script]# netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s \n", i,"\t",a[i]}'
CONNECTED                         70    
1556/cupsd                        1     
10155                             1     
10137                             1     
1500/rpc.statd                    3     
10156                             1     
13996                             1     
14244                             1     
13362                             1     
12660                             1     
1478/rpcbind                      4     
14155                             1     
280578                            1     
410296                            1     
ESTABLISHED                       3     
447818                            1     
I-Node                            1     
50453                             1     
STREAM                            29    
14176                             1     
and                               1     
13295                             1     
Foreign                           1     
12990                             1     
13684                             1     
LISTEN                            14 

应用场景

应用1
awk -F: '{print NF}' /home/script/test.txt                                                      #输出文件每行有多少字段
awk -F: '{print $1,$2,$3,$4,$5}' /home/script/test.txt                                #输出前5个字段
awk -F: '{print $1,$2,$3,$4,$5}' OFS='\t' /home/script/test.txt                #输出前5个字段并使用制表符分隔输出
awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='\t' /home/script/test.txt          #制表符分隔输出前5个字段,并打印行号
应用2
awk -F'[:#]' '{print NF}'  /home/script/test.txt                                                 #指定多个分隔符: #,输出每行多少字段
awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='\t' /home/script/test.txt  #制表符分隔输出多字段
应用3
awk -F'[:#/]' '{print NF}' /home/script/test.txt                                              #指定三个分隔符,并输出每行字段数
awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' /home/script/test.txt    #制表符分隔输出多字段
应用4
计算/home目录下,普通文件的大小,使用KB作为单位
[root@myhost script]# ls -l /home |awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'
total size is: 193548 KB
[root@myhost script]# ls -l /home |awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}'
total size is: 193547 KB
#int是取整的意思
应用5
统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少
[root@myhost script]# netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'
CONNECTED         70  
LISTEN            14 
应用6
统计/home目录下不同用户的普通文件的总数是多少?
ls -l /home|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s \n",i," ",sum[i]}'   
mysql        199 
root         374 
统计/home目录下不同用户的普通文件的大小总size是多少?
ls -l /home|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s \n",i," ",sum[i]/1024/1024,"MB"}'
应用7
输出成绩表
[root@myhost script]# cat /home/script/test0.log 
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

[root@myhost script]# awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno.   Name    No.    Math   English   Computer    Total\n";printf "------------------------------------------------------------\n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s \n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------------------------------------------------------\n";printf "%-24s %-7s %-9s %-20s \n","Total:",math,eng,com;printf "%-24s %-7s %-9s %-20s \n","Avg:",math/NR,eng/NR,com/NR}' /home/script/test0.log
Lineno.   Name    No.    Math   English   Computer    Total
------------------------------------------------------------
        239      2143    78      84        77
        189      2321    66      78        45
        196      2122    48      77        71
        279      2537    87      97        95
5        Bob     2415    40      57        62         159     
------------------------------------------------------------
Total:                   319     393       350                  
Avg:                     63.8    78.6      70     

猜你喜欢

转载自blog.csdn.net/yuki5233/article/details/87271035