前言
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
1、awk语法
awk [option] 'pattern[action]' file ...
awk 参数(可选) 条件动作 文件
特点:
- awk擅长文本格式化,且能输出格式化后的结果,因此最常用的动作就是 print 和 printf
- awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符;
- awk按行处理文件,一行处理完毕之后,再处理下一行;
- awk可以根据用户指定的分隔符去工作,没有指定,则默认为空格;
2、内置变量
关系运算符
一、案例展示
1、输出第二列内容
awk '{print $2}' test1.txt
2、输出多列内容,中间用 “,” 分割
awk '{print $2,$3}' test1.txt
3、查看第二行内容
awk 'NR==2{print $0}' test1.txt
输出多行
awk 'NR==1,NR==2{print $0}' test1.txt
4、输出1-3行,并显示行号
wk 'NR==1,NR==3{print NR,$0}' test1.txt
5、自定义输出内容
awk '{print "first:" $1,"second:"$2}' test1.txt![](https://cdn.jsdelivr.net/gh/LiWei800999/tutu@main/202208222058439.png)
二、awk参数
参数 | 说明 |
---|---|
-F | 指定分隔字段符 |
-v | 定义或修改一个awk内部变量 |
-f | 从脚本文件中读取awk命令 |
可以使用#作为分隔符,而不是原来的空格
1、显示第一列和第二列内容
awk -F "#" '{print $1,$2}' test2.txt
2、显示文件第一列,倒数第一、第二列的内容
awk -F "#" '{print $1,$(NF),$(NF-1)}' test2.txt
3、获取本机的IP地址
ifconfig -a
ifconfig -a | awk 'NR==2{print $2}'
4、取出文件的第一列和最后一列
##### awk -F ":" '{print $1,$NF}' test3.txt
三、OFS输出分隔符
把文本分开的时候,可以采取其他自定义的分隔符,来让展示效果更加醒目。
awk -F ':' -v OFS=' === ' '{print $1,$NF}' test3.txt
四、FILENAME和ARGV的使用
可以在每行记录前输出当前文件名称;
awk 'NR==1,NR==3{print FILENAME,$0}' test3.txt
ARGV使用
awk 'NR==1,NR==3{print ARGV[0],ARGV[1],$0}' test3.txt
自定义变量
awk -v myname='tt' 'BEGIN{print "my name is ",myname}'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qxBcAj5c-1661173485043)(https://cdn.jsdelivr.net/gh/LiWei800999/tutu@main/202208222101255.png)]
五、awk格式化输出
printf如果什么都不加
awk '{printf $0}' test3.txt
等同于print
awk '{printf "%s\n", $0}' test3.txt
自定义
awk -F ":" '{printf "one:%s two:%s three:%s\n", $1,$2,$3}' test3.txt
六、awk模式下的pattern
- BEGIN 模式是处理文本之前需要执行的动作;
- END模式是处理完成所有的行之后执行的操作;
见如下输出
awk 'BEGIN{print "linux"} {print $0}END{print "over"}' test3.txt
1、打印前三行的文本内容
awk 'NR<=3{print $0}' test3.txt
2、匹配密码文本中含有特定元素的行
awk '/tt/{print $0}' test3.txt
3、格式化输出
awk -F ":" 'BEGIN{print"user\t\t\tfirst\t\t second\t\t password"} {printf "user:%-20s%-20s%-20s%-20s\n", $1,$2,$3,$4}' test3.txt