awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。
依次对每一行进行处理,然后输出
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
FNR 浏览文件的记录数
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
[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字母
[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个字段并以制表符作为新的分隔符进行打印输出
[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的行
[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(i1 ? "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
#除法运算,并对最后的值取整
[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
[root@myhost script]# awk -F ":" 'BEGIN{i=1} {while(i
数组
[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
你可能感兴趣的:(Linux命令,基础练习,面试题,系统命令)