awk是一个强大的文本分析工具。
它不仅是Liunx中,也是任何环境中现有功能最强大的数据处理引擎之一。
相对于“grep“的查找,”sed“的编译,awk在其对数据分析并生成报告时,显得尤为强大。
当你第一次拿起双手在电脑上使用 awk 命令处理一个或者多个文件的时候,它会依次读取文件的每一行内容, 然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容, awk 使用一对单引号来表示 一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。 awk 的每个花括号内同时又可以有多个指令,每一个指令用分号分隔,awk 其实就是一个脚本编程语言。
awk命令的基本语法
|
|
options 这个表示一些可选的参数选项,反正就是你爱用不用,不用可以拉到。。。
常用选项有:
|
|
program 这个表示 awk 的可执行脚本代码,这个是必须要有的。
其中program
的格式如下:
|
|
file 这个表示 awk 需要处理的文件,注意是纯文本文件,不是你的 mp3,也不是 mp4 啥的。。
awk的內建命令与变量
一、內建命令
1、print打印
print item1,item2 ...
要点:
(1)逗号分隔符
(2)输出的各 item 可以是字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3)如果省略 item,通常相当于执行 print $0 打印整行字
2、printf 命令
格式化输出:printf ”FORMAT“,item1,item2,....
要点:
(1)FORMAT:必须给出
(2)printf:不会自动换行,需要显示给出换行符: \n
(3)FORMAT中需要分别为后面的每个item指定一个格式化符号
格式符:
|
|
实例:
|
|
格式符的修饰符:
|
|
默认为右对齐
[root@centos7 ~]# awk -F: '{printf "Username: %10s UID: %d\n",$1,$3}' /etc/passwd
Username: root UID: 0
Username: bin UID: 1
Username: daemon UID: 2
-:减号表示左对齐
root@centos7 ~]# awk -F: '{printf "Username: %-10s UID: %d\n",$1,$3}' /etc/passwd
Username: root UID: 0
Username: bin UID: 1
Username: daemon UID: 2
+:加号表示显示数值的符号(正数负数)
二、內建变量
特殊内置变量:
|
|
awk
中的內建变量,无需使用 $ 符号直接可以调用变量的值
(1)FS:input field seperator,指定分隔符,默认为空白字符;
awk -v FS=":" '{print $1 }' /etc/passwd
(2)OFS:output field seperator,指定输出分隔符,默认为空白字符
awk -v FS=":" -v OFS=":" '{print $1}' /etc/passwd
(3)RS:input record seperator,输入时的换行符
awk -v RS=" " '{print}' /etc/passwd
(4)ORS:output record seperator,输出时的换行符
(5)NF:number of field,字段数量
{print NF}:显示文本的每行字段数量
{print $NF}:显示每行末尾字段的信息
(6)NR:number of record,行数(默认输出每一行的行号),最后一行的行号即为这个文件的总行数
{print NR}
(7)FNR:files number of record,统计多个文件的行数,分别打印(各文件分别计数)
{print FNR}
(8)FILENAME:当前正在处理的文件名
(9)ARGC:命令行参数的个数
ARGV:数组,保存命令行中所给定的各参数
|
|
自定义变量:
(1)-v var=value :自定义变量
var:变量名,区分大小写
value:值
(2)在’program’中直接定义:
|
|
三、操作符
- 算数操作符:
|
|
字符串操作符:没有符号的操作符(字符串连接)
赋值操作符:
|
|
- 比较操作符:
|
|
- 模式匹配符:
|
|
- 逻辑操作符:
|
|
函数调用:
|
|
条件表达式:
selector? if-true-expression:if-false-expression
selector:条件表达式,后面跟 ? 号
如果条件为真,则执行 if-true-expression
否则,执行 if-false-expression
实例:
|
|
$3>=1000? :以 : 为分隔符,判断第三个字段的值是否大于1000
如果为真,执行变量赋值:usertype=”Common User”
否则,执行变量赋值:usertype=”System User”
PATTERN 模式匹配
awk中的模式匹配功能,有点类似于地址定界的功能。
(1) empty(匹配每一行):空模式
(2) /regular expression/:能够其中基本正则表达式匹配到的行,对其进行处理,未匹配到的行不做任何操作
仅能够处理能够被此处的模式匹配到的行
如果想对其中模式匹配到的取反,可以使用:!/regular expression/ 进行取反操作
|
|
(3) relational expression:关系表达式
结果有真,有假;结果为”真“,才会处理
真表示:结果为非0值,或者非空字符串;0表示假
|
|
这里 $NF 表示的是 每一行最后一个字段的值
注意:在使用模式匹配时,要在前后加上 // 符号
(4)line ranges :行范围(地址定界)
startline,endline:
/pattern1/,/pattern2/这样来定义
或者
(NR>=number&&NR<=number)这样的格式来定义
NR:每一行的行号
注意:不支持直接给出数字的方式
|
|
(5)BEGIN/END模式:
BEGIN{}:仅在开始处理文件中的文本之前执行一次(可以打印表头)
END{}:仅在文本处理完成之后执行一次
|
|
1、if-else 语句
语法:
|
|
如果有多个语句 则是 {statements}
实例:
|
|
先对设备进行取出,并以%为分隔符,取出$1的值;再对$NF,也就是最后一个字段的值进行判断
使用场景:对awk取得的整行或某个字段做条件判断
2、while 循环
语法:
|
|
条件为真,进入循环
条件为假,退出循环
使用场景:对一行内的多个字段 逐一/类似 处理时使用; 对数组中的各元素逐一处理时使用
实例:
|
|
|
|
3、do while 循环(至少会执行一次循环体)
语法:
|
|
4、for 循环
语法:
|
|
|
|
实例:
|
|
特殊用法:
|
|
5、array数组:
关联数组:array[index-expression]
index-expression:
|
|
若要判断数组中是否存在某元素,要使用”index in array“格式进行:
weekdays[“mon”]=”Monday”
|
|
若要遍历数组中的每个元素,要使用for循环:
for(var in array) {for-body}
|
|
注意:var 会遍历 array 的每个索引,但顺序可能不同
实例:
|
|
本文出自Maxie’s Notes博客,转载请务必保留此出处。