awk神器

先上硬货

学习语法之前先介绍下awk的几个内建变量

$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字

常用语句如下

awk'{print $1, $4}'netstat.txt
awk'{printf "%-8s %-8s %-8s %-18s %-22s %-15s
",$1,$2,$3,$4,$5,$6}'netstat.txt
awk'$3==0 && $6=="LISTEN" 'netstat.txt
awk'$3==0 && $6=="LISTEN" || NR==1 'netstat.txt
awk'$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s
",$4,$5,$6}'netstat.txt
awk'$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%02s %s %-20s %-20s %s
",NR, FNR, $4,$5,$6}'netstat.txt
awk  'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
awk  -F '[:;]' '{print $1,$3,$6}' /etc/passwd   比较有用的一句 -F 指定分隔符
awk -F '[:;]' '$1=="suqian" {printf "%s,%s ", $3,$6}' /etc/passwd //指定分隔符,比较,输出都有
awk'$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}'OFS="	"netstat.txt
awk'$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}'OFS="	"netstat.txt
awk'$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}'OFS="	"netstat.txt
awk'$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}'OFS="	"netstat.txt
awk'NR!=1{print > $6}'netstat.txt
awk'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt";
elseif($6 ~ /LISTEN/) print > "2.txt";
elseprint > "3.txt"}' netstat.txt

总结格式

awk '条件 {if判断 print > 重定向 }' 文件名 其中 print格式化 例如
{printf "%02s %s %-20s %-20s %s
",NR, FNR, $4,$5,$6}

或者

脚本形式 BEGIN{}{}END{}可以使用内置变量 print的时候用 "%s %d"
例如   printf"  TOTAL:%10d %8d %8d 
", math, english, computer



顺道贴上抄袭的地址 http://foyon.blog.163.com/blog/static/20103427520134715410351/?latestBlog
原文地址:https://www.cnblogs.com/sailrancho/p/3389138.html