提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
awk,对文本中行的某些字符串进行过滤,可以更精确的处理具体字符串
一、awk是什么?
awk是一个功能强大的编辑工具,用于在linux/unix下对文本和数据进行处理
二、使用步骤
1.工作原理
逐行读取文本,默认以空格或tab键为分隔,将分隔所得的各个字段保存到内建变量中,并按模式或条件执行命令
sed 命令常用于一整行的处理,而awk比较倾向于将一行分成多个字段后在进行处理。
awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
在使用awk命令的过程中,可以使用逻辑操作符&&、||、!表示与、或、非;还可以进行简单的数学运算,如+ - * / % ^分别表示加减乘除、取余和乘方
2.格式及内建变量
awk 选项 '模式或条件 {操作}' 文件1 文件2 ... |
awk -f 脚本文件 文件1 文件2 ... |
常见内建变量(可直接用) | FS:列分割符。与F功能相同 | |
NF:当前处理行的字段个数 | ||
NR:当前处理行的行号 | ||
$0:当前处理行的整行内容 | ||
$n:当前处理行的第n个字段 | ||
FILENAME:被处理的文件名 | ||
RS:行风格符。awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,awk一次仅读入一条记录进行处理。预设值是'\n' |
3.用法示例
awk '{print}' test.txt | 输出所有内容 |
awk '{print $0}' test.txt | |
awk 'NR==1,NR==3 {print}' test.txt | 输出1-3行内容 |
awk '(NR>=1)&&(NR<=3) {print}' test.txt | 输出1-3行内容 |
awk '(NR>=1)||(NR<=3) {print}' test.txt | 输出1、3行内容 |
awk '(NR%2)==1 {print}' test.txt | 输出奇数行 |
awk '/^root/ {print}' /etc/passwd | 输出以root开头的所有行 |
awk '/nologin$/ {print}' /etc/passwd | 输出以nologin结尾的所有行 |
awk 'BEGIN {x=0};/\/bin\/bash$/ {x++};END {print x}' /etc/passwd | 统计以/bin/bash结尾的行的行数 |
grep -c "/bin/bash$" /etc/passwd | 统计以/bin/bash结尾的行的行数 |
awk -F ":" '{print $3}' /etc/passwd | 输出以:分开的第3串字符 所有行的 |
awk -F ":" '{print $1,$3}' /etc/passwd | 输出以:分开的第1、3串字符 所有行的 |
awk -F ":" '!($3<5){print $1,$3}' /etc/passwd | 输出以:分开的第1、3串字符 所有$3不小于5的行 |
awk 'BEGIN {FS=":"};{if($3<5) {print}}' /etc/passwd | 输出以:分开的,所有$3小于5的行 |
awk -F: '{max=($3>$4)?$3:$4; {print max}}' /etc/passwd | 判断$3是否大于$4,是,将$3赋值给max,否则$4.最后在输出max |
awk -F: '{print NR,$0}' /etc/passwd | 输出行号和每行的所有内容 |
awk -F: '$7~"/bash"{print NR,$1}' /etc/passwd | |
awk -F: '($1~"root")&&(NF==7) {print $1,$2}' /etc/passwd | 输出$1含有字符root,且被:分隔成7端的行的$1和$2 |
awk -F: '($7!="/bin/bash")&&($7!="/sbin/nologin") {print}' /etc/passwd | $7不为/bin/bash也不为/sbin/nologin |