AWK,aho,weinberger,kernighan

GAWK,GNU awk

我们在linux上使用的awk其实是gawk的链接文件

 

  • 基本用法

gawk   [options]  'program' file

program:PATTERN

语句之间用分号分割

ps:‘{print $1,$2,$3}’

options

-F:指明输入时用到的字段分隔符,默认是空白分隔符

 

 cat/etc/fstab | tail -4 | awk '{print $1,$4}'

打印出切片第一字段和第四字段

ps:用逗号分隔各个字段

 

1、内建变量FS,输入input fieldseperator   OFS,输出  RS='  ' 输入空格作为换行符  ORS='  '输出时

  NF,'{print NF}' 每行字段数   $NF最后一字段

  NR,'{print NR}' 行编号    FNR,每个文件

 ARGC,命令行参数的个数

 ARGV

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

指定输入:分隔符,输出-分隔符

 

 

2、自定义变量:-v var=value,区分大小写

awk -vtest='hello' 'BEGIN{print test}' /etc/fstab 

 

 awk'{test="helo";print test,$1}' /etc/fstab 

 

3、printf命令

格式化输出,printf FORMAT,item1,item2,……

FORMAT必须给出,不回自动换行,需要显示给出\n,需要分别为后面没个item指定格式符

格式符:%c,ascii码    %d,显示十进制整数   %e,科学计数法   %f,浮点数 %g,%G科学计数或浮点数   %s显示字符串  %u无符号  %%百分号自身      左对齐减号,右对齐加号

awk -F: '{printf"username:%-8s,uid:%d\n",$1,$3}' /etc/passwd

 

4算数操作符:+,-,*,/,^,%

      字符串操作符号:没有符号的操作符字符串连接,赋值操作符,比较操作符,模式匹配~不匹配!~,逻辑操作符&&或||非!,函数调用function(),条件表达式selector?if-true-expression:if-false-expression

awk -F:'{$3>=1000?usertype="common user":usertype="sysadmin orsysuser";printf "%8s:%-s\n",$1,usertype}' /etc/passwd

 

5、pattern

empty:空模式,匹配每一行

/pattern/仅处理匹配到的

relational关系表达式,结果为真为假,结果为真的才被处理,一般结果为非0值都为真

 

6、action

expressions表达式

controlstatements:if,while

compoundstatements组合语句

input statements

output statements

7、控制语句

if(条件){true}

if(条件){true} else {false}

 

while(条件){true}

do{循环}while()

 

for(expr1;expr2....){循环}

deletearray[index]删除数组中元素

deletearray删除整个数组

exit

awk -F:'{if($3>=500){printf "commonusr:%-8s\n}",$1} else {printf"sysusr:%-8s\n",$1}}' /etc/passwd

awk -F:'{if($NF=="/bin/bash") print $1}' /etc/passwd

awk'{if(NF>5) print }' /etc/fstab 

 awk -F:'/^root/{i=1;while(i<=NF){if(length($i)>=4){print $i,length($i)};i++}}'./passwd