これが私が試した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
私は何が間違っているのですか?ありがとう。
使用しようとしている構文は拡張正規表現に属しているため、答えは非常に簡単です。egrep
を使用するか、-E
フラグを含めます。
あなたが遭遇しているのは、基本的な正規表現と拡張された正規表現の違いです。 grepのマニュアルページから:
基本的な正規表現では、メタ文字?、+、{、|、(、および)は特別な意味を失います。代わりに、バックスラッシュバージョン\?、+、{、\ |、(、および)を使用してください。
したがって、次のいずれかを実行できます。
grep '\(565172\|565173\|565175\)' /var/log/cups/error_log
または
grep -E '(565172|565173|565175)' /var/log/cups/error_log
-Eフラグは、「拡張」正規表現をオンにします。 GNU grepは、Perl互換の正規表現もサポートしています。