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
来源: http://www.bubuko.com/infodetail-2518764.html