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
注意格式的书写,使用可以过滤部分内容