首页 > 代码库 > Linux之awk

Linux之awk

  

一:awk为报告生成器


spacer.gif

wKioL1P7IkWyOEMRAABpBl-b3n0767.jpg

spacer.gif

AWK字段:awk对每行文档按照分隔符把行内的内容切成每个字段。

$0:代表整行。

$1...$N:代表被分割符分开的每个字段。


二:awk基本语法

基本语法:awk [options] ‘program‘ file file ...

                  awk [options] ‘PATTERN{action}‘ file file ...


输入选项: -F  指定分割符选项。

                 awk   -F :    ‘ {print  $1 ,$7} ‘  /etc/passwd     #指定以冒号作为字段分割符。


PATTERN: awk的输出

                  print item1, item2, ........

 要点:
 (1) 各项目之间使用逗号分隔,而输出时则使用输出分隔符分隔;
 (2) 输出的各item可以字符串或数值、当前记录的字段、变量或awk的表达式;数值会被隐式转换为字符串后输    出;

 (3) print后面item如果省略,相当于print $0输出整串内容;要想后面输出空白,使用pirnt " " (在awk中输出

子串要使用双引号);

 

awk的变量:内置变量,自定义变量

   

          内置变量:输入时的字段分隔符 (awk的内置变量前要用BEGIN)

                     FS:Field Seperator, 输入时的字段分隔符

          #  awk ‘BEGIN{FS=":"}{print $1,$7}‘ /etc/passwd      #内置变量的引用要用到双引号

                     RS:Record Seperator, 输入行分隔符

#  awk ‘BEGIN{RS=":"}{print }‘ /etc/passwd   #会把冒号分开的内容当作每一行来处理

wKiom1P7IdDx_pavAABDgJYeX6Q550.jpg

OFS: Output Field Seperator, 输出时的字段分隔符
     #  awk ‘BEGIN{FS=":";OFS=":"}{print $1,$7}‘ /etc/passwd     #语句与语句之间要用分号分割 (红色部分)

wKiom1P7If3iX_noAADtjNk1aK4594.jpg

     ORS: Outpput Row Seperator, 输出时的行分隔符

         

wKiom1P7IlSQ-DYUAAGnaredKsU331.jpg

 

    NF:Numbers of Field,字段数    #取最后一个字段还可用$NF

        

    NR:Numbers of Record, 行数如果后面跟有多个文件的话那么就是所有文件的一并计数;

       # awk ‘BEGIN{FS=":";OFS=":"}{print NR $1,$7}‘ /etc/passwd /etc/group


wKiom1P7I5PwimubAABqlRewKGw993.jpg

         FNR:行数;各文件分别计数

         # awk ‘BEGIN{FS=":";OFS=":"}{print FNR $1,$7}‘ /etc/passwd

wKioL1P7JQ-iVyqVAAECcpFX6Hs234.jpg

     ARGV:数组,保存命令本身这个字符,awk ‘{print $0}‘ 1.txt 2.txt,意味着ARGV[0]保存awk,

    # awk ‘BEGIN{print ARGV[0],ARGV[1],ARGV[2],ARGC}‘ /etc/passwd /etc/group

wKiom1P7JCSS0kiOAABo9Kv6z10251.jpg

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

         自定义变量:输入时的字段分隔符 (awk的内置变量前要用BEGIN

  -v var_name=VALUE   变量名区分字符大小写

  (1) 可以program中定义变量;

  (2) 可以命令行中通过-v选项自定义变量;


 # awk ‘BEGIN{a="hello awk"}{print a}‘ /etc/passwd

wKioL1P7JYyjQR0pAACatKHyeyc791.jpg


       #awk ‘BEGIN{a="hello awk";print a}‘  #可以不跟文件  直接输出hello awk


       #awk -v a="hello awk" ‘BEGIN{print a}‘    #直接输出hello awk


 awk的printf命令


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


要点:

  (1) 要指定format;

  (2) 不会自动换行;如需换行则需要给出\n

  (3) format用于为后面的每个item指定其输出格式;


format格式的指示符都%开头,后跟一个字符:

   %c: 显示字符的ASCII码;

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

   %e, %E: 科学计数法显示数值;

   %f: 显示浮点数;

   %g, %G: 以科学计数法格式或浮点数格式显示数值;

   %s: 显示字符串;

   %u: 显示无符号整数;

   %%: 显示%自身;

  修饰符:

   #:显示宽度

   -:左对齐

   +:显示数值的符号

   .#: 取值精度


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

wKioL1P7Jezx7DtvAAFFWrKT3JI478.jpg

    # awk ‘BEGIN {printf "%f\n",3.1415}‘         #显示7个字节

wKioL1P7JhnB-qtZAAA8c1BBAgg700.jpg


        # awk ‘BEGIN {printf "%f\n",3.1415926}‘     #总位数超过8位,小数点后面要进行四舍五入

wKiom1P7JSvj4lC4AABBn1wV8T4765.jpg

   # awk ‘BEGIN {printf "%15.2f\n",3.1415926}‘    #15.2 表示整体为15个位宽加小数点后两位

wKioL1P7JnXSLJPKAABFFslokO8387.jpg

awk输出重定向


  print items > output-file

  print items >> output-file

  print items | command

  特殊文件描述符:

  /dev/stdin: 标准输入

  /dev/stdout: 标准输出

  /dev/stderr: 错误输出

awk的操作符

          

算术操作符:

   x+y

   x-y

   x*y

   x/y

   x**y, x^y

   x%y

   -x:负值

   +x:转换为数值

  字符串操作符:连接

  赋值操作符:

   =

   +=

   -=

   *=

   /=

   %=

   ^=

   **=

   ++

   --

   如果模式自身是=号,要写为/=/

  比较操作符:

   <

   <=

   >

   >=

   ==

   !=

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

   !~:

  逻辑操作符:

   &&: 与

   ||:或

  条件表达式:

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

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

  函数调用:

  function_name(argu1,argu2)

                


本文出自 “slayer” 博客,请务必保留此出处http://slayer.blog.51cto.com/4845839/1544885

Linux之awk