标签:awk
下面介绍的是三种文本处理工具之一-----------------awk
文本处理三剑客为grep、sed(流编辑器)、awk(报告生成器)。awk来源于贝尔实验室的三个人,三个字母分别提取自名字。
1、awk基础
(1)awk命令简介
格式:awk [options] ‘program‘ file...
program:即 pattern{action statements;...},其中pattern(BEGIN、END),action statement(print、printf)
常用选项:
-F -----------指明字段分隔符,默认为空白字符
-v var=value -----------自定义变量,为自定义变量赋初始值
例:awk [options] ‘pattern{action statements;...}‘ file...
awk默认使用内置位置变量来存储各个字段的值,即$1、$2、...$N。使用$0保存整行的内容。
awk默认的分隔符为空白字符。
(2)、awk工作原理
1)、执行BEGIN{action statements} ----------awk开始之前执行,可选
2)、执行pattern{action statements} --------逐行读取、逐行重复,可选
3)、执行END{action statements} -------------退出awk之前执行,可选
2、awk命令 ----------变量
awk的变量分为两种,即:内建变量、自定义变量。
常用的10个变量介绍和示例如下:
(1)、print:标准格式显示。---------默认各个字段用逗号分隔
print item1,item2... -------如果省略item,输出整行,相当于{print $0},输出整个文件
(2)、FS -----------输入字段分隔符,默认空白字符
OFS ----------输出字段分隔符,默认空白字符
例:
# awk -v FS=‘:‘ -v OFS=‘:‘ ‘{print $1,$3}‘ /etc/passwd
例:
# echo -e "1 2 3\n4 5 6\n7 8 9" | awk -v FS=‘ ‘ ‘{print $1}‘ -----------自定义分隔符
# echo -e "1 2 3\n4 5 6\n7 8 9" | awk -v FS=‘ ‘ -v OFS=‘@‘ ‘{print $1,$2}‘
1@2
4@5
7@8
(3)、RS --------------输入记录分隔符,默认换行符
ORS --------------输出记录分隔符
例:
# awk -v RS=‘/‘ ‘{print $0}‘ /etc/passwd
例:
# echo -e "1 2 3 4@5 6 7 8 9" | awk -v RS=‘@‘ ‘{print $0}‘
1 2 3 4
5 6 7 8 9
# echo -e "1 2 3 4@5 6 7 8 9" | awk -v RS=‘@‘ -v ORS=‘/‘ ‘{print $0}‘ ---------$0代表整行
1 2 3 4/5 6 7 8 9
(4)、NF --------------字段数量,内建
例:
# echo -e "1 2 3 4@5 6 7 8 9" | awk ‘{print NF}‘
8 -------------显示字段数
# echo -e "1 2 3 4@5 6 7 8 9" | awk ‘{print $NF}‘
9 ------------显示最后一个字段具体的内容
例:
例:
# awk -v FS=‘:‘ ‘{print NF}‘ /etc/passwd
# awk -v FS=‘:‘ ‘{print $NF}‘ /etc/passwd
# awk -v FS=‘:‘ ‘{print $(NF-1)}‘ /etc/passwd
(5)、NR -------------输出每次遍历的行数,可以理解为行号
例:
# echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print NR}‘
1
2
(6)、FNR ---------输出每个文件的行数,分别统计
例:
# echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print NR}‘
1
2 --------------若是文件众多的话,不会接上,是重新分别统计。
(7)、FILENAEM ------------输出文件名
例:
# echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print FILENAME}‘
-
-
(8)、ARGC --------------输出命令行参数,命令本身算一个
例:
# echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print ARGC}‘
1
1
# awk ‘{print ARGC}‘ /etc/passwd
2
...
(9)、ARGV ---------------调用数组
例:
# awk ‘{print ARGV[1]}‘ /etc/passwd /etc/issue
/etc/passwd
/etc/passwd
(10)、varl="VALE" ----------自定义变量
# awk -v varl=‘hello‘ -F ":" ‘{print varl ,$1}‘ /etc/passwd --------------varl ,$1(之间可以有空格,也可以没有 )
hello root
hello bin
3、awk命令 ------------printf
awk中的printf命令,是格式化输出命令,默认不自动换行,需要显式给出换行控制符(\n)
格式:printf "FORMAT" item1,item2,...
格式符:
%c -----------ASCII码显示
%d,%i ---------十进制整数显示
%f -----------浮点数显示
%e、%E -----------科学计数法显示【数字】
%g、%G ----------科学计数法显示【浮点数字】
%s -----------显示字符串
%u ------------显示无符号整数
%% ---------------显示%自身
修饰符:#[.#]
#[.#]的第一个数字用来控制显示【宽度】,第二个数字表示小数点的【精度】。
例:%3.1f %5s
#[.#]中,加入+、-有特殊意义,具体如下:
-:表示采用左对齐机制,默认是右对齐。例:%-15s
+:显示数字的正负符号。例:%+d
例:
# awk -F: ‘{printf "%-20s: %-5s\n",$1,$3}‘ /etc/passwd
4、awk命令 -------------操作符
# awk -F: ‘$3==1000{print $0}‘ /etc/passwd
# awk -F: ‘$NF~/bash/{print $0}‘ /etc/passwd -----------匹配(!~不匹配)
# awk -F: ‘$3>=500&&$3<=1000{print}‘ /etc/passwd ----------与或非
# awk -F: ‘{$3>=1000?usertype="Common User":usertype="Super or System User";printf "%-20s: %-20s\n",usertype,$1}‘ /etc/passwd ------------条件表达式
5、awk命令 ------------匹配模式(5种)
(1)、empty ---------空模式,处理每一行
(2)、[!]/REGEXP/ ---------------是否PATTERN匹配到的行
例:
# awk ‘[!]/^r/{print}‘ /etc/passwd
(3)、关系表达式
例:$3>=1000, $NF~/bash/
(4)、/regexp1/,/regexp2/ -------regexp1到regexp2的行,有多少这一类匹配结果,就显示多少次
例:($3>=500&&$3<=1000)
例:
# awk ‘/^r/,/^a/{print}‘ /etc/passwd
(5)、BEGIN/END模式:
BEGIN{} ----------开始处理时,第一行文本之前执行一次
例:
# awk -F: ‘BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}‘ /etc/passwd
注意:在输出特定格式的表头时,常用此语句块;
END{} ------------文本处理完成,命令尚未退出时,执行一次
例:
# awk -F: ‘BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}END{print "========================\n",NR " users"}‘ /etc/passwd
6、awk命令 ---------------控制语句(6个)
(1)、 if-else -----------条件判断
例:
# awk -F: ‘{if($3>=1000) {print $1} else {print $1,$3}}‘ /etc/passwd
(2)、while循环 ------------对一行内的多个字段逐一处理时、遍历数组
例:
# awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf "%s: %d\n",$i,length($i);i++}}‘ /etc/grub2.cfg
(3)、do...while循环 -----------至少执行一次循环体中的语句
(4)、for循环:
例:
# awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {printf "%s: %d\n",$i,length($i)}}‘ /etc/grub2.cfg
(5)、break、continue
break [n]
continue ---------------跳过本次循环,直接进入下一次循环
(6)、 next ----------提前结束本行,直接进入下一行
例:
# awk -F: ‘{if($3%2!=0) next;print $1,$3}‘ /etc/passwd
7、awk命令 ---------------数组
awk关联数组,使用字符串时,字符串必须使用【双引号】。如果某数组元素事先不存在,当引用该元素时,awk会【自动创建】此元素,并且为该元素赋"空字符串"作为其初始值。
例:
# awk ‘BEGIN{name["leader"]="zhang";name["mem1"]="li";name["mem2"]="wang";print name["leader"]}‘
# ss -tn | awk ‘/^ESTAB\>/{print $NF}‘ | awk -F: ‘{state[$1]++}END{for(s in state){print state[s],s}}‘ ------------查看已连接状态下,同一客户端的连接数量
标签:awk
原文地址:http://12496428.blog.51cto.com/12486428/1966463