awk 工作原理介绍
awk 实际是一种编程语言, 我们使用的是的 GUN 版本, 主要使用其强大的分割, 过滤功能, awk 实际也是对文件进行逐行处理
awk 工作状态分为以下三种
GEGIN{} {} END{}
行处理前 行处理中 行处理后
++++++ 小示例 ++++++++
awk 'BEGIN{ print 1/2 } { print"ok"} END{ print"------------------"}' /etc/passwd
即为行处理前打印一个 1/2 行处理时输出 ok 处理结束打印 ------
awk 'pattren' filename 示例: awk '/root/' passwd
awk '{action}' filename 示例: awk -F '{ print $1 }' passwd
awk 'pattren {action}' filename 示例: awk -F ':' '/root/{ print $1}' // 中间的内容为正则表达式
又例如添加条件判断的
df | grep '/' | awk '$4>1000000{ print $6}'
awk 的内部变量
- head -10 /etc/passwd> passwd #取 / etc/passwd 前 10 行举例
- [[email protected] ~]# awk '{print $0}' passwd #$0 为全部参数, 默认以回车为分隔符, 所以原格式打印所有内容
- [[email protected] ~]# awk '{print NR}' passwd #total number record 所有行号, 按顺序排列的
- [[email protected] ~]# awk '{print FNR}' passwd /etc/passwd #number record of file 多个文件的话, 分别显示各自文件的行号
- [[email protected] ~]# awk -F":" '{print NF}' passwd #NF 为指定冒号为分隔符, 一行一共有多少字段
- [[email protected] ~]# awk -F":" '{print NF,$NF}' passwd #$NF 为最后一个字段
- [[email protected] ~]# awk 'BEGIN{FS=":"} {print $1}' passwd #FS 为分隔符, 默认以空格为分隔
- [[email protected] ~]# awk 'BEGIN{FS=":";OFS="+++++"} {print $1,$2}' passwd #行处理前以冒号为分隔符, 输出分隔符为 +++++, 打印第 1 第 2 个参数, 第一与第二参数会以 +++++ 相连, 打印结果如下
- root+++++x
- bin+++++x
- daemon+++++x
- adm+++++x
- lp+++++x
- [[email protected] ~]# awk 'BEGIN{RS=":"} {print $0}' passwd #原本以回车为默认换行输出分隔符, 现在看到冒号则换行. 打印效果如下
- root
- x
- 0
- 0
- root
- /root
- /bin/bash
- .......
- [[email protected] ~]# awk 'BEGIN{FS=":";ORS="++++"} { print $1}' passwd #默认以回车输出排序, 现在以 ++++ 作为输出排序. 打印效果如下:
- root====bin====daemon====adm====lp====sync====shutdown====halt====mail====operator====
格式化输出:
print 函数
- # date + %F | awk -F":" '{ print"month: "$1"\nyear: "$2}'
- # awk -F":" '{ print"username: "$1"\tuid: "$3}' passwd #可以很清晰看出格式对不齐
printf 函数
- # awk -F":" '{ printf"%-15s %-10s %-15s\n",$1,$2,$3}' passwd #定义了每个变量占用位置多少
- # awk -F":" '{ printf"username: %-15s passx: %-10s uid: %-10s",$1,$2,$3}' passwd #可以在定义位置空间前面自由添加字符
%s 字符类型 %15s 右对齐占 15 字符
%d 数值类型 %15d 右对齐占 15 字符
- 表示左对齐, 默认右对齐
%-15s 意思为左对齐占 15 字符
\n 代表换行 \t 代表制表符 (tab)
awk 模式和动作:
任何 awk 语句都由模式和动作组成. 模式部分决定动作语句的合适触发及触发条件. 处理即对数据进行的操作.
模式可以是: 正则表达式
匹配记录 (整行)
- # awk '/^root/' passwd
- # awk '$0 ~/^root/' passwd
- # awk '!/^root/' passwd
- # awk '$0 !~ /^root/'
匹配字段: 匹配操作符 (~!~)
- # awk -F":" '$1 ~ /root/' passwd
- # awk -F":" '$NF !~ /bash$/' passwd
关系运算符
运算符 含义 示例
< 小于 $x<100
> 大于 $x>100
<= 小于等于 $y<=50
>= 大于等于 $y>=50
== 等于 x=y
!= 不等于 x!=y
- # awk -F":" '$3 == 0' passwd
- # awk -F":" '$3 <10' passwd
- # awk -F":" '$7 =="/bin/bash"' passwd
- # awk -F":" '$1 =="alice"' passwd #这里的关系运算符, 匹配字符需要加双引号, 详细匹配内容
- # awk -F":" '$1 ~ /root/' passwd
- # awk -F":" '$ !~ /root/' passwd
- # df | grep '/' | awk '$4>250000'
条件表达式
# awk -F":" '{ if($3> 100) { print $1 } }' passwd
awk 是一门编程语言, 用法很多, 会在后面的一些脚本中详细的去使用. 也不必深究, GUN 版的, 我们主要还是用到其强大的分割能力, 有兴趣的可以深入了解~
awk 小结
来源: http://www.bubuko.com/infodetail-3101221.html