web-dev-qa-db-ja.com

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

これが私が試した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

私は何が間違っているのですか?ありがとう。

10
Mark Ransom

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

14
Adam Byrtek

あなたが遭遇しているのは、基本的な正規表現と拡張された正規表現の違いです。 grepのマニュアルページから:

基本的な正規表現では、メタ文字?、+、{、|、(、および)は特別な意味を失います。代わりに、バックスラッシュバージョン\?、+、{、\ |、(、および)を使用してください。

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

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

または

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

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

17
Steven D