Awk

参数

-F 紧跟分隔符,表示读入的字段以输入的分隔符分割
-v 进入变量模式可以进行变量的赋值及调用(调用不需要加$符)

$n  当前记录的第n个字段,字段间由 FS分隔。
$0  完整的输入记录。
FS  字段分隔符(默认是任何空格)。
IGNORECASE  如 果为真,则进行忽略大小写的匹配。
NF  当前记录中的字段数。
NR  当 前记录数。
例子

简单例子

cat /etc/passwd |grep root |awk -F ':' '{print $2}'
#输出/etc/passwd中关于root的第二个位置的内容

awk -F: '{if(NR>=10 && NR<=20) print $3 }' /etc/passwd > test
#将passwd中的第三列放到test中

awk -F: '$3>=500  {print $1,$3}' /etc/passwd
#将UID大于等于500的用户及UID打印出来

route | grep -e "^0.0.0.0" | awk 'NR==1{print $2}'
#查看网关
ifconfig | grep `route -n | grep -e "^0.0.0.0" | awk 'NR==1{print $8}'` -A 1 | awk 'NR==2 {print $2}'
#获取本机IP

if 语句

cat test | awk -F: '{\
 if ($1 == "root"){\
 print $1;\
 }else if($1 == "bin"){\
 print $2;\
 }else{\
 print $3;\
 } \
}'
for语句
awk '{\
 for(i=0;i<NF;i++){\
 if ($i ~/^root/){\
 print $i;\
 }else if($i ~/zhangy/){\
 print $i;continue;\
 }else if($i ~/mysql/){\
 print $i;next;\
 }else if($i ~/^test/){\
 print $i;break;\
 } \
 }\
}' test
函数
echo "32:34" |awk -F: '{print "max = ",max($1,$2)}\
function max(one,two){
if(one > two){
 return one;
}else{
 return two;
}
}'
正则
awk -F: '{mat=match($1,/^[a-zA-Z]+$/);print mat,RSTART,RLENGTH}' test
综合查询
cat test |awk -F: '\
 NF != 7{\
printf("line %d,does not have 7 fields:%s\n",NR,$0)}\
$1 !~ /^[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%s: %s\n",NR,$1,$0)}\
$2 == "*" {printf("lind %d,no password:%s\n",NR,$0)}'