linux编程之awk

gawk是由GNU组织改良后的awk,这种语言在linux操作系统上,有着很好的应用,它不需要编译,比其它语言更为简洁,而且效率极高,还能与shell进行交互,是运维人员必不可少的编辑三剑客之一

 

gawk是一种报告生成器,它将文本读入内存,然后,结符合的显示在屏幕上

 

gawk的基本语法:

gawk [options] ‘program‘ file file …

gawk [options] ‘PATTERN{action}‘file file…

 

1、gawk的输出,使用print和printf

注意:

a、各个项目之间用逗号分隔,输出时使用输出分隔符

b、输出的各item可以为字符串、数值、当前记录的字段、变量、gawk的表达式

  数值会被隐式转换为字符串后输出。

c、如果print后面的item省略,相当于print $0;输出空白使用print""

 

printf:

命令的使用格式:printf format,item1,item2,…

注意:

a、一定要指定format

b、输出时,不会自动换行,需要加入\n

c、format用于为每个item输出指定的格式

 

format的指示符以%开头,后跟一个修饰符

     %c:显示字符的ASCII符

     %d,%i:十进制的整数 

     %e,%E:科学技术法显示数值

     %f:显示浮点数

     %s:显示字符串

     %u:显示无符号整数

     %%:这是一个转义,相当于%自身

 

修饰符

     #:显示宽度,是一个数值

     -:左对齐显示

     +:显示数值的符号

     .#:取数值的精度

 

gawk的内置变量:

FS:输入时的字段分隔符

RS:输入是的行分隔符

 

OFS:输出时的字段分隔符

ORS:输出时的行分隔符

 

NF:显示字段数

NR:显示文件的行数,如果多个文件,一并线束

FNR:对NR的补充,分别对每个文件分别计数

 

ARVG:数组,保存命令的本身

实例:

gawk ‘{print $0}‘ file1 file2

ARGV[0]:gawk

ARGV[1]:file1

 

ARGC:保存gawk命令中参数的个数

上面的参数为3

 

FILENAME:gawk正在处理的文件的名称

这里是file1和file2

 

############################################

自定义变量

-v VAR_NAME=VALUE

变量名区分字符大小写

 

可以再program中定义;或是在命令行中定义

实例:

[root@blog tmp]# gawk -v test="hello linux" ‘{print test}‘ /etc/issue

[root@blog tmp]# gawk ‘{test="hello linux";print test}‘ /etc/issue

这里的issue只是为了提供遍历的次数

 

##########################################

 

gawk的输出重定向:

print items > output_file

print items >> output_file

print items | command

 

特殊的文件描述符

/dev/stdin:标准输入

/dev/stdout:标准输出

/dev/stderr:错误输出

 

实例:

将uid大于500的用户输出到common文件中

[root@blog tmp]# gawk -F: ‘$3>=500{print}‘ /etc/passwd > common_user

 

[root@blog tmp]# gawk ‘BEGIN {"date" | getline d; print d}‘

 

#########################################

 

gawk的操作符:

 

算术操作符

    x+y:相加

    x-y:相减

    x*y:相乘

    x/y:相除

    x**y,x^y:幂运算

    x%y:取模运算

    -x:负值

    +x:转换为数值

 

字符串操作符:连接

 

负值操作符

     =

     +=

     -=

     *=

     /=

     %=

     ^=,**=

     ++

     –

注意:如果模式自身为=号,则要写成/=/

 

比较操作符

     <

     <=

     >

     >=

     ==

     !=

      ~:模式匹配,左边的字符串若是能被右边的模式所匹配,则为真,否则为假

     !~:与上面相反,表示不能匹配

 

逻辑操作符

      &&:相与

      ||:相或

 

条件表达式

     selector?if-true-expression:if-false-express

 

实例:

# awk -F: ‘{$3>=500?utype="common user":utype="admin or system user";print $1,"is",utype}‘ 

/etc/passwd

 

模式:

1、格式为/PATTERN/

仅处理被/PATTERN/匹配到的行

 

2、表达式,其结果为非0或非空字符串时

仅处理满足条件的行

 

3、行范围,地址定界,start_line,stop_line

仅处理范围的行

 

4、BEGIN/END,特殊模式,运行在program之前或是之后

 

控制语句

 

if-else:

格式:if (condition) (then body) else (else body)

 

实例:将/etc/inittab文件下,大于8个字段的都显示处理

[root@blog ~]# gawk ‘{if (NF>=8) print}‘ /etc/inittab 

 

while:

格式:while (condition) {while body}

[root@blog ~]# gawk ‘{test=1;while (test<=NF) {if (length($test)>=5) 

{print $test};test++ }}‘ /etc/inittab 

 

for:

格式:for (variable assignment;condition;itenration process) {for body}

[root@blog ~]# gawk ‘{for (i=1;i<=NF;i+=2){printf "%s",$i};print ""}‘ /etc/passwd

 

next:提前结束对本行的处理,进而进入下一行的处理

显示奇数行的用户名,如果有多个文件时,使用FNR

[root@blog ~]# gawk -F: ‘{if (NR%2==0) next; print NR,$1}‘ /etc/passwd

 

gawk的内置函数

split:切割

格式:split(string,array[,fieldsep[,seps]])

功能:将string表示的字符串以fieldsep为分隔符进行切片,结果保存在array数组中

数组下表从1开始

实例:用gawk取出当前的时间,hh:mm:ss

[root@blog ~]# date | gawk ‘{split($0,arr," ");print arr[4]}‘

 

length字符串的长度

[root@blog ~]# echo "hello world" | gawk ‘{print length}‘

 

substr:

格式:substr(string,start[,length])

功能:从string中取子串,从start为起始位置为取length长度的子串

实例

[root@blog ~]# echo "hello world" | gawk ‘{print (substr($0,7))}‘

[root@blog ~]# echo "hello world" | gawk ‘{print (substr($0,2,4))}‘


本文出自 “牛叉的孩子光着屁屁” 博客,请务必保留此出处http://cshang.blog.51cto.com/6143980/1565670

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。