awk的基础应用

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 -1
awk 'NR==5  {print $0}' /etc/passwd
awk '{if (NR==5) print $0}' /etc/passwd

3.打印第五行的第五列
awk -F: 'NR==5  {print $5}' /etc/passwd

4.打印第五行和第六行
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 -1

10.打印最后一行的最后一列
cat /etc/passwd|tail -1|awk -F":" '{print $NF}'

11.打印前五行
 cat /etc/passwd|head -5

12.打印五到十行,并在前面加上行号
awk -F: '{print NR,$0}' /etc/passwd|head -10|tail -6

13.打印奇数行 (删除偶数行)
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}'

 

posted @ 2017-12-28 10:33  小布先生  阅读(245)  评论(0)    收藏  举报