Linux awk 命令的常用选项(文本列的打印命令)

awk 格式
awk  [选项]  '[条件]{指令}'  文件
awk  [选项]  ' BEGIN{指令} {指令} END{指令}'  文件
其中:
BEGIN{ }	行前处理,读取文件内容前执行,指令执行1次
{ }	逐行处理,读取文件过程中执行,指令执行n次
END{ }	行后处理,读取文件结束后执行,指令执行1次

awk 选项
-F选项:awk默认是以空格分割列,但是也可以通-F参数指定分割每一列的符号,例如-F:就是以“:”符号分割每一列,-Fa就是以“a”字母分割每一列

awk 常用内置变量
$0 文本当前行的全部内容
$1 文本的第1列
$2 文本的第2列
$3 文本的第3列
(以此类推)
NR 文本当前行的行号
NF 文本当前行的列数(有几列)
$(NF-1) 文本倒数第一列
$(NF-2) 文本倒数第二列
$(NF-3) 文本倒数第三列
, 逗号在awk里代号空格
\t 在awk里代表Tab制表位,就是比一个空格更多的空格

awk 基础打印案例
awk 直接选择打印第几列
# awk '{print $1,$3}' test.txt #打印文档第1列和第3列
# awk '{print $(NF-2)}' /etc/passwd #打印倒数第2列
# awk -F: '{print NR,NF}' passwd.txt #打印每一行的行号和列数
# df -h | awk '{print $4}' #打印前一个命令结果的第4列
# df -h / | tail -1 | awk '{print $6}' #打印前一个命令结果的第6列

awk 自定义分割列的符号
# awk -F: '{print $1,$7}' /etc/passwd #打印第1列和第7列,并且以“:”符号分割行
# awk -F [:/] '{print $1,$10}' /etc/passwd #打印第1列和第10列,并且以“:”符号和“/”符号分割列

awk 在打印中添加一部分常量
# awk -F: '{print $1,"的解释器:",$7}' /etc/passwd #打印第1列中间跟一段常量再打印第7列

awk 用正则匹配想要打印的行所必须包含的内容
# awk '/Failed/{print $11}' /var/log/secure #打印包含Failed的行的第11列
# awk -F: '/bash$/{print}' /etc/passwd #打印以bash$结尾的行,并且以“:”符号分割列
# awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd #打印以root或者adm开头的行的第1列和第3列,并且以“:”符号分割列
# awk -F: '$1~/root/' /etc/passwd #打印第1列包含root的行,并且以“:”符号分割列
# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd #打印第7列不以nologin结尾的行的第1列和第7列,并且以“:”符号分割列
# ifconfig eth0 | awk '/RX p/{print $5}'  #打印前一个命令包含Rx p的行的第5列
# df -h | awk '/\/$/{print $4}' #打印前一个命令以/结尾的行的第4列

awk 用比较运算符匹配想要打印的行的内容
# awk -F: 'NR==3{print}' /etc/passwd #打印行号等于3的行,并且以“:”符号分割列
# awk -F: '$3>=1000{print $1,$3}' /etc/passwd #打印第3列数值大于1000的行的第1列和第3列,并且以“:”符号分割列
# awk -F: '$3<10{print $1,$3}' /etc/passwd #打印第3列数值小于10的行的第1列和第3列,并且以“:”符号分割列
# awk -F: '$1=="root"' /etc/passwd #打印第1列为root的行,并且以“:”符号分割列
# awk -F: '$3>10 && $3<20' /etc/passwd #打印第3列数值大于10并且小于20的行,并且以“:”符号分割列
# awk -F: '$3>1000 || $3<10' /etc/passwd #打印第3列数值大于1000或者小于10的行,并且以“:”符号分割列

awk 计算
# awk 'BEGIN{print x+1}' #x可以不定义,直接用,默认值位0,x=0+1
# awk 'BEGIN{x++;print x}' #x=0+1
# awk 'BEGIN{x=8;print x+=2}' #x=8+2
# awk 'BEGIN{x=8;x--;print x}' #x=8-1
# awk 'BEGIN{print 2+3}' #2+3=5
# awk 'BEGIN{print 2*3}' #2*3=6
# awk 'BEGIN{print 3.2+3.5}' #3.2+3.5=6.7
# awk 'BEGIN{ print 23%8}' #23除8余7
# seq  200 | awk  '$1%3==0' #找200以内3的倍数
# seq 100 | awk '$1%7==0||$1~/7/' #找100以内7的倍数或者包含7的数

awk 计数
# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd #计算以bash结尾的行数
# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd #计算第3列小于等于1000的行数,并且以“:”符号分割列
# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd #计算3列大于1000的行数,并且以“:”符号分割列
# awk -F: '{if($7~/bash$/){i++}}END{print i}'  /etc/passwd #计算第7列以bash结尾的行数,并且以“:”符号分割列

awk if 判断语句计数
# awk -F: '{if($3<=1000){i++}else{j++}}END{print i,j}' /etc/passwd #计算第3列小于等于1000的行数和第3列大于1000的行数,并且以“:”符号分割列
# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd #计算第7列以bash结尾的行数和第7列不以bash结尾的行数,并且以“:”符号分割列

awk for 循环创建数组并打印数组
# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}' #创建数组a,并且a[0]=0 a[1]=11 a[2]=22,并且全部打印出来

# awk '{ip[$1]++} END{for(i in ip) {print ip[i],i }}' /var/log/httpd/access_log #统计所有的ip以及每一个ip 访问的次数
# awk '{ip[$1]++} END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log | sort -nr #统计所有的ip以及每一个ip访问的次数,并排序

awk 打印表格
# awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1 "\t"  $3  "\t"  $6}END{print "Total",NR,"lines."}' /etc/passwd #在开始打印一行,在结尾打印一行,并且以“:”符号分割列