zoukankan      html  css  js  c++  java
  • 一个不会coding的girl Linux日常之命令awk

    Linux日常之命令awk

    参考: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

        

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

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

        

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

                  

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

        

      3. 常用的参数

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

        

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

        

        

          从文件中输入变量

        

    四. 变量

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

      1. 内置变量

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

        

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

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

        

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

        

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

        

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

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

        

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

        

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

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

        (6)NR:当前行号

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

        

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

        

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

        

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

        

      2. 自定义变量

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

        (2)在awk中直接定义

        

       

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

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

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

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

    六. awk中的pattern模式

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

      

      1. 正则表达式

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

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

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

        

        需要注意的是 

          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!~/正则表达式/

    八. 条件判断

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

      实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    awk 'BEGIN{
        test=100;
        if(test>90){
             print "very good";
        }
        else if(test>60){
            print "good";
        }
        else{
           print "no pass";
        }
    }'

      

    九. 循环语句

      1. while循环语句

    1
    2
    while(表达式)
        {语句}

      实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    awk 'BEGIN{
        test=100;
        total=0;
        while(i<=test){
            total+=i;
            i++; 
        }        
        print total;             
    }'

      2. for循环语句

        1)第一种

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

        2)第二种

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

      3. do循环语句

    1
    2
    3
    do
        {语句}
    while(条件)

      

  • 相关阅读:
    [转]利用EnteLib Unity Interception Extension和PIAB实现Trans
    [转]SynchronizationContext 综述
    【Java】JacksonUtils(Jackson ObjectMapper 工具类)
    【Java】GsonUtils(Gson 工具类)
    第十五章:指针类型
    第十六章:接口
    MySQL 的日志:binlog
    第八章:变量、常量和基础类型
    AUFS:多点合一,写时复制
    数据库多对多的几种形式(转载)
  • 原文地址:https://www.cnblogs.com/jobs-lgy/p/9767661.html
Copyright © 2011-2022 走看看