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

16.3、awk使用介绍

时间:2018-01-22 14:03:53      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:asc   grep   ons   etc   自动   命令行   选项   $0   令行   

1、linux文本处理工具:

    文本过滤工具:grep、egrep、fgrep

    行编辑工具:sed

    格式化文本工具:awk、gawk

注意:centos7中,awk是指向gwak的链接文件。

[root@localhost ~]# ll -l `which awk`

lrwxrwxrwx. 1 root root 4 Aug 29 20:01 /usr/bin/awk -> gawk

[root@localhost ~]# 


2、awk工作原理:

    awk从文本中一次读取一行,按指定的分隔符切割成若干个片段部分,默认的分隔符是“空白”字符,每个分片都保存在awk内建的变量中($1,$2,$3...),然后用动作(常用的print、printf命令)去输出这些行中的某一个分片、某几个或者整行分片。整行内容用"$0"表示,切割出来的每一分片,也可以进行加工处理。

    

3、awk命令:

   格式:gawk [OPTIONS] 'program' FILE ...   //注意program要用单引号引起来

3.1、awk的OPTIONS:

    -F:指定输入时的字段分割符,用于文件中读取时以什么为分割符;默认为空格分割符

    -v var=value :自定义变量




3.2、awk的program的格式:

    PATTERN{ACTION STATEMENT}  //此处的PATTERN作用主要是界定需要编辑的行,action执行的动作,statement要执行的语句,可以有多个,语句之间以分号(;)分隔。

示例:

[root@localhost ~]# tail -3 /etc/fstab | awk '{print $2,$4}'  //输出时默认以空白字符分隔片段;cut只能理解单个或固定的空白字符。


常用的action:

    ①、expression:运算表达式   

    ②、control statement:控制语句,如if、while语句等

    ③、compound statement:组合语句

    ④、input statement:输入语句

    ⑤、outprint statement:输出语句,如print,printf


⑤.1、输出语句--print

    语法格式:print item1,item2,...  

     解释:多个字段(item)以逗号分隔,否则输出时是合并在一起输出的;

        输出的各item字段可以是字符、数值、当前记录的字段变量或awk的表达式;

        如果省略item,则输出整行内容,相当于打印"$0"

print示例:

[root@localhost ~]# tail -3 /etc/fstab  | awk '{print "hello:" $1,$2}'  

hello:UUID=43446f03-00c0-4d49-a4f3-2050cecfff9e /boot

hello:/dev/mapper/cl-swap swap

[root@localhost ~]# tail -3 /etc/fstab  | awk '{print "hello: $1,$2"}'  //print后放在双引号中的内容不会被替换成其他数值。

hello:/dev/mapper/cl-root /

hello: $1,$2

hello: $1,$2

hello: $1,$2

[root@localhost ~]# 


⑤.2、输出语句--printf:格式化输出

    语法格式:printf FORMAT,item1,item2,...   //format为格式符,它会为每个item占一个位置,item的数值会套用format中定义的格式。

    语法要点:

        FORMAT必须给出

        printf不会自动换行,如要换行,需要显式给出换行控制符"\n"

         FORMAT中需要分别为后面的每个item指定一个格式化符号


FORMAT格式符介绍:

    %c:显式字符的ASCII码

    %d或%i:显式为十进制的整数

    %e或%E:科学计数法数值显式

    %f:显式为浮点数

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

    %s:显示为字符串

    %u:显示为无符号整数

    %%:显示%自身

    

printf示例:






3.3、awk的变量介绍:

 内建变量:

        FS:input filed Seperate,输入片段分隔符,默认为空白字符

        OFS:output filed seperate,输出片段分隔符,默认为空白字符

           示例:[root@localhost ~]# awk -v FS=':' '{print $1,$2}' /etc/passwd //指定输入分隔符为: ,然后打印出每行的第一个和第二个分片部分 

              [root@localhost ~]# awk -F: '{print $1}' /etc/passwd   //直接用—F选项指定分隔符:

              [root@localhost ~]# awk -v FS=':' -v OFS=':' '{print $1,$2}' /etc/passwd   //指定输入分隔符和输出分隔符,每个-v选项定义一个变量

        RS:input record Seperate:指定输入时的换行符,很少用到

        ORS:outpunt reccord seperate:指定输出时的换行符,很少用到

          示例:[root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' '{print $0}'   //指定输入时的换行符为:

              [root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' -v ORS='#'  '{print $0}'  //指定输入时的换行符为:,输出换行符#             

        NF:number of filed,统计每一行分片后的分片个数

          示例:[root@localhost ~]# head -1 /etc/passwd | awk  -v FS=':' '{print NF}' //统计以':'分隔后分片字段个数,结果为7,注意此处的NF不要加$符号

              [root@localhost ~]# head -1 /etc/passwd | awk  -v FS=':' '{print $NF}' //如果NF前加上$符号,表示引用每行的最后一个分片字段,相当于$7;

                注意:awk中引用变量时不要加$符号,但是引用分片字段时要加$符号

        NR:number of reord:统计行数(会显示每一行的行号,如果有多个文件会统一编号)

          示例:[root@localhost ~]# awk '{print NR,$1}' /etc/fstab  //统计文件有多少行

              [root@localhost ~]# awk '{print NR,$1}' /etc/fstab /etc/issue  //有多个文件时会统一编号

        FNR:number of reord:统计行数(会显示每一行的行号,如果有多个文件不会统一编号)

          示例:[root@localhost ~]# awk '{print FNR,$1}' /etc/fstab /etc/issue  //有多个文件时不会统一编号

        FILENAME:显示被处理的文件名称,即被awk处理的文件的名称

          示例:[root@localhost ~]# awk '{print FILENAME}' /etc/issue  //会每行显示一个文件名

        ARGC:bash命令行参数的个数

        ARGV:数组,保存的是bash命令行所给定的各参数

         示例:[root@localhost ~]# awk 'BEGIN{print ARGC}' /etc/issue   //ARGC统计命令行给的参数个数

               2

               [root@localhost ~]# awk 'BEGIN{print ARGV[0]}' /etc/issue  //引用bash命令行保存的数组参数

               awk

               [root@localhost ~]# awk 'BEGIN{print ARGV[1]}' /etc/issue  

               /etc/issue

               [root@localhost ~]# awk 'BEGIN{print ARGV[2]}' /etc/issue  



   

自定义变量:

    方法一:-v var=value  //var为变量名,value是变量值;需要注意的是:awk中的变量名区分大小写

          示例:

            [root@localhost ~]# awk -v test='hello magedu' '{print test}' /etc/issue  //print后此处引用变量不要加$符号

            hello magedu

            hello magedu

            hello magedu

    方法二:在program中直接定义:

         示例:

            [root@localhost ~]# awk  '{test="hello magedu";print test}' /etc/issue  //多个语句间用分号分隔。

            hello magedu

            hello magedu

            hello magedu

            [root@localhost ~]# 














16.3、awk使用介绍

标签:asc   grep   ons   etc   自动   命令行   选项   $0   令行   

原文地址:http://blog.51cto.com/10631377/2063616

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