首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sed命令帮助汇总类似的日志消息

Sed命令帮助汇总类似的日志消息
EN

Stack Overflow用户
提问于 2012-08-13 20:26:56
回答 3查看 111关注 0票数 2

我正在尝试为一个应用程序创建一个日志文件摘要工具,该工具创建了许多重复的条目,只有一个不同的后缀来指示执行点。

下面是一个泛化版本:包含这些内容的text_file (infile_grocery.txt)。

代码语言:javascript
复制
milk skim fruit apple banana
milk skim fruit orange
milk skim fruit mango
milk skim fruit pomegranate
milk 2 percent fruit cherry tomato
milk 2 percent fruit peach
milk whole fruit pineapple
milk skim fruit strawberry raspberry
milk skim fruit strawberry rhubarb
milk whole fruit pineapple

我希望得到的是:

代码语言:javascript
复制
milk skim fruit apple banana, orange, mango, pomegranate
milk 2 percent fruit cherry tomato, peach
milk whole fruit pineapple
milk skim fruit strawberry raspberry, strawberry rhubarb
milk whole fruit pineapple

我目前编写的命令行是:

代码语言:javascript
复制
sed -rn "{H;x;s|^(.+) fruit ([^\n]+)\n(.*)\1 fruit (.+)$|\1 fruit \2, \4|;x}; ${x;s/^\n//;p}" infile_grocery.txt

但我得到的结果是:

代码语言:javascript
复制
milk skim fruit apple banana, mango, strawberry raspberry
milk skim fruit strawberry rhubarb
milk whole fruit pineapple

我正在以某种方式丢弃输入。有没有大师有更好的想法来构建它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-14 02:58:00

这可能适用于您(GNU sed):

代码语言:javascript
复制
sed ':a;$!N;s/^\(\(.*fruit\).*\)\n\2\(.*\)/\1,\3/;ta;P;D' file

解释:

  • :a是loop
  • $!N的占位符,追加一个换行符,后接下一行,最后一行除外,将换行符之前的所有内容收集到反向引用1(也称为\1)中。在这个框架中,收集从行首到单词fruit的所有内容,并将其包含到反向引用2(也称为\2)中。将匹配的\2之后的所有内容收集到反向引用3(也称为\3)中。将此正则表达式替换为反向引用1,如果替换为真,则后跟逗号、空格,然后是反向引用3.
  • ta。如果替换为假,则循环到占位符:a
  • P,如果替换为假,则将第一个换行打印到并包括模式space.
  • D中的第一个换行符。删除模式空间中的第一个换行符。
票数 0
EN

Stack Overflow用户

发布于 2012-08-13 20:38:28

这是一个awk解决方案。

代码语言:javascript
复制
awk -F fruit '
$1==x{
    printf ",%s", $2
    next
}
{
    x=$1
    printf "\n%s", $0
}
END {
    print ""
}' input.txt 

输出

代码语言:javascript
复制
milk skim fruit apple banana, orange, mango, pomegranate
milk 2 percent fruit cherry tomato, peach
milk whole fruit pineapple
milk skim fruit strawberry raspberry, strawberry rhubarb
milk whole fruit pineapple
票数 4
EN

Stack Overflow用户

发布于 2012-08-13 21:09:56

代码语言:javascript
复制
opref=""
nline=""
while read line; do
  pref=`echo $line | sed 's/\(.*fruit\).*/\1/'`
  item=`echo $line | sed 's/.*fruit\s\(.*\)/\1/'`
  if [ "$opref" == "$pref" ]; then
    nline="$nline, $item"
  else
    [ "$nline" != "" ] && echo $nline
    nline=$line
  fi  
  opref=$pref
done < input_file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11934271

复制
相关文章

相似问题

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