一.AWK简介
- AWK是一种完整的编程语言,专门用于对文本和数据进行处理和分析。
- 它的语法相对简单,但非常强大,可以实现复杂的文本处理任务。
- AWK的主要特点是按字段分割输入文本,并且可以对每个字段进行操作。
- 可以实现各种操作,如计算、条件判断、循环等,非常适用于数据处理和分析任务。
- 在Shell脚本中,可以通过调用AWK来实现文本处理和分析,使得脚本更加灵活和强大。
二.工作原理
awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
-
输入分割: AWK 将输入按照指定的字段分隔符(默认为空格)进行分割,并将每行数据分解成多个字段。这样就可以针对每个字段进行操作和处理。
-
模式-动作: AWK 的基本工作方式是对输入的每一行执行一系列的模式-动作对。如果某行满足指定的模式,则执行相应的动作。如果没有指定模式,则默认对所有行执行相应的动作。
-
默认动作: 如果没有指定动作,则默认动作是打印整行数据。这使得 AWK 在没有显式指定动作的情况下,仍然能够输出处理后的数据。
-
内置变量: AWK 提供了一些内置变量,例如
$0
表示整行数据,$1
,$2
, ... 表示第 1、2、... 个字段的值。这些内置变量可以在动作中使用,方便对数据进行操作和处理。 -
条件判断和循环: 在 AWK 中可以使用条件判断和循环结构,使得对数据的处理更加灵活和高效。通过条件判断和循环,可以根据需要执行不同的操作,或者对数据进行多次处理。
-
输出格式化: AWK 不仅可以处理输入数据,还可以根据需要对输出进行格式化。通过指定输出格式和使用内置的输出函数,可以将处理后的数据按照指定的格式输出到标准输出或者文件中。
三.基础用法
说明:
program通常是被放在单引号中,并可以由三种部分组成
-
BEGIN语句块
-
模式匹配的通用语句块
-
END语句块
常见选项:
-
-F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-
-v var=value 变量赋值
Program格式:
pattern{action statements;..}
-
pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END,正则表达式等
-
action statements:对数据进行处理,放在{}内指明,常见:print, printf
-
output statements:print,printf
-
Expressions:算术,比较表达式等
-
Compound statements:组合语句
-
Control statements:if, while等
-
input statements
-
格式:
awk 选项 '模式或条件 {操作}' 文件1 文件2 ...
awk -f 脚本文件 文件1 文件2 .....
示例:
(1)打印( “{}”大括号里面为一个操作,print默认打印一个文件的内容 )
(2)打印hello,输入任何字符都打印hello
(3)运算
(4)打印匹配文件中含有root的行 awk '/root/ {print}'
(5) awk '{print $0}' 没有指定行则打印所有内容
四.AWK常见的内置变量
格式:awk 选项 '模式{print }'
内置变量 | 说明 |
FS | 指定每行文本的字段分隔符,缺省默认为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:" |
OFS | 输出时的分隔符 |
NF | 当前处理的行的字段个数 |
NR | 当前处理的行的行号(序数) |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第n个字段(第n列) |
FILENAME | 被处理的文件名 |
RS | 行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n |
示例:
使用数字处理行内容
(1)打印文件中的1-3行的两种方式
(2)打印文件全部内容,“||”表示或的意思(满足一个条件即可执行)
打印文件的第一行和第三行
(3)打印偶数行和奇数行
(4)使用字符串处理文件内容
(5)打印文件内容的行号和全部内容
(6)以冒号为分隔符打印出/etc/passwd中第三字段大于1000的行的第一字段和第三字段
awk -F: '$3>=1000 {print $1,$3}' /etc/passwd
(7)以冒号为分隔符打印出/etc/passwd中第三字段小于50的行的第一字段和第三字段
(8)打印/etc/passwd文件中以:为分隔符的行的第一字段和最后一个字段
(9)打印以:为分隔符,$NF最后一字段中包含bash的行的第一字段与最后一字段
(12)RS行分隔符
以:为行分隔符输出每行的行号和内容
(11)$n 当前处理行的第n个字段
-
$n ~ "字符串" 代表打印出第n个字段中包含某字符的行
-
$n =="字符串" 代表打印出第n个字段中为某字符串的行
-
$n != "字符串" 代表打印出第n个字段中不为某字符的串行
示例:
过滤网卡地址
五.BEGIN和END
格式:awk 'BEGIN{ ..};{..} ;END{.. .}' 文件
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块
示例:
使用BEGIN输出指定字符的行并统计一共有多少行
awk 'BEGIN{i=0};/\/bash$/{i++};END {print i}' /etc/passwd
统计以/bin/bash 结尾的行数,等同于grep -c "/bash$"
以“:”为分隔符统计行数
六.自定义变量
在awk中,可以使用自定义变量来存储数据或计算结果。自定义变量使用$符号后面跟着一个字母或数字表示。
printf
%s:显示字符串
%d, %i:显示十进制整数
%f:显示为浮点数
%e, %E:显示科学计数法数值
%c:显示字符的ASCII码
%g, %G:以科学计数法或浮点形式显示数值
%u:无符号整数
%%:显示%自身
示例
打印每个用户的用户名
awk -F: '{printf "%s\n",$1}' /etc/passwd
不会自动换行\n 换行符
七.模式处理动作
awk '模式{处理动作}'
PATTERN:根据pattern条件,过滤匹配的行,再做处理
1.模式为空
如果模式为空表示每一行都匹配成功,相当于没有额外条件
2.正则匹配
/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk '/^UUID/{print $1}' /etc/fstab
#在/etc/fstab文件中提取以UUID开头的行并打印第一字段,默认分隔符为空格
3.line ranges 行范围
不支持使用行号,但是可以使用变量NR 间接指定行号加上比较操作符 或者逻辑关系
算术操作符
x+y, x-y, x*y, x/y, x^y, x%y
-x:转换为负数
+x:将字符串转换为数值
比较操作符:
==, !=, >, >=, <, <=
#####逻辑
与:&&,并且关系
或:||,或者关系
非:!,取反
模式匹配符:
~ 左边是否和右边匹配,包含关系
!~ 是否不匹配
示例:
awk -F: '$1~"root"{print $1,$3} ' /etc/passwd
#打印出第一字段中包含root的行中的第一列于第3列
4.与if语句或者while或三目运算符等一起使用时需要再嵌套一个大括号{ }
三元运算符:
(条件表达式)?(A表达式或者值):(B表达式或者值)
条件表达式成立为真时会取:号前面的A的值
条件表达式不成立为假时会取:号后面的B的值
示例
比较第三字段UID与第四字段GID,打印出UID和GID中的的最大值与用户名
八.AWK实际案例
查看内存使用率