参考:http://www.zsythink.net/archives/tag/awk/

 

一. 命令awk简介

    1. awk是一种编程语言,用于对文本和数据进行处理的

    2. 具有强大的文本格式化能力

    3. 利用命令awk,可以将一些文本整理成为我们想要的样子

    4. 命令awk是逐行进行处理的

 

二. grep、sed、awk的简单比较

    1. 命令grep,更适合单纯的查找或匹配文本

    2. 命令sed,更适合对匹配到的文本进行编辑

    3. 命令awk,更适合文本格式化,对文本进行较复杂的格式处理

 

三. 命令awk基本语法

    awk [options] 'pattern{action}' file

   1. 在没有options和pattern的情况下,使用命令awk

    Linux日常之命令awk

    2. pattern包括两种特殊模式,分别是BEGIN和END

    (1)BEGIN模式,是指命令在处理文本之前执行

    Linux日常之命令awk

    (2)END模式,是指命令在处理文本之后执行

              Linux日常之命令awk

    (3)BEGIN模式和END模式同时存在时,其中,BEGIN与END之间的{}相当于一个循环体,对文件中的每一行进行处理

    Linux日常之命令awk

  3. 常用的参数

    (1)-F,用于指定输入分隔符

    Linux日常之命令awk

    (2)-v,用于设置变量的值

    Linux日常之命令awk

    Linux日常之命令awk

      从文件中输入变量

    Linux日常之命令awk

 

四. 变量

  awk中的变量分为内置变量和自定义变量两种

  1. 内置变量

FS 输入字段分隔符,默认为空白字符
OFS 输出字段分隔符,默认为空白字符
RS 输入记录分隔符(输入换行符),指定输入时的换行符
ORS 输出记录分隔符(输出换行符),指定输出时的换行符
NF 当前行的字段数(当前行被分隔符分割成了几段)
NR 当前行的行号
FNR 不同文件分别计数
FILENAME 当前文件名
ARGV 数组,保存的是命令行所给定的各参数
ARGC ARGC数组的个数

 

 

 

 

 

 

 

    

 

  (1)FS:以“:”为字段输入分隔符,输出第1列和第2列

      1)使用-F选项指定输入分隔符

    Linux日常之命令awk

      2)使用内置变量FS指定输入分隔符,需要注意的是,使用变量时,要使用-v选项来指定对应的变量

    Linux日常之命令awk

    (2)OFS:以“#”为字段输出分隔符,输出第1列和第2列

    Linux日常之命令awk

    (3)RS:以“:”为行输入分隔符,输出对应的行号和当前行内容。

      需要注意的是,两个红框中的内容,由于Jack和DEF、Alice和GHI之间没有“:”,所以在awk中被认作为同一行

    Linux日常之命令awk

    (4)ORS:以“---”为行输出分隔符

    Linux日常之命令awk

    (5)NF:当前行的字段数

      其中,$NF表示的是最后一个字段的内容,$(NF-1)表示的是倒数第二个字段的内容

    (6)NR:当前行号

    (7)FNR:不同文件分别计数

    Linux日常之命令awk

    (8)FILENAME:显示当前行的文件名

    Linux日常之命令awk

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

    Linux日常之命令awk

    (10)ARGC:保存的是ARGV数组的个数

    Linux日常之命令awk

  2. 自定义变量

    (1)使用-v来自定义变量(在上第三节已介绍)

    (2)在awk中直接定义

    Linux日常之命令awk

   

五. 格式化中,awk使用printf时需要注意的问题

  1. 使用printf输出的文本不会换行,如果需要换行,可以在对应的“格式替换符”后加入“\n”进行转义

  2. 使用printf输出时,“指定的格式”与“被格式化的文本”之间,要用“,”隔开

  3. 使用printf输出时,“格式”中的“格式替换符”必须与“被格式化的文本”一一对应(个数要相同)

 

六. awk中的pattern模式

  当awk进行逐行处理时,会把pattern作为条件,判断当前行是否满足条件,若跟pattern匹配,则进行后面的处理,否则,跳过当前行。

  Linux日常之命令awk

  1. 正则表达式

    awk下的正则表达式与grep下的区别:

    1)awk下:   awk '/正则表达式/{print}' /etc/passwd

    2)grep下:  grep "正则表达式" /etc/passwd

    Linux日常之命令awk

    需要注意的是 

      1)在awk的正则表达式中,若出现"/",则需要进行转义,在其前面加"\"

      2)当使用{x,y}类型次数匹配的正则表达式时,需要使用--posix选项或--re-interval选项

  2. 行范围匹配

    awk '/正则表达式1/,/正则表达式2/{action}' file

    表示的是,从被正则表达式1匹配到的行开始,到被正则表达式2匹配到的行结束,之间所有的行都会执行对应的动作。

 

七. 关系运算符

关系运算符 含义 用法实例
< 小于 x<y
<= 小于等于 x<=y
> 大于 x>y
>= 大于等于 x>=y
== 等于 x==y
!= 不等于 x!=y
~ 匹配 x~/正则表达式/
!~ 不匹配 x!~/正则表达式/

 

 

 

 

 

 

 

 

 

八. 条件判断

if(表达式)
    {语句1}
else if(表达式)
    {语句2}
else
    {语句3}

  实例

awk 'BEGIN{ 
    test=100; 
    if(test>90){
         print "very good";
    } 
    else if(test>60){
        print "good"; 
    } 
    else{ 
       print "no pass"; 
    } 
}'

  

九. 循环语句

  1. while循环语句

while(表达式)
    {语句}

  实例

awk 'BEGIN{
    test=100;
    total=0;
    while(i<=test){
        total+=i;
        i++;  
    }         
    print total;              
}'

  2. for循环语句

    1)第一种

for(变量 in 数组)
    {语句}

    2)第二种

for(变量;条件;表达式)
    {语句}

  3. do循环语句

do
    {语句}
while(条件)

  

相关文章: