awk与正则表达式(复习)

awk倾向于一行当中分成数个字段来处理,相当适合处理小型的数据数据处理
awk脚本基本结构(BEGIN语句块、能够使用模式匹配的通用
语句块、END语句块)三个部分都是可选的

awk 'BEGIN{ print "tart"} pattern{ commands } END{ print "end"}' file 

工作原理:
第一步:执行BEGIN{ commands }语句块中的语句;
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands}语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{ commands }语句块。


一般结构 awk [option] ‘program’ file
选项:

-F:指明输入时要用到的字段分隔符
-v:var=value:自定义变量
例如:
awk -F : -v i=0 '{print $1}' /etc/password
awk  -v i=0 'BEGIN{print i}' 

print item,item……
用逗号进行分开
在awk中如果想着进行变量替换,一般不要放到双引号中
item可以省略,省略的意思是print $0,显示整行
格式化输出:
1.printf不会自动换行,需要显示给出换行控制符\n
2.FORMAT需要分别为后面的每个item指定一个格式化符号
3.#[.#]:第一个数字控制显示的宽度,第二个#表示小数点后面的精度(%3.1f),默认右对齐,-号为左对齐,+为显示字符的符号

%c:显示ASCII码
%d:显示十进制证书
%e:科学计数法
%f:浮点数
%s:显示字符串
%u:显示无符号整数
%%:显示%自身

内置变量

FS:input field seperator,默认为空白字符,可以使用-v选项进行修改

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

这里写图片描述

OFS:output field seperator,默认为空白字符,可以使用-v选项进行修改

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

这里写图片描述

RS:input record seperator,输入时的换行符
ORS:output record seperator,输出的时换行符

NF:字段数量,print NF和print $NF(最后一个字段)的区别,在awk引用内部量无需加$
这里写图片描述

NR:显示当前行的行数
这里写图片描述

FNR:各文件分别计数
这里写图片描述

ARGC:命令行中的参数个数
ARGV:数组,保存参数的数组
这里写图片描述


自定义变量

-v var=value

awk -v test='test1''{print test}' /etc/fstab

在program中直接定义

awk 'BEGIN{test="test2";print test}'
在BEGIN和END模式中,不用加处理的文件,不然需要加处理的语句/etc/fstab

PATTERN
empty:空模式,匹配每一行
/regex/:显示被匹配的行

awk '/^root/{print $1}' /etc/password

关系表达式

awk -F : '$3>=1000{print $1,$3}' /etc/password

地址定界 /pattern/,/pattern/

awk -F: '/^root/,/^user1/{print $1}' /etc/passwd

BEGIN,END模式

BEGIN{}:仅在开始处理文件中的文本数据之前执行一次,如打印表头
END{}:仅在文本处理完成之后执行一次

常用语句:
if语句
必须用在{}中,且比较内容用()扩起来

awk -F: '{if($1~/mail/) print $1}' /etc/passwd (简写)                                  
awk -F: '{if($1~/mail/) {print $1}}'  /etc/passwd (全写)                                
awk -F: '{if($1~/mail/) {print $1} else {print $2}}'/etc/passwd  (if...else...)

while语句

awk -F: 'BEGIN{i=1} {while(i<NF) print NF,$i,i++}' /etc/passwd 

for循环

awk '{for(i=1;i<=NF;i++){print $i}}' /etc/password

关联数组:array[index-expression]

可以使用任意字符串,字符串要使用双引号
如果数组元素不存在,在引用时,awk会自动创建此元素,并将其初始化为空
要判断数组是否存在某元素,使用 index in array格式进行

遍历数组中每个元素则要是for循环

awk'BEGIN{weeks["mon"]="monday";weeks["tue"]="tursday";for(i in weeks){print weeks[i]}}'
netstat -tan| awk '/^tcp\>/{state[$NF]++} END{for(i in state){print i,state[i]}}'

内置函数

rand():0到1之间的随机数
length():字符串长度
split($0,A,":"):将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值
substr(s,p):返回字符串s中从p开始的后缀部分
substr(s,p,n):返回字符串s中从p开始长度为n的后缀部分

猜你喜欢

转载自blog.csdn.net/wangyeshun/article/details/82532559