awk文件处理工具

awk :适用程序,一种unix工具

就是一个强大的文本分析工具,相对于grep查找、sed的编辑,awk在对数据分析并

生成报告的时候,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种处理。awk可以使用多种用法,并且有自己的使用方式区别于bash。

基本用法:

awk [options] ‘program’ var=value file…

awk [options] -f programfile var=value file…

awk [options] 'BEGIN{ action;… } pattern{ action;… } END{

action;… }' file ...

awk 程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块

END语句块,共3部分组成

program通常是被单引号或双引号中

选项:

-F 指明输入时用到的字段分隔符,是awk最常用的选项

例如:awk -F: print $1 /etc/passwd

指的是在文件里以:为分隔符提取出每一行的第一部分

-v var=value: 自定义变量;如果要定义变量就必须要使用-v可以使用多个-v定义变量。

例如:awk -v a=1 -v b=2 -F: '{if(a<$3){print a}else{print $3}}' /etc/passwd

截取文件里的id号和定义的变量a比较输出结果。

 

分割符、域和记录

awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称

为域标识。$0为所有域,注意:和shell中变量$符含义不同

文件的每一行称为记录

省略action,则默认执行 print $0 的操作

也是就说当前面使用-F定义分隔符后后面使用$1,$2..$n分别表示以分割的第一部分、第二部分等等,而$0则表示一整行的内容。

 

BEGIN{action;… }END{action;…}

当使用者两个事一般是在输出的前面和后面添加相关的内容。

注意:当使用BEGIN时就可以不用进行输入操作或添加文件就可以运行代码

 

变量:内置和自定义变量

v FS:输入字段分隔符,默认为空白字符

awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd

awk –F: '{print $1,$3,$7}’ /etc/passwd

v OFS:输出字段分隔符,默认为空白字符

awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd

v RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效

awk -v RS=' ' ‘{print }’ /etc/passwd

v ORS:输出记录分隔符,输出时用指定符号代替换行符

awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd

v NF:字段数量

awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$

awk -F: '{print $(NF-1)}' /etc/passwd

v NR:行号

awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab

8

awk

v FNR:各文件分别计数,行号

awk '{print FNR}' /etc/fstab /etc/inittab

v FILENAME:当前文件名

awk '{print FILENAME}’ /etc/fstab

v ARGC:命令行参数的个数

awk '{print ARGC}’ /etc/fstab /etc/inittab

awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab

v ARGV:数组,保存的是命令行所给定的各参数

awk ‘BEGIN {print ARGV[0]}’ /etc/fstab

/etc/inittab

awk ‘BEGIN {print ARGV[1]}’ /etc/fstab

/etc/inittab

注:最常使用的是NF,代表一以分隔符的最后一部分,可以在很多地方运用,以及NF-1 倒数第二行。

 

逻辑操作符:与&&,或||,非!

v 示例:

awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd

awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd

 

PATTERN:根据pattern条件,过滤匹配的行,再做处理

(1)如果未指定:空模式,匹配每一行

(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

awk '/^UUID/{print $1}' /etc/fstab

awk '!/^UUID/{print $1}' /etc/fstab

3) line ranges:行范围

startline,endline:/pat1/,/pat2/ 不支持直接给出数字

格式

awk -F: ‘/^root\>/,/^nobody\>/{print $1}'

/etc/passwd

awk -F: ‘(NR>=10&&NR<=20){print NR,$1}'

/etc/passwd

注意格式的书写,使用可以过滤部分内容