gawk:pattern scanning and processing language
语法:gawk [options] ‘program‘ FILE ...
program:PATTREN{ACTION STATEMENTS}
选项:
-F :指明输入数据时的字段分隔符
-v var=value:自定义变量
1、print
print item1,item2,...
要点:(1) 逗号分隔符
(2) 输出的各item可以是字符串,数值,字段(使用&引用),变量(直接输入变量即可)或者awk表达式
(3) 如果省略item,相当于print $0
2、变量
内置变量
FS:input field seperator输入时的分隔符:默认为空白字符
OFS:onput field seperator输出时的分隔符:默认为空白字符
RS:input record seperator:输入时的换行符
ORS:output record seperator:输出时的换行符
NF:number of field :每一行字段数量
NR:number of recor :行数
FNR:各文件分别计数:行数
FILENAME:当前文件名
ARGC:命令行参数的个数 (命令前使用BEGIN只显示一次)
ARGV:数组ARGV[#]:保存的是命令行中所给定的各参数
自定义变量
(1)-v var=value 区分大小写
(2) 在program中直接定义
awk ‘{test="1";print test}‘ filename
若不对文件做处理:awk ‘BEGIN{test="1";print test}‘
3、printf命令
格式化输出:printf FORMAT(格式符),item1,item2,...
(1) FORMAT 必须给出
(2) 不会自动换行,需要显示给出换行控制符 \n
(3) FORMAT需要分别为后面的每个item指定一个格式化符号
格式符:
%c :显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:科学计数法数值显示
%f:浮点数
%g,%G:科学计数法或浮点数
%s:字符串
%u:无符号整数
%%:显示%自身
修饰符:
#[.#]:第一个数字控制显示的宽度,第二个显示小数点后的精度(%3.1f)
-:左对齐,默认右对齐
+:显示数值的符号(正负)
4、操作符
算数操作符
双目:+-*/ ^ %
单目:-x +x
字符串操作符:没有符号的操作符,字符串连接
赋值操作符: = += -= *= ...
比较操作符: > >= < <= != ==
模式匹配符:~ 匹配
!~ 不匹配
逻辑操作符:&& || !
函数调用:function_name(argu1,argu2,...)
条件表达式:select?if-true-expression:if-false-expression
5、pattern
(1) empty:空模式,匹配每一行
(2) /regular expression/:正则表达式,仅处理匹配行
(3) 条件表达式/关系表达式:结果有“真”“假”,处理结果为“真”的行
真:结果为非0值,非空字符串
(4) line ranges:行范围
startline,endline:/pat1/,/pat2/由模式匹配指出范围
不支持直接给出数字的格式
awk -F:‘(NR>=2&&NR<=10){print $1}‘ /etc/passwd
(5) BEGIN/END模式
BEGIN{} :仅在开始处理文件中文本之前执行一次的程序
END{}:仅在文本处理完成之后执行一次
6、常用action
(1) expressions
(2) control statements:if,while等
(3) compound statements:组合语句:
(4) input statements
(5) output statements
7、控制语句
if(condition) {statements} else {statements}
while(conditon) {statements}
do {statements} while(conditon)
for(expr1;2;3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }
示例:
1、-F:指明输入数据时的字段分隔符,默认为空白字符。示例为使用“:”为分隔符,并输出第一组元素:
[[email protected] ~]# tail -n 5 /etc/passwd | gawk ‘{print $1}‘ pulse:x:497:496:PulseAudio sshd:x:74:74:Privilege-separated tcpdump:x:72:72::/:/sbin/nologin armo:x:500:500:CentOS named:x:25:25:Named:/var/named:/sbin/nologin [[email protected] ~]# tail -n 5 /etc/passwd | gawk -F: ‘{print $1}‘ pulse sshd tcpdump armo named
2、-v var=value与BEGIN共同使用:单独使用BEGIN不处理文本,只做输出动作,结合自定义变量的使用:(可使用选项定义,也在直接在program中定义变量)
[[email protected] ~]# awk -v test=armo ‘BEGIN{print test}‘ armo [[email protected] ~]# awk ‘BEGIN{test="armo";print test}‘ armo
3、内置变量的使用:NR:显示行号
[[email protected] ~]# tail -n 5 /etc/passwd | awk -F: ‘{print NR,$1,$2 }‘ 1 pulse x 2 sshd x 3 tcpdump x 4 armo x 5 named x [[email protected] ~]#
4、printf的格式化输出
[[email protected] ~]# awk -F: ‘{printf ("%s,%s\n",$1,$2)}‘ /etc/passwd root,x bin,x daemon,x adm,x lp,x ... [[email protected] ~]# awk -F: ‘{printf ("%15s --%5s\n",$1,$2)}‘ /etc/passwd root -- x bin -- x daemon -- x adm -- x lp -- x sync -- x shutdown -- x halt -- x mail -- x 第一域字符宽度15,第二域字符宽带5 [[email protected] ~]# awk -F: ‘{printf ("%-15s%+5.3f\n",$1,$3)}‘ /etc/passwd root +0.000 bin +1.000 daemon +2.000 adm +3.000 lp +4.000 sync +5.000 shutdown +6.000 第一域左对齐宽度15输出,第三域显示数值正负、宽度5、小数点后精确到三位输出
4、操作符使用说明示例
[[email protected] ~]# awk -v a=2 -v b=1 ‘BEGIN{print "sum="a+b }‘ sum=3 [[email protected] ~]# awk -F: -v a=2 -v b=1 ‘{$3>=5?SUM=a+b:SUM=a+a;print $1,SUM}‘ /etc/passwd root 4 bin 4 daemon 4 adm 4 lp 4 sync 3 shutdown 3 halt 3 mail 3 uucp 3
5、pattern示例
[[email protected] ~]# awk -F: ‘(NR>=2&&NR<=10){print NR,$1}‘ /etc/passwd 2 bin 3 daemon 4 adm 5 lp 6 sync 7 shutdown 8 halt 9 mail 10 uucp [[email protected] ~]#