縦棒の作り方| grepで動作しますか?


10

これが私が試したgrepコマンドラインの例です:

grep '(565172|565173|565175)' /var/log/cups/error_log

3つの値すべてがファイルに複数回存在する場合でも、出力は生成されません。

私はバーをエスケープしてみましたが、それによって状況が多少改善されました-真ん中の値が検出されましたが、最初または最後ではありませんでした。

grep '(565172\|565173\|565175)' /var/log/cups/error_log

私もダブルエスケープを試してみましたが、結果が出ませんでした。

grep '(565172\\|565173\\|565175)' /var/log/cups/error_log

何が悪いのですか?ありがとう。

回答:


14

使用しようとしている構文は拡張正規表現に属しているので、答えは非常に単純です。フラグを使用するegrepか、含めるか-Eです。


17

実行しているのは、基本正規表現と拡張正規表現の違いです。grepのマニュアルページから:

基本的な正規表現では、メタ文字?、+、{、|、(、および)は特別な意味を失います。代わりに、円記号バージョンの\?、+、{、\ |、(、および)を使用します。

したがって、次のいずれかを実行できます。

 grep '\(565172\|565173\|565175\)' /var/log/cups/error_log

または

grep -E '(565172|565173|565175)' /var/log/cups/error_log

-Eフラグは、「拡張」正規表現をオンにします。GNU grepは、perl互換の正規表現もサポートしています。


私の答えを書くときに気を取られました。アダムは私にパンチを打ち負かしたようです。
Steven D

4
しかし、あなたは説明に追加しました-私がそれを機能させることができなかった理由は、私がバーだけではなく、括弧をエスケープしていたからです。
Mark Ransom 2010

1
これらの特殊文字をもう一度エスケープして同じ結果を得ることができることを知りませんでした。+ 1してください!
Adam Byrtek、2010

1
上記は、SO / SEでこれまでに見た中で最も文明化された交換のセットです。
マイクげっ歯類
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.