主要内容:
awk命令、内置变量(FS、$0、$1、$2、NF、NR)、过滤时机(BEGIN{}、{}、END{})、处理条件(正则、&&、||、~\!~、==等)、awk数组、监控脚本、安全检测脚本
一、awk介绍
awk 是一种强大的文本处理工具,广泛用于 Unix 和 Linux 系统中。它是一种编程语言,专门用于处理结构化数据和生成格式化的报告。awk 的名字来源于其三位开发者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。
作用:基于模式匹配检查输入文本,逐行处理并输出;通常用在Shell脚本中,获取指定的数据;单独使用时,可对文本数据做统计;(精确搜索、数据统计)
补充:awk过滤数据时支持仅打印某一列;
补充:处理文本时,若未指定分隔符,则默认将空格、Tab制表符等作为分隔符。
1、awk 基本用法
格式:awk 'pattern { action }' file
- pattern:用于匹配输入行的条件。如果省略,
awk
将对所有行执行action
。- action:在匹配的行上执行的操作。
- file:要处理的文件。如果省略,
awk
将从标准输入读取数据。
常用 action 指令:
- {print} 输出
补充:使用awk时,如果指令就是{print},且前面写了条件的情况下可以省略{print}
awk 的基本概念:
- 记录(Record):awk 将输入数据视为一系列记录。默认情况下,记录是由换行符分隔的行
- 字段(Field):每个记录由字段组成。默认情况下,字段是由空格或制表符分隔的。字段可以通过 \$1, \$2, \$3, ... 来访问
- 变量:awk 有许多内置变量,例如 NF(字段数)、NR(记录数)、FS(字段分隔符)等
2、awk 内置变量
说明:
\$0
:文本当前行的全部内容(整行)\$1
,\$2
, ...:当前记录的第 1 个、第 2 个字段等(第1列、第2列,依此类推)NF
:当前记录中的字段数(有几列)NR
:当前记录的行号(类似sed中的"=")FS
:字段分隔符(默认是空格或制表符)RS
:记录分隔符(默认是换行符)OFS
:输出字段分隔符(默认是空格)ORS
:输出记录分隔符(默认是换行符)
3、awk 常见用法
1)特定字段打印
打印文件 file.txt 中每一行的第一个和第三个字段
awk '{ print \$1, \$3 }' file.txt
2)使用模式匹配
打印文件 file.txt 中包含 pattern 的行
awk '/pattern/ { print \$0 }' file.txt
3)计算字段的总和
计算文件 file.txt 中第一个字段的总和,并在处理完所有行后打印总和
awk '{ sum += \$1 } END { print sum }' file.txt
4)使用自定义字段分隔符
使用冒号 : 作为字段分隔符,并打印 /etc/passwd 文件中每一行的第一个字段。
awk -F':' '{ print \$1 }' /etc/passwd
5)使用变量
打印文件 file.txt 中每一行的第一个字段,并在前面加上变量 var 的值。
awk -v var="Hello" '{ print var, \$1 }' file.txt
4、awk 常用选项
-F fs
- 说明:指定输入字段分隔符(Field Separator)。
- 示例:awk -F':' '{ print \$1 }' /etc/passwd
- 解释:使用冒号 : 作为字段分隔符,并打印 /etc/passwd 文件中每一行的第一个字段。
-v var=value
- 说明:定义一个变量并赋值。
- 示例:awk -v var="Hello" '{ print var, \$1 }' file.txt
- 解释:定义变量 var 并赋值为 "Hello",然后打印文件 file.txt 中每一行的第一个字段,并在前面加上变量 var 的值。
-f scriptfile
- 说明:从指定的脚本文件中读取 awk 命令。
- 示例:awk -f script.awk file.txt
- 解释:从 script.awk 文件中读取 awk 命令,并应用于 file.txt 文件。
-v OFS=output_field_separator
- 说明:指定输出字段分隔符(Output Field Separator)。
- 示例:awk -v OFS="," '{ print \$1, \$2, \$3 }' file.txt
- 解释:使用逗号 , 作为输出字段分隔符,并打印文件 file.txt 中每一行的前三个字段。
-v ORS=output_record_separator
- 说明:指定输出记录分隔符(Output Record Separator)。
- 示例:awk -v ORS="\n\n" '{ print \$0 }' file.txt
- 解释:使用两个换行符 \n\n 作为输出记录分隔符,并打印文件 file.txt 中的每一行。
-v FS=input_field_separator
- 说明:指定输入字段分隔符(Field Separator)。
- 示例:awk -v FS="," '{ print \$1 }' file.csv
- 解释:使用逗号 , 作为输入字段分隔符,并打印文件 file.csv 中每一行的第一个字段。
-v RS=input_record_separator
- 说明:指定输入记录分隔符(Record Separator)。
- 示例:awk -v RS="\n\n" '{ print \$0 }' file.txt
- 解释:使用两个换行符 \n\n 作为输入记录分隔符,并打印文件 file.txt 中的每一行。
-v NF=number_of_fields
- 说明:指定每行的字段数。
- 示例:awk -v NF=3 '{ print \$1, \$2, \$3 }' file.txt
- 解释:指定每行有 3 个字段,并打印文件 file.txt 中每一行的前三个字段。
-v NR=number_of_records
- 说明:指定处理的记录数。
- 示例:awk -v NR=5 '{ print \$0 }' file.txt
- 解释:只处理文件 file.txt 中的前 5 行,并打印每一行。
awk变量练习示例1:
[root@svr7 ~]# cat test //测试文件
hello the world
welcome to beijing
例如:不加条件,输出所有
[root@svr7 opt]# awk '{print}' test
hello the world
welcome to beijing
例如:输出以h开头的行
[root@svr7 opt]# awk '/^h/{print}' test
hello the world
例如:输出所有行的第1列
[root@svr7 opt]# awk '{print $1}' test
hello
Welcome
例如:输出所有行的第1列和第3列
[root@svr7 opt]# awk '{print $1,$3}' test
hello world
welcome beijing
例如:输出以w开头,$0整行内容,第3列