简单介绍一下awk的用法
grep awk sed 三个并称Linux的三剑客
awk:适合编辑,处理匹配到的文本内容
grep:擅长单纯的查找或匹配文本内容
链接: Linux—grep
sed:适合格式化文本内容,对文本进行复杂处理
链接: Linux—sed
awk有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式。
awk早期在unix上实现,用的是gawk,是GUN awk的意思。
awk更是一门编程语言,支持条件判断,数组,循环等功能。
awk [option] 'pattern[action]' file
options awk可选参数
pattern 模式
action 动作(awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print和printf)
file 处理文件
这里用到的 文件为 123.txt
对awk而言,变量分为
内置变量
自定义变量
变量 | 含义 |
---|---|
$n | 指定分隔符后,当前记录的第n个字段 |
$0 | 完整的输入记录 |
FS | 字段分隔符,默认是空格 |
NF | 当前记录数,行数 |
NR | man wak |
更多内置变量可以man手册查看--------man awk
awk '{print $2}' 123.txt//取出第二列
$0 代表一整行 =awk '{print}' 123.txt
$1 代表第一列
······
这里执行的命令没有使用参数和模式,$2表示输出文本的第二列信息
awk默认以空格为分隔符,且多个空格也识别为一个空格,作为分隔符
awk是按行处理文件,一行处理完毕,处理下一行,根据用户指定的分隔符去工作,没有指定则默认空格
awk '{print $1,$3}' 123.txt//,代表空格 显示第一行,第三行
awk '{print "list1: "$1,"list2: "$3}' 123.txt //按要求输出第一行,第三行
awk 必须 外层单引号,内层双引号
内置变量$1,$2都不能添加双引号,否则会识别为文本
awk 'NR==5{print $0}' 123.txt//显示文件第五行
awk 'NR==5,NR==6{print $0}' 123.txt//显示文件第五行,第六行
awk '{print NR,$0}' 123.txt//显示每一行的行号和cat -n的操作一样
awk 'NR==37,NR==40{print NR,$0}' pwd.txt//37-40行的行号和信息显示出来
awk '{print $1, NF-1}' 123.txt//打印到数第二列
参数 | 含义 |
---|---|
-F | 指定分隔字段符 |
-v | 定义或修改一个awk内部变量 |
-f | 从脚本文件中读取awk命令 |
awk默认以空格为分隔符,这里可以指定分隔符
awk -F ":" '{print $1}' pwd.txt //指定 :为分隔符打印第一列
除了使用-F选项,还可以使用变量的形式,指定分隔符,使用-v搭配选项,修改FS变量
awk -v FS=“:” ‘{print 1 , 1, 1,NF}’ pwd.txt
awk -F ":" -v OFS="===" '{print $1,$NF}' pwd.txt //以:分隔,输出时添加===
print打印会自动换行
printf打印不会自动换行
若想要效果一样则需要格式化字符串
awk ‘{printf “%s\n”,$2}’ abc.txt
awk默认是按行处理文本,如果不指定任何模式(条件),awk默认一行行处理
如果指定了模式,只有符合模式才会被处理
处理文本之前做的动作
awk 'BEGIN{print "文件夹里有"}{print $2}' abc.txt
处理完所有行之后执行的操作
awk 'BEGIN{print "处理文本之前"}{print $2}END{print "处理文本之后执行该语句"}' abc.t
awk 'NR==2{print $0}' abc.txt //输出第二行
awk 'NR!=2{print $0}' abc.txt/输出第二行以外的行
awk -F":" 'BEGIN{printf "%-30s%-30s%-30s\t%-30s\t\n","用户名","用户ID","用户家目录","用户解释器"}{printf "%-30s\t%-30s\t%-30s\t%-30s\t\n",$1,$3,$6,$7}' pwd.txt
正则表达式主要与awk的pattern模式结合使用
awk '/正则表达式/动作' file
与 grep ‘正则表达式’ pwd.txt效果一致
但是awk配合pattern模式使用更为好用
awk '/^games/{print $0}' pwd.txt//找出pwd.txt文件中的games行
awk -F ":" '/^games/{print $1,$NF}' pwd.txt //以:为分隔符找出pwd.txt文件中gams的第一列和最后一列