【问题标题】:Linux awk commandLinux awk 命令
【发布时间】:2010-10-30 02:58:58
【问题描述】:

我是使用 Linux 的初学者,我有一个输入文件,其内容如下:

00.11.11.11.11.11
177.22.22.22

一行以太网地址和一行IP地址, 如何将此文件转换为:

IP: 177.22.22.22  MAC: 00.11.11.11.11.11

我认为 awk 会这样做,但我不知道该怎么做。有什么想法吗?

谢谢!

【问题讨论】:

    标签: awk


    【解决方案1】:

    也可以用 'sed' 来完成,但是既然你要求 'awk',那就应该是 'awk'。

    awk '/^([0-9]+\.){5}[0-9]+$/ { mac = $1 }
         /^([0-9]+\.){3}[0-9]+$/ { printf "IP: %s MAC: %s\n", $1, mac }' data
    

    (以前的版本:

    awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { mac = $1 }
         /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ { printf "IP: %s MAC: %s\n", $1, mac }'
    

    不太好,因为写出来的重复,而不是计数重复。)

    第一行匹配 MAC 地址,并在变量 mac 中保存最新的。第二个匹配 IP (IPv4) 地址并打印当前 MAC 地址和 IP 地址。

    如果您有杂散的前导或尾随空白,或其他杂散字符,您需要适当地使正则表达式更复杂。

    【讨论】:

    • 哎呀! @Jason,也许你可以把 IP 和 MAC 放在同一行,中间有空格,cat file | awk '{print "IP:", $1, "MAC:", $2}' 可以达到同样的效果。
    • 请注意,这会跳过空白行或与 4 或 6 个点分十进制数字不完全匹配的行——这可能是一种美德,也可能不是。相同的 MAC 地址可用于多个 IP 地址,例如,如果数据不是严格交替行。其他不检查输入数据的解决方案很容易与数据不同步 - 如果数据格式不正确。
    【解决方案2】:

    你可以try it at ideone:

    真的很短!

    {mac=$0;
     getline ip;
     print "IP: " ip  " MAC: " mac}
    

    【讨论】:

      【解决方案3】:

      paste - - < input_file | awk '{print "IP: " $2 " MAC: " $1}'

      【讨论】:

      • 原谅我的无知......“粘贴--”是否将每两行变成了一行?
      • paste 把它的输入变成列,列数是'- -'
      • 不错! +1 // 还有 7 个字符要走
      【解决方案4】:

      awk -vRS='{print "IP:", $2, "MAC:", $1;}'

      相当于

      awk 'BEGIN{RS="";}{print "IP:", $2, "MAC:", $1;}'

      这也适用于多个输入记录:
      "
      00.11.22.33.44.55
      123.45.67.89

      11.22.33.44.55.66
      11.22.33.99
      "

      ->

      "
      IP:123.45.67.89 MAC:00.11.22.33.44.55
      IP:11.22.33.99 MAC:11.22.33.44.55.66
      "

      【讨论】:

      • 这需要空行分隔数据线对。
      【解决方案5】:
      { if(mac) { print "IP:", $0, "MAC:", mac; mac = 0 } else mac = $0 }
      

      【讨论】:

        【解决方案6】:
        awk -F"." 'NF>4{m=$0}NF==4{print "IP:"$0" MAC:"m}' file
        

        【讨论】:

          【解决方案7】:

          这里有一个sed 版本:

          sed 's/^/MAC: /;x;N;s/\n/IP: /;G;s/\n/  /' inputfile
          

          如果文件中有不止一对行:

          sed 's/^/MAC: /;x;s/.*//;N;s/\n/IP: /;G;s/\n/  /' inputfile
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-23
            • 2016-06-28
            • 1970-01-01
            • 2019-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多