次のファイル形式を処理するユースケースがあります。
1 - mylog_1.log
2 - mylog_2.log.gz
次のように、各コマンドに対して2つの異なるテキスト処理コマンドを実行する必要があります。
cat mylog_1.log | grep text | sort | uniq -c
zcat mylog_2.log.gz | grep text | sort | uniq -c
(cat、grep、awk、およびsedは一般的なコマンドです)
ファイルを解凍せずに単一のコマンドで両方のファイル形式を処理する方法はありますか?
答え1
(cat mylog_1.log;zcat mylog_2.log.gz) | grep text | sort | uniq -c
答え2
zgrep
与えられたファイルを解凍し、必要なら、結果を次に渡しますgrep
。
$ echo text one > log_1.log
$ echo text two > log_2.log
$ gzip log_2.log
$ zgrep text log_* | sort | uniq -c
1 log_1.log:text one
1 log_2.log.gz:text two
答え3
単一のコマンドでテキストファイルと圧縮テキストファイルを処理する方法に関する具体的な質問がある場合は、この他の質問を参照してください。しかし、あなたの質問が通常、さまざまなツールを使用してさまざまな種類のファイルからテキストを抽出し、同じ方法で処理する方法については、
for file in mylog_1.log mylog_2.log.gz …
do
if [[ "$file" == *.gz ]]
then
zcat "$file"
else
cat "$file"
fi | grep text | sort | uniq -c
done
これにより、各ファイルが個別に処理されます。これを結合(接続)し、集約されたテキストを1つのエンティティとして処理するには、パイプを移動するだけです。
for file in mylog_1.log mylog_2.log.gz …
do
if [[ "$file" == *.gz ]]
then
zcat "$file"
else
cat "$file"
fi
done | grep text | sort | uniq -c