【问题标题】:Search a keyword and Print the first pattern between 2 same patterns from a file搜索关键字并打印文件中两个相同模式之间的第一个模式
【发布时间】:2021-06-16 12:51:17
【问题描述】:

如果模式之间存在关键字,我需要在其中打印第一行。

例如:

LEVEL: X
abc 
123 
def rty 
LEVEL: A
abc
123
LEVEL: Z
abc
def 345 rty
ocp

在模式“LEVEL”之间搜索关键字“def”。

预期输出:

LEVEL: X
LEVEL: Z

看用awk或者sed,因为日志文件10000多行。

我尝试过类似的东西

awk '/LEVEL:/{flag=1}/LEVEL:/{print;flag=0}flag' file

但我不确定如何在列表中搜索关键字“def”并仅打印匹配的第一行。

更新:

awk '/LEVEL:/{flag=1}/def/||/LEVEL:/{print;flag=0}' file

但是输出是这样的

LEVEL: X
def rty
LEVEL: A
LEVEL: Z
def 345 rty

为了更清楚,我要在 2 个连续模式“LEVEL:”关键字“def”之间进行搜索。

任何建议都会有所帮助。 谢谢。

【问题讨论】:

  • 欢迎来到 SO,请在您的问题中以代码的形式添加您的努力,这在 SO 上受到强烈鼓励,谢谢。
  • 目前,您的示例输入中没有任何内容可以满足要求。 (在任何"LEVEL: .." 标签之间没有"def"。)
  • 感谢您的努力,但您获得预期输出的逻辑不清楚,请在您的问题中更清楚地提及您的逻辑,谢谢。
  • @RavinderSingh13:我已经更新了帖子。我希望现在更清楚了吗?
  • @DavidC.Rankin:第一个和第二个“LEVEL:”之间有定义。但是对于最后一个模式“LEVEL: Z”没有对应的“LEVEL:”模式。

标签: awk sed grep


【解决方案1】:
awk '
$1=="LEVEL:" {
  lvl=$0
  next
}
lvl && index($0,"def") {
  print lvl
  lvl=""
}
' file

这会保存“LEVEL”行,以便在找到“def”时打印它。

【讨论】:

  • 这个不错!
【解决方案2】:

在 GNU awk 中使用 RT:

$ gawk -v RS="LEVEL[^\n]+" '/def/{print p}{p=RT}' file

输出:

LEVEL: X
LEVEL: Z

另一个:

$ awk '/^LEVEL/ {
    if(f)
        print p
    f=""
    p=$0
    next
}
/def/ {
    f=1
}
END {
    if(f)
        print p
}' file

【讨论】:

  • gwak 大部分工作.. 我的日志中也有“LEVEL.x”,添加了一些额外的条目.. 谢谢你的帮助..
  • 是的,这就是为什么样本数据应该始终以最好的方式描绘真实数据。当样本数据为123abcqweqwe 时,你就会知道总会有额外的东西会弄乱解决方案,所以通常解决方案是关于如何开始解决问题的一般指南问题——对我来说,无论如何。
【解决方案3】:

这可能对你有用(GNU sed):

sed -n '/^LEVEL/h;/def/{x;p}' file

这是一个过滤操作,所以关闭隐式打印-n

复制以LEVEL 开头的每一行。

如果一行包含def,则打印最后一个副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多