xargs 使用法構文

xargs 使用法構文

圧縮ファイルから特定の文字列を検索しようとしていますが、正しい "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ツールが付属しています。gzipbzip2およびの場合はそれぞれ、とxz呼ばれます。これにより、ファイルを明示的に解凍して再圧縮する必要がなくなります。zgrepbzgrepxzgrep

上記のスクリプトは、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プレーンテキストファイルにもプレーンを追加しました。

関連:

おすすめ記事