AWK来源
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。
目前有多种版本主要用的有:New awk(nawk),GNU awk( gawk),这里介绍gawk
基本语法:
awk [option] 'program' var=value file...
其中program格式:
pattern{action statements;...}
pattern设定过滤条件
action statements对数据进行处理,放在{}内,执行动作涉及print,printf。
如果省略action则默认执行print $0(打印所有所有域内容,$0含义稍后介绍)
awk [option] -f programfile var=value file...
将program部分放入文本中的使用方式
awk [option] 'BEGIN{action;...}' pattern{action;...}END{action;...}' file...
在BGEIN,END在输出结果前、后加入指定内容,类似于页眉页脚
选项:
-F指每一条记录record(行)的字段(域field)分隔符
通过-F指定字段分隔符后每个域被依次标记为$1,$2,$3..$n这样后续通过标识方便引用。
$0为所有域即整个记录。
这里的$n标识和shell中的$符是不同含义
-v var=varlu 定义变量包括自定义变量和内部变量
AWK工作原理
1.执行BGEIN{action;...}语句块,进行“页眉”格式化
2.从文件或者标准输入读取第一条记录(行)然后通过pattern{action;...}处理,这个过程从第一行到最后一行重复逐行扫描
3.当读到最后一条记录时,执行END{action;...},进行“页脚”格式化
BGEIN/END是可有可无的。并且如果没有pattern{action;...}默认会执行{print},即会打印读取到的每一条记录
print输出
print是action的一种具体实现,它的格式:print item1,item2,...
item之间使用逗号分割符
item可以是字符串,数值;也可以是变量或awk表达式
如果省略item则相当于print $0
示例:
awk '{print "day day up"}' /etc/hosts
awk -F. '{print "zxzz"}' /etc/hosts
awk -F: '{print $1}' /etc/passwd
awk -F: '{print $0}' /etc/passwd
awk -F: '{print $1" \t"$3}' /etc/passwd
以上" \t"表示输出域时,位于域之间的符号
tail -3 /etc/fstab | awk '{print $2,$4}'
AWK变量:分为内置变量和自定义变量,使用选项-v 定义
内置变量:
FS:输入字段分隔符,默认为空白字符
awk -v FS=':' '{print $1,FS,$3}' /etc/passwd 或 awk -F: '{print $1,":",$3}' /etc/passwd
OFS:输出字段分隔符,默认为空白符
awk -v FS=':' -v OFS="'s userid is " '{print $1,$3}' /etc/passwd
RS:输入记录分隔符,指定输入时的换行符
echo "aaa@23b@ss@@edu" | awk -v RS='@' '{print}' | cat -A
ORS:输出记录分隔符,输出是用指定符好替代换行符
awk -v RS='' -v ORS='###' '{print}' /etc/passwd
NF:单行字段总数量
awk -F: '{print NF}' /etc/passwd
awk -F: '{print $NF}' /etc/passwd
NR:记录号
FNR:各文件分别计数,记录号
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME:当前文件名
awk '{print FILENAME}’ /etc/fstab
ARGC:命令行参数的个数
awk '{print ARGC}' /etc/fstab /etc/inittab
awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab
ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
自定义变量:
(1) 选项跟参数定义-v var=value
(2) 在program中直接定义
先引用再定义:
先定义再引用:
printf格式化输出命令
printf "FORMAT",item1,item2,...
(1)必须指定FORMAT
(2)不会自动换行,需要显示给出换行控制符,\n
(3)FORMAT中需要分别为后面每个item指定格式符
格式符:与item一一对应
%c 显示字符的ASCⅡ码
%d,%i 显示十进制整数
%f 显示为浮点数
%e,%E 显示科学计数法数值
%g,%G 以科学计数法或浮点形式显示数值
%s 显示字符串
%u 无符号整数
%% 显示%自身
修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐) %-15s
+:显示数值的正负符号 %+d
以下几个示例:
操作符
比较操作符:
==,!=,>,>=,<,<=
模式匹配符
~:左边是否和右边匹配包含 !~:是否不匹配
示例:
awk -F: '$0 ~ /root/{print $1}' /etc/passwd 每读入一条记录使用$0调用然后通过~匹配符去匹配包含root的记录,匹配成功再执行print
awk '$0 ~ /^root/' /etc/passwd 读入记录去匹配行首以root开头的记录,由于没有指定action所以默认执行{print}
awk -F: '$3 <= 30{print $0,NR}' /etc/passwd 以:为域分隔符,找出第三域小于等于30(即UID)的行打印整行和行号
逻辑操作符
逻辑与&&,逻辑或|| ,逻辑非!
awk -F: '$3==0||$3>=1010 {print $1}' /etc/passwd
条件表达式(三目表达式): selector?if-true-expression:if-false-expression
awk -F: '{$3<=30?usertype="Common User":usertype="Sysadmin or SysUser";printf "%-15s:%-20s%-4s\n",$1,usertype,$3}' /etc/passwd
以上是awk一些基本使用技巧,也是平时使用较多的知识点,需要不断的练习