介绍
awk是一个处理文本文件的应用程序,几乎所有的Linux系统都自带这个程序。它依次处理文件的每一行,并读取其中的每个字段。Awk可能是每行格式相同的文本文件(如日志和CSV)最方便的工具。
Awk不仅是工具软件,还是一种编程语言。然而,本文只介绍了它的命令行用法,这对于大多数场合来说应该足够了。
一、基本用法
awk的基本用法如下表。#格式
$ awk操作文件名
#示例
$ awk“{ print $ 0 }”demo . txt
在上面的例子中,demo.txt是awk将处理的文本文件。前面的单引号里面有一个大括号,里面是每行的处理动作print $0。其中print是print命令,$0代表当前行,所以上面命令的执行结果是按原样打印出每一行。
接下来,让我们用标准输入(stdin)演示上面的例子。
“$ echo”这是一个测试“| awk”“{ print $ 0 }”
这是一个测试
在上面的代码中,print $0是将标准输入到这是一个测试中,然后再次打印。
Awk会根据空格和制表符把每一行分成几个字段,用$1、$2、$3来表示第一个字段、第二个字段、第三个字段等等。
“$ echo”这是一个测试“| awk”“{ print $ 3 }”
a
在上面的代码中,$3表示这是一个测试的第三个字段A。
接下来,例如,我们将/etc/passwd文件保存为demo.txt
root : x :0336003360 root :/root :/usr/ttdwbl/zsh
daemon : x :1:1: dame :/usr/sttdwbl :/usr/sttdwbl/nologin
ttdwbl : x :2:2: tdwbl :/ttdwbl :/usr/sttdwbl/nologin
sys: x :3: sys:/dev :/usr/sttdwbl/nologin
sync : x:4:655343360 sync :/ttdwbl :/ttdwbl/sync
该文件的字段分隔符是冒号(:),因此使用-F参数将分隔符指定为冒号。然后,可以提取第一个字段。
$ awk-F ' : ' ' { print $ 1 } ' demo . txt
根
守护进程
ttdwbl
[计]系统复制命令(system的简写)
同步
00-1010除了代表字段的$数字,awk还提供了一些其他变量。
变量NF指示当前行中有多少字段,因此$NF代表最后一个字段。
$ echo '这是一个测试' | awk '{print $NF} '
试验
$(NF-1)代表倒数第二个字段。
$ awk -F ':' '{print $1,$(NF-1)}' demo.txt
根/根
守护程序/usr/sttdwbl
ttdwbl /ttdwbl
系统/开发
sync /ttdwbl
在上面的代码中,print命令中的逗号表示输出时两个部分用空格隔开。
变量NR表示当前正在处理的行。
$ awk-F ' : ' ' { print NR ')' $ 1 } ' demo . txt
1)根
2)守护进程
3) ttdwbl
4)系统
5)同步
在上面的代码中,在print命令中,如果字符是按原样输出的,则应该用双引号引起来。
awk的其他内置变量如下。
FILENAME:当前文件名FS:字段分隔符,默认为空格和制表符。RS:行分隔符,用于划分每一行。默认为换行。OFS:输出字段的分隔符,用于在打印过程中分隔字段。默认值为空格。ORS:输出记录的分隔符,用于在打印过程中分隔记录。默认为换行。OFMT:数字输出的格式,默认为% %.6g。
二、变量
awk还提供了一些内置功能,方便原始数据的处理。函数toupper()用于将字符转换为大写。
$ awk-F ' : ' ' { print to pper($ 1)} ' demo . txt
根
守护进程
快乐的西牛
[计]系统复制命令(system的简写)
同步
在上面的代码中,第一个字段以大写形式打印。
其他常用功能如下。
Tolower():字符被转换为小写。Length():返回字符串的长度。Substr():返回子字符串。Sin():正弦。Cos():余弦。Sqrt():平方根。Rand():一个随机数。awk内置功能的完整列表可以在手册中找到。
三、函数
awk允许您指定输出条件,并且只输出满足条件的行。输出条件应该写在动作前面。
$ awk“条件动作”文件名
请看下面的例子。
$ awk-F ' : ' '/usr/{ print $ 1 } ' demo . txt
根
守护进程
ttdwbl
[计]系统复制命令(system的简写)
在上面的代码中,print命令前面有一个正则表达式,它只输出包含usr的行。
以下示例仅输出奇数行和第三行之后的行。
#输出奇数行
$ awk-F ' : ' ' NR % 2==1 { print $ 1 } ' demo . txt
根
ttdwbl
同步
#第三行之后的输出行
$ awk-F ' : ' ' NR 3 { print $ 1 } ' demo . txt
[计]系统复制命令(system的简写)
同步
以下示例输出第一个字段等于指定值的行。
$ awk-F ' : ' ' $ 1==' root ' { print $ 1 } ' demo . txt
根
$ awk-F ' : ' ' $ 1==' root ' | $ 1==' ttdwbl ' { print $ 1 } ' demo . txt
根
ttdwbl
四、条件
awk为编写复杂条件提供了if结构。$ awk -F ':' '{if ($1 'm ')打印$1}' demo.txt
根
[计]系统复制命令(system的简写)
同步
上面的代码输出第一个字段的第一个字符大于m的行。
if结构也可以指定else部分。
$ awk -F ':' '{if ($1 'm ')打印$ 1;else print ' - '}' demo.txt
根
-
-
[计]系统复制命令(system的简写)
同步
关注Java知识堂,每天给你充足的干货。
原地址:http://www.ruanyifeng.com/blog/2018/11/awk.html