awk基本用法
基本用法: 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 指明输入时用到的字段分隔符 -v var=value: 自定义变量
awk语言
基本格式:awk [options] ‘program‘ file… ? program:pattern{action statements;..} ? pattern和action: ? pattern部分决定动作语句何时触发及触发事件 BEGIN,END ? action statements对数据进行处理,放在{}内指明 print, printf 分割符、域和记录 ? awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为 域标识。$0为所有域, 注意:和shell中变量$符含义不同 ? 文件的每一行称为记录 ? 省略action,则默认执行 print $0 的操作
awk工作原理
? 第一步:执行BEGIN{action;… }语句块中的语句 ? 第二步:从文件或标准输入(stdin)读取一行,然后执行 pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一 行重复这个过程,直到文件全部被读取完毕。 ? 第三步:当读至输入流末尾时,执行END{action;…}语句块 ? BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个 可选的语句块,比如变量初始化、打印输出表格的表头等语句通常 可以写在BEGIN语句块中 ? END语句块在awk从输入流中读取完所有的行之后即被执行,比如 打印所有行的分析结果这类信息汇总都是在END语句块中完成,它 也是一个可选语句块 ? pattern语句块中的通用命令是最重要的部分,也是可选的。如果没 有提供pattern语句块,则默认执行{ print },即打印每一个读取到的 行,awk读取的每一行都会执行该语句块
awk变量
? 变量:内置和自定义变量 ? FS:输入字段分隔符,默认为空白字符 awk -v FS=‘:‘ ‘{print $1,FS,$3}’ /etc/passwd awk –F: ‘{print $1,$3,$7}’ /etc/passwd ? OFS:输出字段分隔符,默认为空白字符 awk -v FS=‘:’ -v OFS=‘:’ ‘{print $1,$3,$7}’ /etc/passwd ? RS:输入记录分隔符,指定输入时的换行符 awk -v RS=‘ ‘ ‘{print }’ /etc/passwd ? ORS:输出记录分隔符,输出时用指定符号代替换行符 awk -v RS=‘ ‘ -v ORS=‘###‘‘{print }’ /etc/passwd ? NF:字段数量 awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$ awk -F: ‘{print $(NF-1)}‘ /etc/passwd ? NR:记录号 awk ‘{print NR}‘ /etc/fstab ; awk END‘{print NR}‘ /etc/fstab
?FNR:各文件分别计数,记录号 awk ‘{print FNR}‘ /etc/fstab /etc/inittab ?FILENAME:当前文件名 awk ‘{print FILENAME}’ /etc/fstab ?ARGC:命令行参数的个数 awk ‘{print ARGC}’ /etc/fstab /etc/inittab awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab ?ARGV:数组,保存的是命令行所给定的各参数 awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
awk自定义变量
?自定义变量(区分字符大小写) (1) -v var=value (2) 在program中直接定义 ?示例: (1)awk -v test=‘hello gawk‘ ‘{print test}‘ /etc/fstab (2)awk -v test=‘hello gawk‘ ‘BEGIN{print test}‘ (3)awk ‘BEGIN{test="hello,gawk";print test}‘ (4)awk –F:‘{sex=“male”;print $1,sex,age;age=18}’ /etc/passwd (5)cat awkscript (6){print script,$1,$2} (7)awk -F: -f awkscript script=“awk” /etc/passwd
awk模式匹配
?模式匹配符: (1) ~:左边是否和右边匹配包含 !~:是否不匹配 ?示例: (1)awk –F: ‘$0 ~ /root/{print $1}‘ /etc/passwd (2)awk ‘$0~“^root"‘ /etc/passwd awk ‘$0 !~ /root/‘ /etc/passwd (3)awk –F: ‘$3==0’ /etc/passwd