awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。下面介绍的awk是以GNU的gawk为例的,在linux系统中已把awk链接到gawk,所以下面全部以awk进行介绍。
awk命令两种使用方式:1)命令模式awk [options] 'commands' file(s) option 部分 -F 定义字段分割符号 -v 定义变量并赋值 command 部分: 1、范围说明或者正则表达式或者{awk命令语句1;awk命令语句2;} 2、范围说明部分可以是BEGIN、END、逻辑表达式或者为空 3、awk命令语句间用分号间隔 4、引用shell 变量需用双引号引起2)脚本模式 awk [options] -f scriptfile file(s) 特点: 1、awk脚本是awk命令的清单 2、命令需要用分号间隔 3、#号开头的是注释行 4、# !/bin/awk -f 字段分割及相关变量: $1,$2,$3...$n:awk中用该顺序形式表示files中每行以间隔符号分割的各列的不同字段 $0表示文本本身 注: awk默认以空格符为间隔符号将每行分割为单独的字段,也可以使用awk内置变量FS定义间隔符号 NF 表示当前记录的字段数(列数) $NF 最后一列 $(NF-1) 倒数第二列 FNR/NR 行号 FILENAME 文件名 "\t" 制表符 RS 换行符 "" 打印字符串 FS 定义间隔符
关于awk的练习:
1.截取/etc/passwd前五行的倒数第二列head -5 /etc/passwd|tail -5|awk -F":" '{print $(NF-1)}'
2.打印第五行head -5 /etc/passwd |tail -1awk 'NR==5 {print $0}' /etc/passwdawk '{if (NR==5) print $0}' /etc/passwd3.打印第五行的第五列awk -F: 'NR==5 {print $5}' /etc/passwd4.打印第五行和第六行awk 'NR==5||NR==6 {print $0}' /etc/passwd
5.找出/etc/以.conf结尾的文件的名字(如:kernelcap-2.6.18-164.el5.conf,只需要得到kernelcap-2.6.18-164.el5就可以了)find /etc/ -name "*.conf"|awk -F"." '{print $(NF-1)}'|awk -F"/" '{print $NF}'
6.打印每一行的最后一列(可以以/etc/passwd文件为例,以下相同)cat /etc/passwd |awk -F":" '{print $NF}'7.打印每行的字段数 cat /etc/passwd |awk -F":" '{print NF}'8.打印第五行的字段数cat /etc/passwd |awk -F":" '{print FNR,NF}'|grep ^5.[[:digit:]]$9.打印最后一行cat /etc/passwd|tail -110.打印最后一行的最后一列cat /etc/passwd|tail -1|awk -F":" '{print $NF}'11.打印前五行 cat /etc/passwd|head -512.打印五到十行,并在前面加上行号awk -F: '{print NR,$0}' /etc/passwd|head -10|tail -613.打印奇数行 (删除偶数行)cat /etc/passwd|grep -n x|awk '{if (NR%2==1) print $0}'14.打印偶数行 (删除奇数行)cat /etc/passwd|grep -n x|awk '{if (NR%2==0) print $0}'
15.统计/etc/passwd一共出现了多少次bash字符 (要求用awk)cat /etc/passwd|grep bash|awk -F"[:/]" '{ {count++;}} END{print count}'