【问题标题】:awk find the second record between two strings / awk search in fileawk 查找两个字符串之间的第二条记录 / awk 在文件中搜索
【发布时间】:2017-07-25 00:13:49
【问题描述】:

我正在尝试使用 awk 在与 awk 相同的脚本中查找内容。

我的文件是这样的:

    function fanv {
            bla bla
      }

echo "something"
awk '/start/,/end/ {c=2}c&&c--'  test.sh >> outputfile

exit 0

#start
string that needs to be print 
#end

问题是 awk 将所有文件作为输入(不能依赖行号),因此结果也是 awk 表达式的文本。 此外,操作{c=2}c&&c-- 不起作用,我可能遗漏了一些东西。

输出文件的结果是:

awk '/start/,/end/ {c=2}c&&c--'  test.sh >> outputfile
#start
string that need to be print 
#end

如何从 awk 中选择第二条记录,以便输出文件只包含

需要打印的字符串

【问题讨论】:

  • 能否在您发布的带有代码标签的帖子中添加示例 Input_file 和预期输出文件,以便我们清楚地理解问题。
  • @RavinderSingh13 输入和预期输出已经在问题中,文件是脚本本身和输出它string that needs to be print
  • 我很抱歉 Eric,但我真的不明白预期的输出和示例 Input_file 我不清楚(我不是那么聪明:)),所以只有我要求 OP 将其添加到帖子中.

标签: linux bash shell awk sed


【解决方案1】:

你可以使用这个awk

awk 'p && /^#end/{ p=0; print lines }
     p{ lines=(lines==""?$0:lines ORS $0) }
     /^#start/{ p=1; lines="" }' file

string that need to be print

有 3 个条件和动作块:

  • p && /^#end/{ p=0; print lines } - 当p==1 和我们得到以#end 开头的行时。我们重置标志 p 并打印我们的缓冲区。
  • p{ lines=(lines==""?$0:lines ORS $0) } - 当p==1 我们不断将所有行追加到缓冲区中
  • /^#start/{ p=1; lines="" } - 当我们得到以#start 开头的行时,我们设置标志p 并重置lines 缓冲区。

【讨论】:

  • 工作完美谢谢。我不知道语法,但我会感谢
【解决方案2】:

一种可能性是使用仅包含一个字符的简单字符类。这样模式将匹配您搜索的文本,但模式本身不会匹配。我的方法通常是设置一个关于是否打印行的标志,所以我会做这样的事情:

awk '/[e]nd/ {do_it=0} do_it {print} /[s]tart/ {do_it=1}' test.sh >> outputfile

【讨论】:

  • 即使没有end标签也会打印行
  • @anubhava 好点子,我不知道 OP 想要在那里发生什么,但它可能会让事情回答错误
  • 是的@anubhava 是对的。是混合子函数继续结束
  • @yntnm 所以如果脚本中没有字符串end 你希望awk 什么都不打印?
【解决方案3】:
awk '/start$/,/end$/ { if ( $0 !~ /start$/ && $0 !~ /end$/ ) print $0 }' test.sh >> outputfile

检查以文本“end”和“start”结尾的行并处理这些行,然后检查以确保模式中没有任何行与 end 或 start 匹配。如果他们不打印这些行。

【讨论】:

    【解决方案4】:

    你只需要:

    awk '/^#end/{f=0} f; /^#start/{f=1}' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2012-05-11
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2021-01-16
      相关资源
      最近更新 更多