Linux 文本处理三剑客之“awk”
2014-08-30 13:37
656 查看
一、awk的工作原理和使用格式
基本语法:
awk 的执行流程如下所述:
1、首先awk根据“行标记”读取行(awk处理的单位是行)
awk根据行标志读入一行(linux系统中默认的行结束标志是:"\n")
2、然后,按要求做匹配
awk会检查读取到行与指定的“pattern”做匹配,
(1)、如果读取到的行与指定的"pattern"不匹配,awk又读取下一行。
(2)、如果读取到的行与指定的“pattern”匹配,awk就使用指定的段分隔符(默认为空格,可以使
用“-F”定义)对行进行切片,然后执行action。
awk的模式PATTERN有:
(1)、使用地址范围:
如:
(1)、有只打印"print"不格式化。
(2)、格式化“printf”之后输出。
说明:
awk 是一种编程语言,awk对行进行切片之后,可以使用awk的算术运行与字符比较,判断语
句,对字段进行逻辑操作之后,再通过print与printf(print format)输出。
二、【awk】是如何实现报告生成的呢?
使用printf 动作,进行数据的格式化操作.
printf的语法:
数据的格式化报告的生成方法:
1、第一步:使用printf动作支持的fromat格式,格式化数据。
计算内存的剩余百分比。
如果,我们对文本中的特定行的段,数据进行计算处理的话。使用【awk】是最好的。
先匹配(使用地址范围)到需要处理的行,awk会根据指定的分隔符对匹配到的行进行切割。这时候我们就可以使用awk内置的算术运算对这些片段做数学运算了。且awk的格式化报告功能很强大。
例:
格式化输出:/etc/passwd文件中,用户的ID号大于10且小于200的用户和用户ID号。
分析:
由于【awk】命令的默认字段分隔符是:空格。所以要自定义字段分隔符。--------> awk切割字段的标准
由于对用户的ID号有要求,所以awk命令不是对每一行都进行切割,要做行匹配----->awk处理的行标准
要使用到awk的action中的printf完成数据的格式化操作。
format的选择:
使用linux系统中制表符"\t"做为字段的分隔符。
从上面显示可以看出,字段与字符之间是分开了。 但是由于每个字段的长度不同所以。它们还不能对齐。
所以,以最长的字段为准,指定字段的显示宽度。使用format的格式修饰符指定显示宽度。
扩展:
显示/etc/passwd第4字段,第4字段是用户的组ID号,所以选择format格式的指示符为:%d, 显示宽度为:13 且是左对齐。
基本语法:
awk [option]... '/pattern/{action}' FILE
awk 的执行流程如下所述:
1、首先awk根据“行标记”读取行(awk处理的单位是行)
awk根据行标志读入一行(linux系统中默认的行结束标志是:"\n")
2、然后,按要求做匹配
awk会检查读取到行与指定的“pattern”做匹配,
(1)、如果读取到的行与指定的"pattern"不匹配,awk又读取下一行。
(2)、如果读取到的行与指定的“pattern”匹配,awk就使用指定的段分隔符(默认为空格,可以使
用“-F”定义)对行进行切片,然后执行action。
awk的模式PATTERN有:
(1)、使用地址范围:
start_line,end_line 从哪行开始到那行结束,指定处理范围的行 # 指定处理那行 /part1/,/part2/ 匹配其中一个 /parttern/ 只匹配该模式的如:
[root@www ~]# free | awk '/^Mem/{printf "%s:\t%0.1f%\n","FreeMen",($4+$6+$7)/$2*100}' FreeMen: 64.6%(2)、表达式:指的是比较表达式
>、>=、==、<、<=、!=、~(模式匹配)如:
awk -F: '$3 >= 500{print $0}' /etc/passwd awk -F: '$7 ~ /bash$/{print $0}' /etc/passwd使用表达式做awk处理的行匹配时,还可以使用:&& 或 ||
如:
[root@www ~]# awk -F: '$3 < 500 && $3 > 400 {print $0}' /etc/passwd rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin mysql:x:496:493::/home/mysql:/bin/bash3、最后输出:action
(1)、有只打印"print"不格式化。
(2)、格式化“printf”之后输出。
说明:
awk 是一种编程语言,awk对行进行切片之后,可以使用awk的算术运行与字符比较,判断语
句,对字段进行逻辑操作之后,再通过print与printf(print format)输出。
二、【awk】是如何实现报告生成的呢?
使用printf 动作,进行数据的格式化操作.
printf的语法:
printf "format(格式)", item1(字段),item2,...
要点: (1)、要指定format (2)、不会自动换行:如需换行则需要给出换行符:"\n" (3)、format用于为后面的每个item指定其输出格式 是以字符串格式输出还是以浮点数格式输出或以十进制格式输出呢format格式的指示符都以“%”开头,后跟一个字符
%c: 显示字符的ASCII码 %d, %i 十进制整数int %e, %E 科学计数法显示数值 %f 显示浮点数float %g, %G 以科学计数法格式或浮点数格式显示数值 %s 显示字符串string %u 显示无符号整数 %% 显示%自身format格式的修饰符:
# 显示宽度 - 左对齐 + 右对齐 .# 取值精度例:
数据的格式化报告的生成方法:
1、第一步:使用printf动作支持的fromat格式,格式化数据。
计算内存的剩余百分比。
[root@stu13 ~]# free | awk '/^Mem/{printf "%f\n",($4+$6+$7)/$2}' 0.8168482、第二步:使用format格式的修饰符,美化数据的输出。
[root@stu13 ~]# free | awk '/^Mem/{printf "%0.1f%\n",($4+$6+$7)/$2*100}' 81.7%说明:
如果,我们对文本中的特定行的段,数据进行计算处理的话。使用【awk】是最好的。
先匹配(使用地址范围)到需要处理的行,awk会根据指定的分隔符对匹配到的行进行切割。这时候我们就可以使用awk内置的算术运算对这些片段做数学运算了。且awk的格式化报告功能很强大。
例:
格式化输出:/etc/passwd文件中,用户的ID号大于10且小于200的用户和用户ID号。
分析:
由于【awk】命令的默认字段分隔符是:空格。所以要自定义字段分隔符。--------> awk切割字段的标准
由于对用户的ID号有要求,所以awk命令不是对每一行都进行切割,要做行匹配----->awk处理的行标准
要使用到awk的action中的printf完成数据的格式化操作。
format的选择:
字段 选择format $1 字符型格式输出:s% $3 数值类型且十进制制格式输出:d%如下:
[root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%s%d\n",$1,$3}' /etc/passwd operator11 games12 gopher13 ftp14 nobody99 dbus81 usbmuxd113 vcsa69 rpc32 avahi-autoipd170说明:没有指定字段分隔符,printf格式化的字符是连起来的。
使用linux系统中制表符"\t"做为字段的分隔符。
[root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%s\t%d\n",$1,$3}' /etc/passwd operator 11 games 12 gopher 13 ftp 14 nobody 99 dbus 81 usbmuxd 113 vcsa 69 rpc 32 avahi-autoipd 170 haldaemon 68说明:
从上面显示可以看出,字段与字符之间是分开了。 但是由于每个字段的长度不同所以。它们还不能对齐。
所以,以最长的字段为准,指定字段的显示宽度。使用format的格式修饰符指定显示宽度。
[root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%-13s\t%-13d\n",$1,$3}' /etc/passwd operator 11 games 12 gopher 13 ftp 14 nobody 99 dbus 81 usbmuxd 113 vcsa 69 rpc 32 avahi-autoipd 170 haldaemon 68 ntp 38 a pache 48说明:以字段:avahi-autoipd 为标准,它有13个字符。所以,格式化时指定每个字段占用13. ------> 显示宽度。“-”表示字段以左对齐的方式。
扩展:
显示/etc/passwd第4字段,第4字段是用户的组ID号,所以选择format格式的指示符为:%d, 显示宽度为:13 且是左对齐。
[root@node1 ~]# awk -F: '$3<200 && $3>10{printf "%-13s\t%-13d\t%-13d\n",$1,$3,$4}' /etc/passwd operator 11 0 games 12 100 gopher 13 30 ftp 14 50 nobody 99 99 dbus 81 81 usbmuxd 113 113 vcsa 69 69 rpc 32 32 avahi-autoipd 170 170 haldaemon 68 68使用【BEGIN】模式增加标题:标明显示的各个字段是什么
[root@node1 ~]# awk -F: 'BEGIN{printf "%-13s\t%-13s\t%-13s\n","UserName","User_PID","UserGroup_ID"}$3<200 && $3>10{printf "%-13s\t%-13d\t%-13d\n",$1,$3,$4}' /etc/passwd UserName User_PID UserGroup_ID operator 11 0 games 12 100 gopher 13 30 ftp 14 50 nobody 99 99 dbus 81 81 usbmuxd 113 113 vcsa 69 69 rpc 32 32 avahi-autoipd 170 170这样:报告显示清晰明了。
相关文章推荐
- Linux文本处理三剑客之awk
- Linux文本处理三剑客之awk
- Linux文本处理三剑客之awk
- Linux文本处理三剑客(awk)
- Linux基础(20)文本处理三剑客之awk
- Linux文本处理三剑客之-awk
- linux文本处理三剑客——awk
- Linux文本处理三剑客之awk命令
- Linux文本处理三剑客之awk
- Linux文本处理三剑客之awk详解
- Linux文本处理三剑客之-awk
- linux 强大的文本处理命令awk详解(转)
- Linux文本处理三剑客之sed
- linux文本处理 sort,grep,sed,awk,uniq 用法
- Linux 文本处理三剑客之grep egrep
- Linux文本处理三剑客之grep
- 强大的Linux文本处理-vi awk sed
- 文本处理三剑客之awk
- Linux 系统中文本处理“三剑客”之grep