Linux命令学习之awk

  • 输出netstat命令的第一列和第四列
Copy
netstat | awk '{print $1 $4}'
  • awk命令中语句被单引号中的大括号括着(只能被单引号包含)
  • $1...$n表示第几列,$0表示整行
  • awk可以进行格式输出
Copy
netstat | awk '{printf "%-8s %-8s\n",$1,$2}'
  • awk可用来过滤记录,比如过滤条件为:第三列值为0&第六列值为LISTEN
Copy
awk '$3==0 && $6=="LISTEN"'
  • 需要保留表头可以引入内建变量NR
Copy
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指定分隔符
Copy
netstat | awk 'FS=":" {print $1,$3,$6}' netstat | awk -F: '{print $1,$3,$6}' //多个分隔符可以用-F '[;:]'指定
  • awk可以像grep一样去进行字符串匹配
Copy
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拆分文件
Copy
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统计信息
Copy
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
Copy
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
Copy
#!/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脚本命令
Copy
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
  • 几个小栗子
Copy
#从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 @   無花無酒鋤作田  阅读(149)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示