我有一个包含许多记录的日志文件。所有行和列都具有相同的格式。我想使用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列之后。
答案 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
只是意味着真实并打印。