圧縮ファイルから特定の文字列を検索しようとしていますが、正しい "xargs"構文が見つかりませんでした。
ファイルは正しく解凍/圧縮されましたが、xargsは実際には何も検索しません(失敗したTLSメールを探しています)。
誰もが正しいxargs構文に関するアドバイスを与えることができますか?
for filename in $( ls -1 ${HOST}-mail-2018${1}[0-9][0-9]* )
do
filetype=${filename##*.}
case $filetype in
bz2)
unzipper="bzip2 -d "
zipper="bzip2"
unzfile=${filename%.${filetype}}
;;
gz)
unzipper="gzip -d "
zipper="gzip "
unzfile=${filename%.${filetype}}
;;
xz)
unzipper="xz -d "
zipper="xz "
unzfile=${filename%.${filetype}}
;;
*)
echo "Unknown compression type for file $filename"
break
;;
esac
# Testing: echo $unzipper $zipper $unzfile
echo $unzipper $zipper $filename $unzfile
eval ${unzipper} ${filename}
grep 'Cannot .*TLS' ${unzfile} | sed 's/^.*]: //' | sed 's/:.*//' | xargs fgrep
eval ${zipper} ${unzfile}
done
exit 0
ベストアンサー1
for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
case $filename in
*.gz) g=zgrep ;;
*.bz2) g=bzgrep ;;
*.xz) g=xzgrep ;;
*) printf 'Unknown filetype for "%s"\n' "$filename" >&2
exit 1 # or continue or break
esac
"$g" 'Cannot .*TLS' "$filename"
done
すべての圧縮ツールにはそのgrep
ツールが付属しています。gzip
、bzip2
およびの場合はそれぞれ、とxz
呼ばれます。これにより、ファイルを明示的に解凍して再圧縮する必要がなくなります。zgrep
bzgrep
xzgrep
上記のスクリプトは、grep
ファイルのサフィックスに基づいて正しいものを選択します。一般は、grep
未知のサフィックスを表すために使用できると言うことができます。ファイル名のサフィックスを表示せずにこれを行う方法(このfile
ツールを使用)については、以下を参照してください。
どうやっていいえファイルセットの繰り返しに必要であり、ls
変数拡張は二重引用符で囲む必要があります。
sed
これらの呼び出しの目的が何であるかわからないため、コードの呼び出しを無視しています。またexit 0
、ループを終了する場合はスクリプトの他の終了状態を隠すため、コードの末尾からを削除しました。
ファイルのMIMEタイプを使用して正しいgrep
ツールを選択してください。
for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
case $( file -b -i "$filename" ) in
text/plain*) g=grep ;;
application/x-gzip*) g=zgrep ;;
application/x-bzip2*) g=bzgrep ;;
application/x-xz*) g=xzgrep ;;
*) printf 'Unknown filetype for "%s"\n' "$filename" >&2
exit 1 # or continue or break
esac
"$g" 'Cannot .*TLS' "$filename"
done
grep
これにより、ファイル名のサフィックスに関係なく、正しいツールが正しく選択されます(ファイルがサポートされているファイル形式の1つである場合)。grep
プレーンテキストファイルにもプレーンを追加しました。
関連: