我有一个包含许多记录的日志文件。所有行和列的格式都相同。我想使用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列之间。
发布于 2014-05-13 12:33:48
可工作但丑陋的是sed (就像通常的事情一样):
sed '/\([^ ]* \)\{8\}msg\.yahoo\.com/s/\(\([^ ]* \)\{12\}\)/\1Social Media /' filename发布于 2014-05-13 13:26:29
下面是awk的修复方法
awk '$9=="msg.yahoo.com"{$(NF-6)=$(NF-6) " Social Media"}1' access3.log解释
$9=="msg.yahoo.com"只针对9$(NF-6)=$(NF-6) " Social Media"列(NF-6)中的value.1是倒数第6列的行,替换为新的msg.yahoo.com只表示true并打印。https://stackoverflow.com/questions/23622358
复制相似问题