-------------参考网络视频
0、前言
awk命令是用来处理文件内容中的列数据,与sed处理行数据刚好对应;所以二者经常同时使用。
awk是3个创始人名字首字母的。
awk默认是以空格或Tab分隔。
当不是以二者分隔的话,需指定参数-F+分隔符 ,比如以冒号分隔
awk -F: '{print $7}' /etc/passwd
比如以空格分隔
awk -F " " '{print $7}' /etc/passwd
1、awk语法结构:
awk 参数 ‘脚本语句’ 待操作语句
awk 参数 -f '脚本文件' 待操作文件
脚本语句格式:
/pattern/{actions} -------------->pattern是正则表达式,actions是操作
condition{actions}
-------------->actions区别与sed,awk命令的actions需要用{}括起来。
$0 会打印所有的列;
$1 会打印第1列;
以此类推
2、举例:
某产品的库存量低于75则在行末标注需要订货
//testfile内容:
productA 30
productB 76
productC 55
以下3种形式都可以:
其中的;分号都可以省略。
printf的格式与c语言中的格式完全相同:需要添加\n, 因为printf不带换行功能
awk '$2<75 {printf("%s\t%s\n),$0,"REORDER";} $2>=75 {print $0;}' testfile
printf也可以不使用()
awk '$2<75 {printf "%s\t%s\n", $0, "REORDER";} $2>=75 {print $0;}' testfile
print自带换行功能:注意在" REORDER" 字符串里面添加空格才有效,如果不添加空格会紧跟在原内容后面
awk '$2<75 {print $0 " REORDER";} $2>=75 {print $0;}' testfile
结果如下:
productA 30 REORDER
productB 76
productC 55 REORDER
此外:
awk命令的condition还可以是两个特殊的conditon,BEGIN和END,
BEGIN后面的actions在处理整个文件之前执行一次;
END后面的actions在整个文件处理完之后执行一次。
awk命令可以像C语言一样使用变量(但不需要定义变量)
例:统计一个文件的空行数:
awk '/^ *$/ {x=x+1;} END {print x;}' awk.sh
例:统计进程号在2600和2700之间的 有多少?
ps aux|awk '$2<2700 && $2>2600 {x=x+1;} END {print x;}'
与EDN 对应的宏是BEGIN
BEGIN :pattern未匹配文件之前执行某些操作,后面跟上{}
EDN :pattern匹配文件结束之后,执行某些操作,后面跟上{}
awk 'BEGIN {FS=":"} {print $7}' /etc/passwd
结果等价于 -F 参数
awk -F: '{print $7}' /etc/passwd