AWK
AWK
awk默认以空格符为间隔符号,将每行分隔为单独的字段,也可以使用awk内置变量FS定义间隔符号。
eg:awk 'BEGIN {FS="[:\t+ ]"} {print $1}' file.passwd 说明:多个间隔符、多个tab当做一个
awk -v test="abc" 'BEGIN {print test}' 说明:-v代表设置变量
awk '{if ($2~/^[0-9][0-9]$/) print $0}' score 说明:匹配第二个字段是两位数字的
系统变量
NF变量标识当前记录的字段数
eg:awk -F: '{print NF"="$NF}' file.passwd
NR当前记录的个数,可用作行号,多个文件为总记录数
eg:awk 'BEGIN {FS=":"};{print NR,$1}' file.pw
FNR当前记录的个数,多个文件分别为自己的记录数
eg:awk 'BEGIN {FS=":"};{print NR,$1}' file.pw /etc/passwd
OFS输出字符的分割符(默认为空格)
eg:awk 'BEGIN {OFS="\n\t"};{all=$2+$3+$4+$5+$6;print $1,all}' score
ORS输出记录的分割符(模人物换行)
eg: awk 'BEGIN {OFS="\n\t";ORS="\n#"};{all=$2+$3+$4+$5+$6;print $1,all}' score
ARGC命令行中参数的个数、ARGV包含命令行参数的数组
eg:awk 'BEGIN {print "ARGC="ARGC;for(i in ARGV) {print i"="ARGV[i];}}' file.pw /etc/passwd
操作符
赋值操作符 =、+=、-=、/=、^=、**=
eg:awk '{x+=1;print x,$0}' score
三目 ? :
逻辑或 ||、逻辑与&&
eg:awk '{if ($2~/^[0-9][0-9]$/ && $3>90) print $0}' score
关系操作符<、<=、>、>=、!=、==
eg:awk '{if ($2>90) print $0}' score
字段引用$
运算符
加减法 +、-
乘、除、取模 *、/、%
求幂 ^、**
递增、递减 ++、--
条件语句
if else
eg:awk 'BEGIN {if (0) {print "ok"} else {print "fail"}}'
eg:awk '{if ($3<90){print $1,$NF}}' score
eg:awk -F: '{if ($3<100 && $NF~/\/bin\/bash/) {print $1,$NF}}' /etc/passwd
eg:awk -F: -f a.awk /etc/passwd
eg:awk -F: '{for (i=NF;i>0;i--) print $i;print "\n"}' file.pw
函数
eg:awk 'BEGIN {print rand();print rand();srand();print rand();print rand()}'
eg:awk 'BEGIN {phone = substr("13900443291",5);print phone}'
eg:awk 'BEGIN {phone = substr("13900443291",1,5);print phone}'
eg:awk 'BEGIN {phone = length("13900443291");print phone}'
eg:awk -F: '{print $1,toupper($1),tolower(toupper($1))}' file.pw
附文件:
a.awk
{
if($3 < 100)
print $1,$3
else if ($3 >= 100 && $3 < 500)
print $1,$3,$NF
else
print $1,$3,$4,$NF
}
file.pw
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
kevin 100 100 88 98 78
tony 90 84 94 28 39
clare 90 99 98 96 100
jorey 89 100 99 88 97