码迷,mamicode.com
首页 > 其他好文 > 详细

awk精解

时间:2017-09-18 22:35:31      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:awk

下面介绍的是三种文本处理工具之一-----------------awk


文本处理三剑客为grep、sed(流编辑器)、awk(报告生成器)。awk来源于贝尔实验室的三个人,三个字母分别提取自名字。

1、awk基础

(1)awk命令简介

 格式:awk [options] ‘program‘ file...

 program:即 pattern{action statements;...},其中pattern(BEGIN、END),action statement(print、printf)

 常用选项:

 -F -----------指明字段分隔符,默认为空白字符

 -v var=value -----------自定义变量,为自定义变量赋初始值

 例:awk [options] ‘pattern{action statements;...}‘ file...

 awk默认使用内置位置变量来存储各个字段的值,即$1、$2、...$N。使用$0保存整行的内容。

 awk默认的分隔符为空白字符。

(2)、awk工作原理

    1)、执行BEGIN{action statements} ----------awk开始之前执行,可选

    2)、执行pattern{action statements} --------逐行读取、逐行重复,可选

    3)、执行END{action statements} -------------退出awk之前执行,可选


2、awk命令 ----------变量

 awk的变量分为两种,即:内建变量、自定义变量。

 常用的10个变量介绍和示例如下:

(1)、print:标准格式显示。---------默认各个字段用逗号分隔

    print item1,item2... -------如果省略item,输出整行,相当于{print $0},输出整个文件

(2)、FS -----------输入字段分隔符,默认空白字符

       OFS ----------输出字段分隔符,默认空白字符

  例:

    # awk -v FS=‘:‘ -v OFS=‘:‘ ‘{print $1,$3}‘ /etc/passwd

  例:

    # echo -e "1 2 3\n4 5 6\n7 8 9" | awk -v FS=‘ ‘ ‘{print $1}‘ -----------自定义分隔符

    # echo -e "1 2 3\n4 5 6\n7 8 9" | awk -v FS=‘ ‘ -v OFS=‘@‘ ‘{print $1,$2}‘

    1@2

    4@5

    7@8

(3)、RS --------------输入记录分隔符,默认换行符

       ORS --------------输出记录分隔符

  例:

    # awk -v RS=‘/‘ ‘{print $0}‘ /etc/passwd 

  例:   

    # echo -e "1 2 3 4@5 6 7 8 9" | awk -v RS=‘@‘ ‘{print $0}‘

    1 2 3 4

    5 6 7 8 9

    # echo -e "1 2 3 4@5 6 7 8 9" | awk -v RS=‘@‘ -v ORS=‘/‘ ‘{print $0}‘ ---------$0代表整行

    1 2 3 4/5 6 7 8 9

(4)、NF --------------字段数量,内建

  例:

    # echo -e "1 2 3 4@5 6 7 8 9" | awk ‘{print NF}‘

    8 -------------显示字段数

    # echo -e "1 2 3 4@5 6 7 8 9" | awk ‘{print $NF}‘

    9 ------------显示最后一个字段具体的内容

  例:

  例:

    # awk -v FS=‘:‘ ‘{print NF}‘ /etc/passwd

    # awk -v FS=‘:‘ ‘{print $NF}‘ /etc/passwd

    # awk -v FS=‘:‘ ‘{print $(NF-1)}‘ /etc/passwd

(5)、NR -------------输出每次遍历的行数,可以理解为行号

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print NR}‘

    1

    2

(6)、FNR ---------输出每个文件的行数,分别统计

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print NR}‘

    1

    2 --------------若是文件众多的话,不会接上,是重新分别统计。  

(7)、FILENAEM ------------输出文件名

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print FILENAME}‘

    -

    -

(8)、ARGC --------------输出命令行参数,命令本身算一个

  例:

    # echo -e "1 2 3 4\n5 6 7 8 9" | awk ‘{print ARGC}‘

    1

    1

    # awk ‘{print ARGC}‘ /etc/passwd

    2

    ...

(9)、ARGV ---------------调用数组

  例:

    # awk ‘{print ARGV[1]}‘ /etc/passwd /etc/issue

    /etc/passwd

    /etc/passwd

(10)、varl="VALE" ----------自定义变量

    # awk -v varl=‘hello‘ -F ":" ‘{print varl ,$1}‘ /etc/passwd --------------varl ,$1(之间可以有空格,也可以没有 )

    hello root

    hello bin


3、awk命令 ------------printf

  awk中的printf命令,是格式化输出命令,默认不自动换行,需要显式给出换行控制符(\n)

  格式:printf "FORMAT" item1,item2,...

  格式符:

    %c -----------ASCII码显示

    %d,%i ---------十进制整数显示

    %f -----------浮点数显示

    %e、%E -----------科学计数法显示【数字】

    %g、%G ----------科学计数法显示【浮点数字】

    %s -----------显示字符串

    %u ------------显示无符号整数

    %% ---------------显示%自身

  

  修饰符:#[.#]

  #[.#]的第一个数字用来控制显示【宽度】,第二个数字表示小数点的【精度】。

  例:%3.1f  %5s

  #[.#]中,加入+、-有特殊意义,具体如下:

    -:表示采用左对齐机制,默认是右对齐。例:%-15s

    +:显示数字的正负符号。例:%+d

  例:

  # awk -F: ‘{printf "%-20s: %-5s\n",$1,$3}‘ /etc/passwd


4、awk命令 -------------操作符

  # awk -F: ‘$3==1000{print $0}‘ /etc/passwd 

  # awk -F: ‘$NF~/bash/{print $0}‘ /etc/passwd -----------匹配(!~不匹配)

  # awk -F: ‘$3>=500&&$3<=1000{print}‘ /etc/passwd ----------与或非

  # awk -F: ‘{$3>=1000?usertype="Common User":usertype="Super or System User";printf "%-20s: %-20s\n",usertype,$1}‘ /etc/passwd ------------条件表达式


5、awk命令 ------------匹配模式(5种)

(1)、empty ---------空模式,处理每一行

(2)、[!]/REGEXP/ ---------------是否PATTERN匹配到的行

  例:

  # awk ‘[!]/^r/{print}‘ /etc/passwd

(3)、关系表达式

  例:$3>=1000, $NF~/bash/

(4)、/regexp1/,/regexp2/ -------regexp1到regexp2的行,有多少这一类匹配结果,就显示多少次

  例:($3>=500&&$3<=1000)

  例:

  # awk ‘/^r/,/^a/{print}‘ /etc/passwd

(5)、BEGIN/END模式:

  BEGIN{} ----------开始处理时,第一行文本之前执行一次

  例:

  # awk -F: ‘BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}‘ /etc/passwd

            注意:在输出特定格式的表头时,常用此语句块;

  END{} ------------文本处理完成,命令尚未退出时,执行一次

  例:

  # awk -F: ‘BEGIN{printf "%20s %5s\n","Username","UserID"}{printf "%20s %5s\n",$1,$3}END{print "========================\n",NR " users"}‘ /etc/passwd


6、awk命令 ---------------控制语句(6个)

(1)、 if-else -----------条件判断

  例:

  # awk -F: ‘{if($3>=1000) {print $1} else {print $1,$3}}‘ /etc/passwd

(2)、while循环 ------------对一行内的多个字段逐一处理时、遍历数组

  例:

  # awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf "%s: %d\n",$i,length($i);i++}}‘ /etc/grub2.cfg 

(3)、do...while循环 -----------至少执行一次循环体中的语句

(4)、for循环:

  例:

  # awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {printf "%s: %d\n",$i,length($i)}}‘ /etc/grub2.cfg 

(5)、break、continue

  break [n]

  continue ---------------跳过本次循环,直接进入下一次循环

(6)、 next ----------提前结束本行,直接进入下一行

  例:

  # awk -F: ‘{if($3%2!=0) next;print $1,$3}‘ /etc/passwd


7、awk命令 ---------------数组

  awk关联数组,使用字符串时,字符串必须使用【双引号】。如果某数组元素事先不存在,当引用该元素时,awk会【自动创建】此元素,并且为该元素赋"空字符串"作为其初始值。

  例:

  # awk ‘BEGIN{name["leader"]="zhang";name["mem1"]="li";name["mem2"]="wang";print name["leader"]}‘

  # ss -tn | awk ‘/^ESTAB\>/{print $NF}‘ | awk -F: ‘{state[$1]++}END{for(s in state){print state[s],s}}‘ ------------查看已连接状态下,同一客户端的连接数量


awk精解

标签:awk

原文地址:http://12496428.blog.51cto.com/12486428/1966463

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!