【问题标题】:Add value between column using sed/awk based on matching value at certain column根据特定列的匹配值,使用 sed/awk 在列之间添加值
【发布时间】:2014-05-13 14:36:31
【问题描述】:

我有一个包含许多记录的日志文件。所有行和列的行具有相同的格式。我想使用 sed 来匹配某个列中的值并在列之间添加新值。例如,这样的日志:

    2014.3.17 23:57:11 127.0.0.3 10.21.31.141 http://vcs2.msg.yahoo.com/capacity *DENIED* Banned site: msg.yahoo.com GET 0 0  3 403 - working_time content3 -

我的命令将在日志中搜索 msg.yahoo.com(第 9 列),如果匹配,它将在第 12 列和第 13 列之间添加值(社交媒体)。按预期输出:

    2014.3.17 23:57:11 127.0.0.3 10.21.31.141 http://vcs2.msg.yahoo.com/capacity *DENIED* Banned site: msg.yahoo.com GET 0 0 Social Media 3 403 - working_time content3 -

我的 awk 代码仅将社交媒体放在第 12 列和第 13 列之间:

    awk -v column=12 -v value="Social Media" '
BEGIN {
    FS = OFS = " ";
}
{
    for ( i = NF + 1; i > column; i-- ) {
        $i = $(i-1);
    }
    $i = value;
    print $0;
}
' access3.log

但它需要在添加价值之前在第 9 列中找到 msg.yahoo.com。就像这样,如果列 9 = msg.yahoo.com,将社交媒体放在第 12 列之后或 12 到 13 列之间。

【问题讨论】:

    标签: regex awk sed


    【解决方案1】:

    可行但丑陋的是 sed(通常是这样):

    sed '/\([^ ]* \)\{8\}msg\.yahoo\.com/s/\(\([^ ]* \)\{12\}\)/\1Social Media /' filename
    

    【讨论】:

      【解决方案2】:

      这是 awk 的修复方法

      awk '$9=="msg.yahoo.com"{$(NF-6)=$(NF-6) " Social Media"}1' access3.log
      

      说明

      • $9=="msg.yahoo.com" 仅针对第 9 列中的 msg.yahoo.com 行
      • $(NF-6)=$(NF-6) " Social Media" 列 (NF-6) 是倒数第 6 列,并替换为新值。
      • 1 仅表示真实和打印。

      【讨论】:

      • 谢谢,它的工作。解释一下怎么样,我只懂第一部分第9栏=msg.yahoo.com。
      • 添加了解释。干杯
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2023-04-10
      • 2014-11-05
      • 2013-06-01
      相关资源
      最近更新 更多