经常碰到awk, 今天稍微总结一下
基本命令
awk [-F|-f|-v] ‘ BEGIN{} // {command1; command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
BEGIN{},END{} 命令区块
/ ** / 匹配 这里用正则表达式
常用参数
1 每行第一个字段,当然也可以
3
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符 常与OFS=\t 连用
\n 换行符
FS BEGIN时定义分隔符BEGIN{ FS=”:” }
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字 (没用过)
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F’[:#/]’ 定义三个分隔符
应用
输出1,3,6列值,制表符作为分隔符
awk -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd
自定义输出
awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd
输出不匹配mysql的行
awk '!/mysql/{print $0}' /etc/passwd
//区间匹配
awk -F: '/mail/,/mysql/{print}' /etc/passwd
// 字段1的值不匹配 mail,输出$1
awk -F: '$1!~/mail/{print $1}' /etc/passwd
if 用法,必须在{ }内
awk -F: '{if($1~/mail/) {print $1}}' /etc/passwd
大于等于
awk -F":" '$3>=100{print $3}' /etc/passwd
逻辑或,与
awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd
awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd
运算
匹配mysql,并将列3列4进行运算
awk -F: '/mysql/{print $3-$4}' /etc/passwd
awk -F: '/mysql/{print $3*$4}' /etc/passwd
输出分隔符OFS
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" /etc/passwd
输出处理结果到文件
route -n|awk 'NR!=1{print}' > ./fs
指定多个分隔符: #,输出每行多少字段
awk -F'[:#]' '{print NF}' /etc/passwd
计算/root目录下,普通文件的大小,使用KB作为单位
ls -l|awk 'BEGIN{sum=0} {sum+=$5} END{print "total size is:",int(sum/1024),"KB"}'
统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少
netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'
格式化输出printf
%格式化输出分隔符
-8长度为8个字符
s表示字符串类型
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s \n",$1,$2,$3}'
其他的以后在总结,灵活应用很中要