linux命令之awk
一、awk的功能
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据进行分析处理时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以指定的分隔符(默认为空格)将每行分成若干个field。然后可以通过编写各种逻辑,对这些field进行处理。
实际上 awk 的确拥有自己的语言: AWK 程序设计语言。它允许你创建简短的程序,这些程序可以实现:读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
二、awk的命令格式
-
格式1:前置命令 | awk [命令选项] ‘条件{动作}…’ (注:动作中如果包含多条语句时,可以用分号分隔。支持多组条件和动作。)
-
格式2:awk [命令选项] ‘条件{动作} …’ 文件…
-
常用命令选项:
-
-F:指定分隔符,默认空格或Tab符。可指定多个分格符
-F"[,;?]"
:指定分格符为:,
或;
或?
-
-v:调用外部Shell变量
-
-
awk中的流程控制语句支持if/else、while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
-
awk的条件类型:
-
BEGIN :是 awk 的保留字,是一种特殊的条件类型。BEGIN 的执行时机是"在 awk 程序一开始,尚未读取任何数据之前"。其动作仅执行一次。
-
END:也是 awk 的保留字,不过刚好和 BEGIN 相反。END 是在 awk 程序处理完所有数据,即将结束时执行的。其动作仅执行一次。
-
关系运算:只有条件成立,动作才会执行;反之,动作不执行。
#示例1 cat /proc/net/dev |awk 'NR==2{print "11"} FR<=10{print "22"}' #示例2 head -2 /etc/passwd | awk '1!=2{print "hello"} BEGIN{print "YES"} NR%2==1{print "NO"}' #示例3 awk -F: 'BEGIN{i=0}{if($3>500){i++}} END{print i}' /etc/passwd #示例4:条件:找出含有“inet”子串的行,并输出该行的第13个field 注:$0表示整行,$1表示该行分隔后的第1个域,以此类推。 ifconfig eth0 |awk -F"[ :]" '/inet/{print $13}' #示例5:列出以ro开头的用户记录 awk -F: '/^ro/{print}' /etc/passwd
-
-
awk中的相关运算符
条件类型 条 件 awk保留字 BEGIN awk保留字 END 关系运算符 < 小于 > 大于 >= 大于等于 <= 小于等于 == 等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=” != 不等于 A~B 判断字符串 A 中是否包含能匹配 B 表达式的子字符串 A!~B 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串 正则表达式 /正则/ 逻辑运算符 && 与 || 或 ! 非 算术运算符 + - * / % ++ – += -= *= /= %=
三、awk的内置变量
内置变量 | 含义 |
---|---|
ARGC | 命令行参数个数 |
ARGV | 命令行参数排列 |
ENVIRON | 支持队列中系统环境变量的使用 |
FILENAME | awk浏览的文件名 |
FNR | 浏览文件的记录数,对多个文件单独计数,与NR不同 |
FS | 设置输入域分隔符,等价于命令行 -F选项 |
NF | 浏览记录的域的个数 ,即当前行的域个数 |
NR | 已读的记录数,即当前行数。对多个文件连续计数,与FNR不同 |
OFS | 输出域分隔符,默认是空格,用户可另外指定 |
ORS | 输出记录分隔符,默认是回车换行,用户可另外指定 |
RS | 控制记录分隔符 |
四、awk的自定义变量
-
通过命令选项定义,变量名区分字符大小写:
-v varname=value
-
在动作中直接定义。
#/bin/bash
a=10
awk -v var=$a 'BEGIN{print var}'
awk -v var2="666test" 'BEGIN{print var2}'
#/bin/bash
awk 'BEGIN{var1=10;var2=20;print var1,var2;}'