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\n",$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\n",$4,$5,$6}'netstat.txt
awk'$3==0 && $6=="ESTABLISHED" || NR==1 {printf "%02s %s %-20s %-20s %s\n",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\n", $3,$6}' /etc/passwd //指定分隔符,比较,输出都有
awk'$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}'OFS="\t"netstat.txt
awk'$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}'OFS="\t"netstat.txt
awk'$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}'OFS="\t"netstat.txt
awk'$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}'OFS="\t"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\n",NR, FNR, $4,$5,$6}
或者
脚本形式 BEGIN{}{}END{}可以使用内置变量 print的时候用 "%s %d"
例如 printf" TOTAL:%10d %8d %8d \n", math, english, computer
顺道贴上抄袭的地址 http://foyon.blog.163.com/blog/static/20103427520134715410351/?latestBlog