awk专题(day 24)

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统计与计算

1.类似于wc-l统计次数,统计一共有多少行 awk ‘{i=i+1} END {print i}’ /etc/passwd i是一个 变量名,可以换成其它字符或字符串 END{} 内容会在awk读取完文件的时候执行 END{} 一般用于输出执行结果 这个案例未来可以搭配awk各种条件进行统计和计算 2.进行求和,累加 seq 10 > num.txt 计算这一列数字和 awk ‘{i=i+$1} END {print i}’ i=i+$1(i+=$1)将第一列的数值累加到i 如果同时计算两列 awk ‘{i=i+$1 ; j=j+$2} END {print $1,$2}’

awk总结

核心:awk取行与取列
熟练:awk对列比较大小(取出第三列大于1000的行)
熟悉:awk对列过滤(过滤出/etc/passwd第4列的数字是以0或1开头的行,输出第1列,第3列,第4列)用‘$4~/[^01]/{print $1,$3}’
难点:awk计算求和

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部