Linux命令学习之awk

  • 输出netstat命令的第一列和第四列
netstat | awk '{print $1 $4}' 
  • awk命令中语句被单引号中的大括号括着(只能被单引号包含)
  • $1...$n表示第几列,$0表示整行
  • awk可以进行格式输出
netstat | awk '{printf "%-8s %-8s\n",$1,$2}'
  • awk可用来过滤记录,比如过滤条件为:第三列值为0&第六列值为LISTEN
awk '$3==0 && $6=="LISTEN"'
  • 需要保留表头可以引入内建变量NR
awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-8s %-20s",$1,$5}' netstat.txt
  • awk中的内建变量
变量名 说明
$0 当前记录行
$1~$n 当前记录的第n个字段,字段间隔由FS分隔
FS 字段分隔符,默认是空格或tab
NF 当前记录行的字段数
NR 行号,从1开始
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 行分隔符,默认为换行符
OFS 输出的字段分隔符,默认空格
ORS 输出的行分隔符,默认换行符
FILENAME 当前输入文件的名字
  • awk指定分隔符
netstat | awk 'FS=":" {print $1,$3,$6}'
netstat | awk -F: '{print $1,$3,$6}'
//多个分隔符可以用-F '[;:]'指定
  • awk可以像grep一样去进行字符串匹配
netstat | awk '/LISTEN/'   //匹配包含LISTEN
netstat | awk '/FIN|TIME/' //匹配包含FIN或TIME
netstat | awk '!/LISTEN/'  //匹配不包含LISTEN
netstat | awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$1,$4,$6} OFS="\t"' //第六列模式匹配,~表示模式开始
netstat | awk '$6 !~ /LISTEN/ || NR==1 {print NR,$1,$4,$6} OFS="\t"' //匹配第六列不包含
  • awk拆分文件
awk 'NR!=1{print > $6}' netstat.txt //按照第六列拆分文件,文件名问第六列的值
awk 'NR!=1{print $4,$5 > $6}' netstat.txt //拆分文件时,只输出指定列
awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt" }' netstat.tx //更加复杂的拆分
  • awk统计信息
ls -l  *.cpp *.c *.h | awk '{sum+=$5} END {print sum}' //统计所有C、CPP、H文件的文件大小总和
awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.txt //统计所有connection状态
ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}' //统计每个用户进行占了多少内存
  • awk可以作为一种语言来编写脚本。
    • BEGIN
    • END
  • 现有文件score.txt和awk脚本cal.awk
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
#!/bin/awk -f
#运行前
BEGIN {
    math = 0
    english = 0
    computer = 0
    printf "NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL\n"
    printf "---------------------------------------------\n"
}
#运行中
{
    math+=$3
    english+=$4
    computer+=$5
    printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
    printf "---------------------------------------------\n"
    printf "  TOTAL:%10d %8d %8d \n", math, english, computer
    printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
  • 执行awk脚本命令
awk -f cal.awk score.txt
NAME    NO.   MATH  ENGLISH  COMPUTER   TOTAL
---------------------------------------------
Marry  2143     78       84       77      239
Jack   2321     66       78       45      189
Tom    2122     48       77       71      196
Mike   2537     87       97       95      279
Bob    2415     40       57       62      159
---------------------------------------------
  TOTAL:       319      393      350
AVERAGE:     63.80    78.60    70.00
  • 几个小栗子
#从file文件中找出长度大于80的行
awk 'length>80' file

#按连接数查看客户端IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

#打印99乘法表
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 
posted @ 2021-01-26 16:35  無花無酒鋤作田  阅读(141)  评论(0编辑  收藏  举报