2つの異なる行でgrepを使用する方法


15

1つのgrepコマンドを使用して2つの異なる行にある2つの異なるフレーズを検索するにはどうすればよいですか?

例えば

1行目:これは甘いです。

2行目:レモン。

これを使用しましたが、結果はありません

grep "sweet.*lemon" file_type

回答:


20

grep2つの異なる行に使用するには、両方のパターンを検索します

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

または交互に使用する

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

パターンの次の行を取得するには、コンテキストオプションを使用できます

$ grep -A1 sweet file_type
This is a sweet
lemon.

あなたは複数行のパターンを明示的に探しているなら、それはトリッキーだ理由はgrepラインに考えて...。あなたは.*「甘い」と「レモン」の間にあるすべてキャッチしますライン上を。次の行で改行を-P使用\nして"lemon"を取得しgrep、ファイルがnullで区切られていることを伝えると、次のようになります-z

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

ノート:

  • -E拡張正規表現を使用します(|エスケープする必要なく、代替に文字を使用します)
  • -An パターンの後に追加の行を印刷します。nは印刷する末尾の行数です
  • -Pperlスタイルの正規表現を使用します(perlの正規表現サポートを改善grepするためpcregrepに、代わりに「実験的」にインストールします)。
  • -z区切り文字としてヌル文字を使用します(この場合はふりをしgrepますが、私たちの言葉を取ります)
  • -o 一致した部分のみを印刷します

一方でgrep -zP、コマンドは、この特定のケース(正確に二行からなるファイル)に働くだろう一行すべき通常の改行区切りのファイルを考える(マッチどこかがある場合)には、一般的には、そのいずれかのファイル全体の内容をダンプしますまたは何もありません; 通常、それは人々が使用するものではありませんgrep
マークヴァンレーウェン

ええ、これはでのみ有効です-o... ...編集済み
Zanna

これは他のディストリビューションにしようとした場合には、あなたが遭遇する可能性がありますgrep: The -P and -z options cannot be combined-例えばのgrep(GNU grepの)RHEL上の2.5.1
ジェイソンPyeron

6

このような:

grep "sweet\|lemon"

|「レモン甘い」申し訳ありませんが、これは正確に一致します
αғsнιη

4
@KasiyAこの行は正常に機能しています。grep「標準モード」、などの「特殊文字」で、デフォルト作品で|+*文字通りに解釈されない限り、それらはバックスラッシュでマスクしています。たとえば、この回答を参照してください。おそらく慣れている方法を使用するには、「特殊文字」をマスクして文字どおりに解釈する必要があるため、「拡張モード」(grep -E)に切り替える必要があります。たぶん、madneonは彼の答えについてもう少し詳しく説明することができたでしょう。例えば、OPが試みたものが一致したでしょうか?
ヘニングコッカーベック16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.