根据某列的匹配值,使用sed / awk在列之间添加值

时间:2014-05-13 03:33:55

标签: regex awk sed

我有一个包含许多记录的日志文件。所有行和列都具有相同的格式。我想使用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列之后。

2 个答案:

答案 0 :(得分:1)

可行但丑陋(如常见的那样):

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

答案 1 :(得分:1)

这是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只是意味着真实并打印。