Unix 如果前一行没有';不包含特定的字符串

Unix 如果前一行没有';不包含特定的字符串,unix,grep,Unix,Grep,我在文件中有以下行: abcdef ghi jkl uvw xyz 如果前一行不包含字符串“jkl”,我想grep字符串“xyz” 我知道如果行不包含特定的字符串,如何使用-v选项grep查找字符串。但我不知道如何使用不同的行来实现这一点。我认为最好使用实际的编程语言,即使是简单的编程语言,如Bash、AWK或sed。例如,使用Bash: ( previous_line_matched= while IFS= read -r line ; do if [[ ! "$previo

我在文件中有以下行:

abcdef ghi jkl
uvw xyz
如果前一行不包含字符串“jkl”,我想grep字符串“xyz”


我知道如果行不包含特定的字符串,如何使用-v选项grep查找字符串。但我不知道如何使用不同的行来实现这一点。

我认为最好使用实际的编程语言,即使是简单的编程语言,如Bash、AWK或sed。例如,使用Bash:

(
  previous_line_matched=
  while IFS= read -r line ; do
    if [[ ! "$previous_line_matched" && "$line" == *xyz* ]] ; then
      echo "$line"
    fi
    if [[ "$line" == *jkl* ]] ; then
      previous_line_matched=1
    else
      previous_line_matched=
    fi
  done < input_file
)
(
前一行匹配=
当IFS=读取-r行时;执行
如果[[!“$previous_line_matched”&&&“$line”==*xyz*];则
回音“$line”
fi
如果[[“$line”==*jkl*];则
上一行匹配=1
其他的
前一行匹配=
fi
完成
或者,更简洁地说,使用Perl:

perl -ne 'print if m/xyz/ && ! $skip; $skip = m/jkl/' < input_file
perl-ne'如果m/xyz/&&打印$跳过$skip=m/jkl/'
grep
确实是一个面向行的工具。也许可以通过它实现您想要的,但使用Awk更容易:

awk '
  /xyz/ && !skip { print }
                 { skip = /jkl/ }
' file
读作:每一行,都要做

  • 如果当前行与
    xyz
    匹配,并且我们没有看到
    jkl
    ,请打印它
  • 设置变量
    skip
    以指示我们是否刚刚看到了
    jkl
    • sed'/jkl/{N;d}/xyz/!d'
      
      • 如果查找jkl,请删除该行,然后单击下一步
      • 使用
        xyz

      谢谢。我需要在awk中探索很多:-/