netstat | awk '{print $1 $4}'
- awk命令中语句被单引号中的大括号括着(只能被单引号包含)
- $1...$n表示第几列,$0表示整行
- awk可以进行格式输出
netstat | awk '{printf "%-8s %-8s
",$1,$2}'
- awk可用来过滤记录,比如过滤条件为:第三列值为0&第六列值为LISTEN
awk '$3==0 && $6=="LISTEN"'
awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-8s %-20s",$1,$5}' netstat.txt
变量名 |
说明 |
$0 |
当前记录行 |
$1~$n |
当前记录的第n个字段,字段间隔由FS分隔 |
FS |
字段分隔符,默认是空格或tab |
NF |
当前记录行的字段数 |
NR |
行号,从1开始 |
FNR |
当前记录数,与NR不同的是,这个值会是各个文件自己的行号 |
RS |
行分隔符,默认为换行符 |
OFS |
输出的字段分隔符,默认空格 |
ORS |
输出的行分隔符,默认换行符 |
FILENAME |
当前输入文件的名字 |
netstat | awk 'FS=":" {print $1,$3,$6}'
netstat | awk -F: '{print $1,$3,$6}'
//多个分隔符可以用-F '[;:]'指定
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=" "' //第六列模式匹配,~表示模式开始
netstat | awk '$6 !~ /LISTEN/ || NR==1 {print NR,$1,$4,$6} OFS=" "' //匹配第六列不包含
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 //更加复杂的拆分
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
"
printf "---------------------------------------------
"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d
", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf "---------------------------------------------
"
printf " TOTAL:%10d %8d %8d
", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f
", math/NR, english/NR, computer/NR
}
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?"
":" ")}'