17_Shell好用工具:awk
grep:查找
sed:编辑
cut:切割
awk:切割 + 可以通过定义变量、流程控制进行深度分析加工
一、awk内置变量
内置变量列出了几个常用的
内置变量 | 含义 |
---|---|
FILENAME | 文件名 |
NF | Number Of Fields,单行总列数 |
NR | Number Of Records,单行行号 |
$n | $0 整条记录 $1 第一列 $2 第二列 |
$NF | 最后一列 |
二、awk基本使用场景举例
awk基本语法:
awk [options] 'pattern{action}' filename
2.1、默认分隔符
shell
#默认分割符是"空格"
echo "123 456 789" | awk '{print $1"&&"$2"&&"$3}'
![](https://i-blog.csdnimg.cn/direct/45d6d293da6f4362af9e2de5b30fe611.png)
2.1、自定义分隔符
shell
#使用 ":" 分隔字符串,并打印1-6列
awk -F ':' '{print $1 $2 $3 $4 $5 $6}' awk_bak.txt
![](https://i-blog.csdnimg.cn/direct/01bc33d2dfb94cd089991513f7815a6b.png)
2.2、内置变量
shell
#打印文件中文件名、行号、列数
#方式1:
awk '{print "文件名:"FILENAME " 行号:"NR" 列数:"NF" 内容:"$0}' awk.txt
#方2:(推荐)
awk '{printf("文件名:%s 行号:%s 列数:%s 内容:%s\n", FILENAME, NR, NF, $0)}' awk.txt
![](https://i-blog.csdnimg.cn/direct/68e0e1974e6c4beeb09579c9bf1d60c7.png)
![](https://i-blog.csdnimg.cn/direct/2738229cbd204652871256abd05516c5.png)
2.3、指定行号
shell
#打印行号等于5的行的所有内容
awk 'NR==5{print $0}' awk.txt
![](https://i-blog.csdnimg.cn/direct/4d026b4767a8406f87c8a5bae9c0718b.png)
2.4、正则表达式
shell
#打印包含Holen的行的所有内容
awk '/Holen/{print $0}' awk.txt
#打印以"-"开头的行
ll | awk '/^-/'
#打印以".txt"结尾的行
ll | awk '/$*.txt/'
![](https://i-blog.csdnimg.cn/direct/db32faf018af4cfc9d06227608425338.png)
![](https://i-blog.csdnimg.cn/direct/3272ffbd013f482b91058a5d70adca84.png)
2.5、特殊列
shell
#打印第一列和最后一列
awk '{print "第一列:"$1 " ,最后一列:" $NF}' awk.txt
#打印倒数第二列
awk '{print "第一列:"$1 ", 最后一列:" $NF ", 倒数第二列:" $(NF-1)}' awk.txt
![](https://i-blog.csdnimg.cn/direct/a35d47dd9e894370a26601e4d0bfafc1.png)
![](https://i-blog.csdnimg.cn/direct/f392116c6ffd4e0fa98eb5acf7f16786.png)
2.6、指定范围行、指定列
shell
#打印第1-3行全部内容
awk '{if(NR>=1&&NR<=3){print $0}}' awk.txt
#打印第1-3行第一列内容
awk '{if(NR>=1&&NR<=3){print $1}}' awk.txt
![](https://i-blog.csdnimg.cn/direct/149352c91a87438580295391bf22acdf.png)
2.7、多分割符
shell
#分割 1:2=3?4!5>6 并打印
awk -F '[:=?!>]' '{print $1 "&&" $2 "&&" $3 "&&" $4 "&&" $5}' awk_bak.txt
![](https://i-blog.csdnimg.cn/direct/2b18191a1eb74b62bb108173496b4f43.png)
2.8、添加开始和结束
shell
#在打印Hello world之前添加start,之后添加end
echo "Hello world." | awk 'BEGIN{print "start"}{print $0}END{print "end"}'
![](https://i-blog.csdnimg.cn/direct/2d4520f93dab49d19b60d2caaeb2ccea.png)
2.9、变量定义和循环
shell
#手动拼接分割后的字符串 列数较少推荐
echo "123 456 789" | awk '{print $1$2$3}'
#循环凭借分割后的字符串 列数较多推荐
echo "123 456 789" | awk -v str="" '{for(n=1;n<=NF;n++){ str=str$n }} END{print str}'
![](https://i-blog.csdnimg.cn/direct/d0b7ee60a0aa46f09ed6f8ac3cb84401.png)
3.12、运算
shell
#awk计算 $n 和 变量的运算
echo "2.1" | awk -v i=1 '{ print $0+1}'
![](https://i-blog.csdnimg.cn/direct/d4e84c2dde4d4c16983cf7bda1b1061a.png)
3.13、截取IP
shell
#截取IP
ifconfig | awk '/192.168/{print $2}'
![](https://i-blog.csdnimg.cn/direct/ac4125203f0e44abbe04ce5477b395c0.png)