今天介绍Linux常见的一个命令awk,一门模式匹配的编程语言,因为它的主要功能是用于匹配文本并处理,同时它有一些编程语言才有的语法,例如函数、分支循环语句、变量等等。当然比起我们常见的编程语言,awk相对比较简单,那我们就一起看看吧。
awk
一.命令
awk处理过程:
依次对每一行进行处理,然后输出。
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v] -F指定分隔符,-f调用脚本,-v定义变量 var=value
' ' 引用代码块
BEGIN 在逐行处理之前初始化代码,主要是引用全局变量,如FS设置分隔符等
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用分号分隔
END 在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
二.各个命令注解
实例文件for_awk.txt内容如下:
![]() |
2.1 -f 指定脚本文件
![]() |
script.awk:内容如下
BEGIN{
FS=":"
}
{print $1}
Ps:效果与awk 'BEGIN {FS="\t"}{print $1}' for_awk.txt相同。
![]() |
2.2 -F 指定分隔符
$1 指定分隔符后,第一个字段,$0全部字段。
上面的例子也可以使用:
# 打印以”\t”为分割符的第一个字段
![]() |
# 1.注意观察下面两个例子:
![]() |
细心的你一定发现,在 $1和$2之间增加‘,’输出的内容之间也增加一个空格作为分隔符。
# 2. 指定OFS=’\t’设置输出各个字段符分隔符,本例以制表符作为分割。
![]() |
也可以自定义输出,注意引号的使用。
![]() |
#3. NF:表示每行有的字段数,注意这里的字段数是被–F分割后的部分数。
![]() |
# 4. NR:表示当前行的行号。
![]() |
2.3–v设置变量
![]() |
2.4// 匹配代码块
// 纯字符匹配 !// 纯字符不匹配 ~// 字段值匹配
!~// 字段值不匹配 ~/a1|a2/ 字段值匹配a1或a2
# 1.纯字符(不)匹配
![]() |
注:匹配含有指定字符’lisi’的行。
![]() |
注:匹配不含有指定字符’lisi’的所有行。
# 2.字段值(不)匹配
![]() |
注:指定字段’$4’匹配含有指定字符’107'的所有行。
![]() |
注:指定字段’$4’匹配不含有指定字符’107’的所有行。
# 3.正则表达式在匹配中的应用
![]() |
注:指定字段’$4’匹配指定字符’107’或’108’的所有行。
![]() |
注:结合正则表达式使用。
2.5.IF 语句
整个if语句必须用在{}中,且比较内容用()扩起来
# 1.第一个字段匹配’wanger’,打印整行,否则,打印”None”
![]() |
# 2.输出文件的空白行
![]() |
注:^$ 正则表达式使用。^表示行首;$表示行尾。
# 3.某文件夹下所有文件的大小
![]() |
2.6.条件表达式
== 相等 != 不等 > 大于 >= 大于等于 <小于 <= 小于等于
# 1.打印姓名为lisi的学号
![]() |
# 2. 打印学号为201802以后的学号的姓或”w”开头的姓名
![]() |
2.8.数值运算
减法乘除,幂,取整等【+, -, *, /, **, int()】
![]() |
应用1
awk -F'[\t#]' '{print NF}' for_awk.txt
# 指定多个分隔符\t,#,输出每行多少字段
awk -F'[\t#]' '{print $1,$2 }' OFS='\t' for_awk.txt
# 制表符分隔输出多字段
应用2
打印输出第一个字段出现次数为1次的字段。
![]() |
思考:出现的次数大于1次呢?
awk -F "\t" '{print $1}' for_awk.txt |sort|uniq -c|grep –v "1"
满满的收获
通过上面的介绍,你是不是get到这项技能了呢?
如果还不太熟悉,那就新建一个类似的文档,练习起来吧!
另外,awk是逐行处理工具,若需要更复杂的文本处理,建议使用脚本语言处理。