目录
Toggle三剑客之awk
awk概述
awk支持更复杂的结构化程序,是一门完整的编程语言
格式: awk 选项 ‘条件{动作}’ 文件
功能:单行脚本、判断与循环、数组、统计功能
核心:取行、取列、混合取行与列

awk取行
awk+’NR= ‘ #取出指定的行,指定范围的行
awk+’//’ 过滤 # ‘/x/,/y/’从包含x的行到包含y的行
awk+其他变量功能用于精确过滤
NR:Number of Record 记录号,行号
取出第一行: awk ‘NR==1{print $0}’ /etc/passwd
#{print $0}输出整行内容,单独取行的时候可以省略,$0表示当前行的内容
取出2-5行:awk ‘NR>=2 && NR<=5’ /etc/passwd
过滤出/etc/passwd中包含root或nobody的行
awk ‘/root|nobody/’ /etc/passwd
从包含root的行到包含nobody的行
awk ‘/root/,/nobody/’ /etc/passwd
awk取列
在awk中$+数字表示取列 {}中的””里的内容会被输出
-F 可以指定分隔符,默认为空格,-F: 可以加正则 -F ‘[0-9]+’
column -t可以对齐输出的每列内容,一般配合awk使用
“\t” 放在每列中间可以对齐每列内容,用于格式化输出,\t表示制表符
$NF表示最后一列,Number of Field每行有多少列
$(NF-1)取出倒数第2列,一般用于正向取发生变化或数字过大
1.取出/etc/passwd的第1,3,最后一列
awk -F: ‘{print $1,$3,$NF}’ /etc/passwd | column -t
2.指定复杂分隔符取出IP地址 提示:inet 前有4个空格(经典功能:利用正则指定多个分隔符)
ip a s eth0 | awk ‘NR==3’ | awk ‘{print $2}’ | awk -F/ ‘{print $1}’
ip a s eth0 | awk -F ‘[ /]+’ ‘NR==5{print $3}’
取行与取列
(合并取行和取列)
1.取出stat /etc/hosts的0644部分
stat /etc/hosts | awk -F ‘[(/]’ ‘NR==4{print $2}’
2.取出/etc/passwd 文件中第3列大于1000的行,取出文件的第1,3,最后一列
awk -F: ‘$3>1000’ /etc/passwd #第三列大于1000的行 $>1000就是条件类似于NR==1
awk -F: ‘$3>1000{print $1,$3,$NF}’ /etc/passwd | column -t
3.如果系统swap使用超过0,则输出“异常系统开始使用swap”
条件:1。过滤出swap(第三行)2.第三列大于0
free | awk ‘NR==3 && $3>0{print “”}’
或用/swap/过滤出swap的行替换NR==3
4.过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第1列,第3列,第4列
awk -F: ‘$4~/^[01]/’ /etc/passwd #表示找出符合条件的行
awk -F: ‘$4~/^[01]/{print $1,$3}’ /etc/passwd
取行取列小结
awk中可以对某列进行过滤,某一列中含有xxxx内容
~表示包含的意思,$1~/root/表示第1列中包含root
!~表示不包含
取行(条件):NR==1,NR>=,$3>=1000,$3~/1/
取列(分隔符,动作):$1,$NF,$(NF-1)
awk统计与计算
awk总结
核心:awk取行与取列
熟练:awk对列比较大小(取出第三列大于1000的行)
熟悉:awk对列过滤(过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第1列,第3列,第4列)用‘$4~/[^01]/{print $1,$3}’
难点:awk计算求和