Linux 文本处理工具 - awk
简介
- AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
- 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
- 官方文档:https://www.gnu.org/software/gawk/manual/gawk.html
- 参考文章:https://www.runoob.com/linux/linux-comm-awk.html
工作原理
-
AWK 工作流程可分为三个部分:
- 读输入文件之前执行的代码段(由BEGIN关键字标识)。
- 主循环执行输入文件的代码段。
- 读输入文件之后的代码段(由END关键字标识)。
-
命令结构
awk 'BEGIN{ commands } pattern { commands } END{ commands }'
- [注释]: 个人通俗的将 ’ pattern ’ 理解为条件,即符合条件才执行 ’ pattern ’ 后的 ’ commands '
-
工作原理参考文章:https://www.runoob.com/w3cnote/awk-work-principle.html
常用参数
参数 | 说明 |
---|---|
-F | 指定分隔符 |
内建变量
变量 | 说明 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 (相当于 n 列) |
$0 | 全部列 |
&1 | 第一列 |
NR | 已经读出的记录数,就是行号,从1开始 (即 行数) |
NF | 一条记录的字段的数目 (即 一行的列数) |
FILENAME | 当前文件名 |
FS | 字段分隔符(默认是任何空格) |
linux | linux 变量值 |
“linux” | linux 字符串 |
运算符
符号 | 说明 |
---|---|
~ | 是 |
!~ | 不是 |
&& | 逻辑与 |
|| | 逻辑或 |
in | 数组成员 |
【注释】:以上运算符,只是个人觉得常用运算符,并不是全部。
实例
- 测试文件
[root@ awk]# cat file
root/root/0/0
linux/linux/1
test/test/2/2/2/2
centos/centos/3/3
[root@ awk]#
- 打印行数
[root@ awk]# awk '{print NR}' file
1
2
3
4
[root@ awk]#
- 在文件内容前添加行号
[root@ awk]# awk '{print NR" "$0}' file
1 root/root/0/0
2 linux/linux/1
3 test/test/2/2/2/2
4 centos/centos/3/3
[root@ awk]#
- 打印每行列数,以 ’ / ’ 为分隔符。
[root@ awk]# awk -F / '{print NF}' file
4
3
6
4
[root@ awk]#
- 打印每行第一列,以 ’ / ’ 为分隔符。
[root@ awk]# awk -F / '{print $1}' file
root
linux
test
centos
[root@ awk]#
- 分隔符为 ’ / ',第一列为 " root " 开头,打印符合条件行的第一列。
[root@ awk]# awk -F / '$1~/^root/{print $1}' file
root
[root@ awk]#
- 分隔符为 ’ : ',第六列含 " home " ,并且行是以 " bash " 结尾,打印符合条件的行。
[root@ awk]# awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@ awk]#
- 分隔符为 ’ : ',第五列为空,打印符合条件的行。
[root@ awk]# awk -F : '$5~/^$/{print}' passwd
haha:x:1005:1005::/home/haha:/bin/nologin
[root@ awk]#
- 统计在系统中能 su 切换的用户。
- 分隔符为 ’ : ',自定义变量 ’ N ',第六列以 ’ /home ’ 开头,并且行以 " /bash " 结尾 或者 以 " /sh " 结尾的行,符合条件 N 加 1,打印 N 的值。
[root@ awk]# awk -F : 'BEGIN{N=0} $6~/^\/home/ && /\/bash$/||/\/sh$/{N++} END{print N}' /etc/passwd
1
[root@ awk]#