如果前一行不包含特定字符串,则grep为一行中的字符串

时间:2013-06-21 05:08:21

标签: unix grep

我在文件中有以下几行:

abcdef ghi jkl
uvw xyz

如果前一行不包含字符串“jkl”,我想grey寻找字符串“xyz”。

如果该行不包含使用-v选项的特定字符串,我知道如何grep一个字符串。但我不知道如何用不同的方式做到这一点。

3 个答案:

答案 0 :(得分:2)

grep实际上是一种面向行的工具。有可能用它来实现你想要的东西,但是使用Awk更容易:

awk '
  /xyz/ && !skip { print }
                 { skip = /jkl/ }
' file

读为:对于每一行,请执行

  • 如果当前行与xyz匹配且我们尚未看到jkl,请将其打印出来;
  • 设置变量skip以表明我们是否刚看到jkl

答案 1 :(得分:1)

sed '/jkl/{N;d}; /xyz/!d'
  • 如果找到jkl,请删除该行,然后删除
  • 仅打印xyz
  • 的剩余行

答案 2 :(得分:0)

我认为你最好使用一种实际的编程语言,即使是简单的编程语言,如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
)

或者更简洁,使用Perl:

perl -ne 'print if m/xyz/ && ! $skip; $skip = m/jkl/' < input_file