私がこれを実行したとき:
find . -name "my.log*.gz" -print | \
parallel zgrep -e "\(text1\|text2\).*Exception"
/(text1|text2).*Exception/
フォルダ内のすべてのファイルで一致する行をすべて見つけるには、次のエラーメッセージが表示されます。
zsh:1: no matches found: (text1|text2).*Exception
エラーメッセージで判断すると(text1|text2).*Exception
ファイル名として扱われるようです。私がここで何を間違っているのか?
答え1
-E
正規表現拡張のため
find . -name "my.log*.gz" -print | \
parallel zgrep -E "\(text1\|text2\).*Exception"
答え2
より多くの引用が必要です:
find . -name "*.gz" -print |
parallel -q zgrep -e "\(text1\|text2\).*Exception"
実際に何が実行されているかを確認し-vv
てください。--dr
答え3
parallel
パッケージのコマンドを使用すると、moreutils
コマンドを次のように単純化できます。
parallel zgrep -e "\(text1\|text2\).*Exception" -- my.log*.gz
zgrep
これは、シェルパターンに一致する各ファイルに対して1つずつ並列インスタンスを実行しますmy.log*.gz
。シェルはコマンドを実行する前にパターンを拡張します。したがって、別の通話は必要ありませんfind
。
気になる方はzgrep
オプションとしてご利用ください-H
どのファイルマッチ。