awk 也是流式编辑器,它比sed的功能更强大
1.截取文档中的某段
awk -F ':' '{print $1}' /etc/passwd |head -2
-F 指定分割符,不指定以空格或者tab为分隔符
print 为打印动作
$1 为第一字段, $2 为第二字段,依次类推,$0标示整行
那么打印整个文档就是awk '{print $0}' /etc/passwd
print 还可以打印自定义的内容,要用双引号括起来awk -F':' '{print $1"#"$2"#"$3"#"$4}' /etc/passwd |head -2
意思是以冒号分割打印前四段,每段用#号分开
2.匹配字符或字符串
awk '/root/' /etc/passwd
匹配含有root的行,该用法跟sed 类似
让某个字段去匹配awk -F ':' '$1 ~/da/' /etc/passwd
awk还可以多次匹配,只打印所匹配的段awk -F ':' '/root/ {print $1 $3} /test/ {print $1 $3}' /etc/passwd
意思是先找出带有关键词root ,test的行,再打印出这些行指定的字段
3.条件操作符
根据逻辑判断筛选 比如==,<,<=,>,>=,!=awk -F ':' '$3==0' /etc/passwd
awk -F ':' '$3>=500' /etc/passwd 这样我们就筛选出了普通用户
逻辑符号后面的数字如果用双引号引起来,则按照字符处理
举一个!=的例子awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
当然我们也可以根据字段处理
awk -F ':' '$3<$4' /etc/passwd
另外还可以使用 && 和 || 表示 “并且” 和 “或者” 的意思
awk -F ':' '$3<$4 && $3<10' /etc/passwd
awk -F ':' '$3>=500 || $3<1' /etc/passwd
4.awk内置变量
NF :用分隔符分隔后一共有多少段
NR :行数awk -F ':' '{print NF}' /etc/passwd |head -3
awk -F ':' '{print NR}' /etc/passwd |head -3
用行号作为判断条件晒筛选,也可以同时匹配某段字符
awk 'NR>20' /etc/passwd
awk -F ':' 'NR>20 && $1~/test/' /etc/passwd
5.awk 中的数学运算
更改某字段的内容输出awk -F ':' '$1="root"' /etc/passwd |head -3
以冒号分割,将第一段替换为root
awk还可以对各个段的值进行数学运算:awk -F ':' '{$7=$3+$4;print $0}' /etc/passwd |head -3
该语句标示将第三段和第四段求和后替换第七段
还可以计算某一列的和head -3 /etc/passwd |awk -F ':' '{(sum=sum+$3)}; END {print sum}'
这里我们选了文件前三行,统计了以冒号分割的第三列数字之和,sum是变量可以任意取,END是关键词类似shell脚本的done ,其实该命令已经相当于一个带有循环语句的简单脚本了
在awk中使用if判断,for循环都可以,举一个if例子
awk -F ':' '{if ($3>=500) print $0}' /etc/passwd
转载于:https://blog.51cto.com/12606610/2083838