web-dev-qa-db-ja.com

grep -Cまたは-Aまたは-Bを一致する行を除外するものと組み合わせることが可能ですか

したがって、grepでは、-Aを使用して一致の「後」の行を取得でき、-Bを使用して一致の「前」の行を取得できます。また、-Cを使用して、前後の行を取得できます。

このようなデータがあります

boring data
boring data
boring data
interesting value
MARK
boring data
boring data
boring data
interesting value
MARK

次のような出力を取得したいと思います。

interesting value
interesting value

オプション-Bを使用すると、次のようになります。

# cat somefile | grep -B 1 MARK

interesting value
MARK
interesting value
MARK

MARK行を完全に除外したいと思います。

5
user230910

最初のgrepの後に逆grep-vで追加できます。

$ grep -B1 --no-group-separator 'MARK' somefile | grep -v 'MARK'
interesting value
interesting value

--no-group-separatorを追加して、一致間の区切り線を省略しました。

9
Freddy

grepの使用に縛られていない場合は、awkなどの他のツールを使用できます。

awk '/MARK/ { print saved_line }
     { saved_line=$0 }'

これは、行が一致した場合に保存された行を印刷し、再び必要になった場合に備えてすべての行に保存することを示しています。

8
icarus