1. awk工作模式
awk是一个文本处理工具,通常用于处理数据并生成结果报告
awk的命名来自它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母
语法格式
- awk 'BEGIN{}pattern{commands}END{}' file
- standard output | awk 'BEGIN{}pattern{commands}END{}'
语法格式 |
含义 |
BEGIN{} |
正式处理数据之前进行 |
pattern |
匹配模式 |
{commands} |
处理命令,可以多行 |
END{} |
处理完所有匹配数据后执行 |
2. awk内置变量
内置变量 |
含义 |
$0 |
整行内容 |
$1-$n |
当前行的第1-n个字段 |
NF |
当前行的字段个数,也就是有多少列 Number Field |
NR |
当前行的行号,从1开始计数。 Number Row |
FNR |
多文件处理时,每个文件行号单独计算。 File Number Row |
FS |
输入字段分隔符,不指定默认以tab或空格进行分隔 Filed Separator |
RS |
输入行分隔符,默认回车换行 Row Separator |
OFS |
输出字段分隔符,默认为空格 |
ORS |
输出行分隔符,默认为回车换行 |
$ awk '{print $0}' passwd # print 打印命令 $0 代表整行输出
$ awk 'BEGIN{FS=":"}{print $1}' passwd # print 打印命令 $1 代表分割后的第一列,指定分隔符为:
nobody
root
daemon
$ awk '{print $1}' demo.txt # 默认以空格或tab进行分割的
$ awk '{print NF}' demo.txt # 内置变量直接写即可,不需要加$去引用
3. 格式化输出
格式符号 |
含义 |
%s |
打印字符串 |
%d |
打印十进制数 |
%f |
打印浮点数 |
%x |
打印十六进制数 |
%o |
打印八进制数 |
%e |
打印数字的科学记数法形式 |
%c |
打印单个字符的ASCII码 |
$ awk 'BEGIN{FS=":"}{printf "%s
", $1}' passwd # 和print一样
$ awk 'BEGIN{FS=":"}{printf "%s %s
", $1,$3}' passwd
# 当指定位数后,默认使用右对齐, 如果不加入填充位数,默认右对齐
$ awk 'BEGIN{FS=":"}{printf "%30s %20s
", $1,$7}' passwd # 填充位数,默认右对齐, 右对其使用 +
nobody /usr/bin/false
root /bin/sh
daemon /usr/bin/false
_uucp /usr/sbin/uucico
$ awk 'BEGIN{FS=":"}{printf "%-30s %-20s
", $1,$7}' passwd # 填充位数,左对齐, 左对齐使用 -
nobody /usr/bin/false
root /bin/sh
daemon /usr/bin/false
_uucp /usr/sbin/uucico
$ awk 'BEGIN{FS=":"}{printf "%0.3f
", $3}' passwd # 保留3位小数
# 打印8进制或者18进制的时候显示前面的标识 %后面加上 # 即可
$ awk 'BEGIN{FS=":"}{printf "%#x
", $3}' passwd # #x 表示加入16进制的标识0x
$ awk 'BEGIN{FS=":"}{printf "%#o
", $3}' passwd # #o 表示加入16进制的标识0
4. 匹配模式
- 第一种匹配模式:RegExp
- 第二种模式匹配:关系运算符
语法格式 |
含义 |
RegExp |
按正则表达式进行匹配 |
关系运算 |
按关系运算匹配 |
$ awk 'BEGIN{FS=":"}/root/{print $0}' passwd # 包含root的行
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
$ awk 'BEGIN{FS=":"}/^root/{print $0}' passwd # 以root开头的行
root:*:0:0:System Administrator:/var/root:/bin/sh
$ awk 'BEGIN{FS=":"}$7=="/bin/bash"{print $0}' passwd #第7列是/bin/bash的匹配
_mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash
$ awk 'BEGIN{FS=":"}$1=="root" || $1=="hdfs"{print $0}' passwd
关系运算符 |
说明 |
< |
小于 |
> |
大于 |
<= |
小于等于 |
>= |
大于等于 |
== |
等于 |
!= |
不等于 |
~ |
匹配正则表达式 |
!~ |
不匹配正则表达式 |
|| |
布尔运算 或 |
&& |
布尔运算 与 |
! |
布尔运算 非 |
5. 表达式的使用
运算符 |
说明 |
+ |
加 |
- |
减 |
* |
乘 |
/ |
除 |
% |
取模 |
^或** |
乘方 |
++x |
在返回x变量之前, x加1 |
x++ |
返回x变量后,x加1 |
$ awk 'BEGIN{var=2;var1="hello";print var,var1}'
2 hello
$ awk 'BEGIN{var=2;var1=3.5;print var+var1}'
5.5
$ awk '/^$/{sum++}END{print sum}' passwd # 统计空行的数量 sum 没有初始化赋值,默认为0
$ awk '/root/{sum++}END{print sum}' passwd # 统计包含root的行的数量
awk编程的内容极多,这里只罗列简单常用的用法,更多请参考 http://www.gnu.org/software/gawk/manual/gawk.html