【问题标题】:Using "awk" to find a string between two other specific strings:使用“awk”在其他两个特定字符串之间查找字符串:
【发布时间】:2015-09-08 10:53:00
【问题描述】:

我有大量文本输出,其中包括如下几行:

sending:WHATIWANT:output

我将如何使用awk 使其输出仅在每一行中包含WHATIWANT

编辑:WHATIWANT 之前和之后的文本数量会发生变化,因此 awk -F: '{print $2}' 之类的内容并不总是有效

【问题讨论】:

  • awk -F: '{print $2}'
  • 对不起,我应该更具体,在它之前和之后有一些输出可能会改变我想要的字符串的顺序。 stuffstuffstuffsending:WHATIWANT:outputstuffstuffstuff
  • 如果: 是分隔符,那么WHATIWANTstuffstuffstuffsending:WHATIWANT:outputstuffstuffstuff 中仍然是$2
  • 更好的edit 显示更真实的样本输入。否则,要知道你想要什么是相当复杂的。
  • 抱歉,我们不是读者,您应该展示一些具有预期输出的示例输入。

标签: bash awk grep pipe ksh


【解决方案1】:

根据您在 cmets 中提到的内容,应该这样做:

perl -n -e'/sending:([^:]+):output/ && print $1' input_file

这会逐行运行一个简单的正则表达式匹配,捕获有趣的部分,然后将其打印出来。它假定WHATIWANT 不包含字符:

如果出于某种原因你绝对必须使用awk(1),那么我认为你别无选择,只能这样做:

awk -F: '{ for (i = 2; i < NF; i++) if ($(i-1) == "sending" && $(i+1) == "output") print $i }' input_file

它基本上用: 分割每一行并遍历每个字段,比较左右字段,直到找到介于sendingoutput 之间的字段。同样,它假定WHATIWANT 没有:

【讨论】:

    【解决方案2】:

    你不能只使用 sed 吗?

    echo "asfasfdsf__sending:WHATIWANT:output__asdfadas" | sed -n 's/.*sending\:\([a-zA-Z0-9]*\)\:output.*/\1/p'
    

    给你“什么”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      相关资源
      最近更新 更多