参考:跟老男孩学Linux运维:核心系统命令实战
在线bash:https://c.runoob.com/compile/18
awk的默认分隔符是(一个或者多个连续)空格,指标看成是连续空格
语法格式:awk [参数] '条件{动作}' 文件
- 显示某些行
seq 9 | awk 'NR==2,NR==6'
讲解:显示第2行到第6行,NR表示number of row
- 给每行加上行号
seq 9 | awk '{print NR,$0}'
讲解:注意输出的时候并不会有逗号,$0表示一整行的内容,这里花括号里面的内容是awk内部命令
前面连个功能点可以合起来写,正好满足了语法格式的所有要素
seq 9 | awk 'NR==2, NR==6 {print NR, $0}'
- 对文件进行列分割,并且输出某些列
echo 'hello;world;ni;hao
chen;pan;this
xie;juan' > test.txt
awk -F ";" '{print $3,$NF}' test.txt
讲解: -F ";"表示按照分号分隔每一行,$NF表示最后一列
- 使用gsub替换
echo 'hello;world;ni;hao
chen;pan;this
xie;juan' > test.txt
awk '{gsub(";", " with ", $0); print $0}' test.txt
讲解:gsub("替换对象","替换成什么内容",哪一列),哪一列默认为$0,即所有列(整行)
- 综合行号,列分割,输出想要的部分,从而实现过滤和选择
echo ' hello; world;ni; hao
chen;pan; this
xie; juan' > test.txt
awk -F "[ ;]+" 'NR==2{print $3}' test.txt
- 数组统计功能
echo 'False
False
True
True' > test.txt
awk '{array[$0]++}END{for(domain in array)print domain, array[domain]}' test.txt
讲解:构建数组,以每一行为key,然后++统计数目,一开始全为0,出现一个增加一个。使用END模式,循环输出
- 输出记录行数
seq 9 | awk 'END{print NR}'
- 在命令中使用shell变量
R=`awk 'END{print NR}' xx.txt`
awk "NR==$R"'{print $2}' xx.txt
讲解:第一行定义了shell变量记录行数,第二行使用双引号来使用shell变量,输出了文件的最后一行的第二列
注意:在双引号和单引号之间不要有空格
- 将一列赋值给数组
array=($(awk 'NR==1,NR==6{print $2}' xx.txt))
echo ${array[0]}