首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于某一列的匹配值,使用sed/awk在列间相加

基于某一列的匹配值,使用sed/awk在列间相加
EN

Stack Overflow用户
提问于 2014-05-13 11:33:55
回答 2查看 125关注 0票数 0

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

代码语言:javascript
复制
    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列之间添加值(社交媒体)。

代码语言:javascript
复制
    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列之间:

代码语言:javascript
复制
    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列之间。

EN

回答 2

Stack Overflow用户

发布于 2014-05-13 12:33:48

可工作但丑陋的是sed (就像通常的事情一样):

代码语言:javascript
复制
sed '/\([^ ]* \)\{8\}msg\.yahoo\.com/s/\(\([^ ]* \)\{12\}\)/\1Social Media /' filename
票数 1
EN

Stack Overflow用户

发布于 2014-05-13 13:26:29

下面是awk的修复方法

代码语言:javascript
复制
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并打印。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23622358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档