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

awk工具的使用

时间:2018-04-20 23:37:28      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:awk的使用

awk是一个文本处理器,主要用于格式化文档输出

awk命令

  1. 格式:awk [option] ‘program’ file (命令,选项,命令主体,文件)
    命令主体部分:[/模式/]{动作} (命令主体部分应该用单引号引起来)
    模式部分可有可无:是用来决定何时触发awk,以及怎么触发
    动作部分:决定怎么处理数据,需要将动作放到"{ }"中
    选项部分:
    -f,--file program-file:从指定的文件中加载program语句块,而不是通过命令行给出相关的程序内容;
    -F,--field-separator fs:指定字段的输入分隔符;默认是空白字符;
    -v,--assign var=val:用于声明自定义变量并为变量赋值;

    1. awk中的一些概念:
      a.分隔符:
      输入分隔符:awk处理数据时,会根据特定的标识符号把数据分段,这种标识符就是输入分隔符,默认为空白符
      输出分隔符:将数据处理完成后,会用分隔符将这些分段的数据连接起来,这样的分隔符叫输出分隔符;默认也为空白符;

              b.记录
                      awk处理数据时,用换行符分开的每一行就是一个记录,通常用$0表示
              c.字段
                      awk用分隔符将一个记录分成若干个字段,字段分别用$1,$2,$3,....$NF表示($NF用来表示最后一个字段)

      3.awk的工作原理:
      1.awk首先会执行BEGIN{动作。。。}语块中的语句
      2.awk然后会执行/模式/{动作。。。}语块内的语句
      3.awk最后会执行END{动作。。。}语块内的语句
      注意:
      1) BEGIN语句块在awk开始处理数据内容之前就被执行;通常用于生成表头;此语句块是可选语句块;
      2) END语句块在处理完所有的数据之后,才会被执行;通常用于数据汇总;此语句块是可选语句块;
      3)/模式/ {动作}语句块特别重要,其模式语句块不能省略,但是其动作语句可以省略,若省略默认执行print命令
      4.awk的用法
      内建变量:(awk自己定义的变量,每个变量都有其不同的功能)
      FS:输入字段分隔符,默认空白符

      
      [root@bogon html]# awk -v FS=: ‘{print $1,$2}‘ /etc/passwd
      root x
`使用 : 作为分隔符并且输出第一第二字段,注意变量必须使用 -v 声明
                            OFS:输出字段分隔符,默认空白符

[root@bogon html]# awk -v FS=: -v OFS="--" ‘{print $1,$2}‘ /etc/passwd
root--x

```修改输出分隔符
RS:输入换行符,用来分隔记录的

[root@bogon html]# awk -v RS="/" ‘{print $0}‘ /etc/passwd
root:x:0:0:root:
root:
bin
bash
                    ORS:输出换行符,用来决定记录如何输出
[root@bogon html]# awk -v ORS="------" ‘{print $0}‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash------bin
                    NF:每一行字段的总数
root@bogon html]# awk -F : ‘{print NF}‘ /etc/passwd
7
//显示一行内字段的总数
[root@bogon html]# awk -F : ‘{print $NF}‘ /etc/passwd
/bin/bash
//显示最后一个字段
                    NR:行的总数,可以看做每一行的行号
[root@bogon html]# awk -F : ‘{print NR}‘ /etc/passwd
1
2
3
//显示各行的行号
[root@bogon html]# awk -F : ‘{print $NR}‘ /etc/passwd
root    //第一行的第一个记录
x        //第二行的第二个记录 
2
4
lp
/sbin
/sbin/shutdown       //第七行的第七个记录
//可以看出NR是根据行变化而变化的
                FNR:可以处理多个文件,并分别显示他们的行

                FILENAME:正在被处理的文件的文件名字
[root@bogon html]# awk  ‘{print FILENAME}‘ /etc/passwd
/etc/passwd
/etc/passwd
//因为awk是一行一行的处理文本的,所以为了避免重复,我们可以使用END{动作}来总结
                ARGC:命令行内参数的数量  
[root@bogon html]# awk ‘END{print ARGC}‘ /etc/passwd
2
//包括awk命令本身,但不包括awk命令的选项部分和program部分 所以为2
                    ARGV:由命令行参数构成的数组
[root@bogon html]# awk ‘END{print ARGV[1]}‘ /etc/passwd
/etc/passwd
[root@bogon html]# awk ‘END{print ARGV[0]}‘ /etc/passwd
awk
        4.自定义变量
                        定义方式 -v 名字=值
                        示例
[root@bogon html]# awk -v var=www -F : ‘{print $1,var}‘ /etc/passwd
root www
//注意:在引用变量时不需要添加$符号,否则引用的是$0

4.常见的动作
print:以标准的格式输出 ‘’{print itm1,itm2}‘’
注意:各item之间用逗号隔开
item可以是数字,字符串,变量,字段,还可以是awk的表达式
默认的item是$0
若各item用空格隔开或没隔开,则输出的结果将不会有输出分隔符

    printf:格式化输出  ‘{printf "格式" item1,item2...}‘
                注意:printf的格式没有自动换行,所以需要在格式末尾添加\n
                                    printf必须给出格式
                                    "格式"需要为后面的每一个item单独指定一个格式化符号,若不指定则不会输出未指定的那一列
                                    格式与item也需要使用逗号隔开
                常见的格式:
                            %c:以ASCII码表中的内容显示字符信息;
                        %d, %i:显示十进制整数;
                        %e, %E:以科学计数法来显示数字;浮点类型;
                        %f, %F:显示十进制数字的浮点形式;
                        %g, %G:以科学计数法显示浮点数字;
                        %u:显示无符号十进制数;
                        %s:显示字符串;
                        %x, %X:显示无符号的十六进制整数;
                        %%:显示%;
                        #[.#]:第一个数字用来控制显示宽度;第二个数字表示小数点的精度;
                            如:%5s, $8.3f
                            -:表示采用左对齐方式显示;默认是右对齐;
                        +:显示数字的正负符号;                                    
[root@bogon html]# awk -F: ‘{printf "%20s : %3s :%-+10s\n",$1,$2,$3}‘ /etc/passwd
                root :   x :0         
                 bin :   x :1 
    //注意:#【.#】  +  -  ,也应该放到%后面

5.操作符:
算术运算操作符:
双目运算符:
x+y, x-y, x*y, x/y, x^y, x%y

[root@bogon html]# awk ‘END{print 5-4,5^2}‘ /etc/passwd
1 25
                    单目运算符:
                        -x:将正整数转换为负整数;
                        +x:将字符串转换为数值;

                字符串操作符:
                    无任何操作符号时,即为字符串连接操作;

                赋值操作符:
                    =, +=, -=, *=, /=, ^=, %=
                    ++, --

                比较操作符:
                    ==, !=, >, >=, <, <=
[root@bogon html]# awk -F: ‘$3==1{print $1}‘ /etc/passwd
bin
//若是字符串比较需要加引号
                模式匹配操作符:
                    ~:操作符左侧的字符串是否能够被右侧的PATTERN所匹配;
                    !~:操作符左侧的字符串是否不能被右侧的PATTERN所匹配;
[root@bogon html]# awk -F: ‘$1~/root/{print $1,$3}‘ /etc/passwd
root 0
//PATTERN需要用双斜线扩住
                逻辑运算操作符:
                    &&
                    ||
                    !
                    示例:
                        ~]# awk -F: ‘$3>=1000&&$3<=1100{print $0}‘ /etc/passwd

                条件表达式:
                    selector(condition)?if-true-expression:if-false-expression
[root@bogon html]# awk -F: ‘{$1=="root"?type="super":type="laji";print $1,type}‘ /etc/passwd
root super
bin laji
//注意:变量赋值加引号

6.program的模式部分
1.啥也不写:处理每一行
2.模式内输入一些,内容或者关系表达式,可以在前面加入!选择不匹配
3.可以用NR的范围确定行的范围
4.俩个模式用逗号隔开,可以匹配范围内行

awk工具的使用

标签:awk的使用

原文地址:http://blog.51cto.com/wangchaode/2105959

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