.gz ファイルリストで文字列を検索するには?

.gz ファイルリストで文字列を検索するには?

各フォルダには約600個の.gzファイルを含むフォルダのリストがあり、システムは15分ごとに自動的に作成されます。 .gzファイルで繰り返される特定の文字列を表示する必要があります。文字列を含む.gzファイルを探しますか?

答え1

topdirすべての圧縮ファイルを含む最上位ディレクトリがあり、使用しているGNU実装を想定すると、次のようになりますzgrep

zgrep -R -l -F --include='*.gz' -e 'string' topdir

圧縮ファイルから部分文字列を検索しstring、一致するすべてのファイルのパス名を返します。gziptopdir

zgrepGNUがないシステムではzgrepこれを使用できない可能性があります--include。圧縮されたファイルのみを含めると問題にならないかもしれませんがtopdir、ファイル名のサフィックスを持つファイルだけを検索したい場合は.gzこれを行うことができます。

find topdir -type f -name '*.gz' -exec zgrep -l -F -e 'string' {} +

.gzこれは、名前がunderで終わるすべての一般的なファイルを見つけ、可能な限り最大のバッチで指定されたコマンドを実行しますtopdirzgrep

それがなくてもzgrepこれを行うことができます。

find topdir -type f -name '*.gz' -exec sh -c '
    for pathname do
        if gzip -dc "$pathname" | grep -q -F -e 'string'; then
            printf "%s\n" "$pathname"
        fi
    done' sh {} +

これは各ファイルを抽出してプレーンに渡しますgrep。指定された文字列を含む行が見つかると、ファイルのパス名が印刷されます。

*.gz「内部」シェルスクリプトは、単一のディレクトリ内のすべてのファイルを処理するように簡単に変更できるループです。

for pathname in ./*.gz; do
    if gzip -dc "$pathname" | grep -q -F -e 'string'; then
        printf "%s\n" "$pathname"
    fi
done

string部分文字列ではなく完全な単語に一致させるには、-w上記の呼び出しに追加してくださいgrep。正規表現として解釈するには、string削除します-F

答え2

あらかじめ不明な繰り返し文字列を探す場合、以下はファイルセット内で繰り返し単語を検索するスクリプトです(ここで単語は周囲にスペースがあるすべてを意味します)。

#!/bin/bash

dup_words() {
    zcat $1 | tr ' ' '\n' | sed '/^$/d' | sort | uniq -c | awk '{if ($1 > 1) m=1; } END { exit(!m) } '
}

for i in *.gz
do
    dup_words $i && echo $i
done

空白が表示されるたびに行を分割し、空の行を削除し、発生回数を見つけて計算し、最後に1回以上発生することを確認します。

ループはファイル名のみを出力し、&&必要に応じて後続の操作を調整できます。

答え3

このコマンドを使用すると、特定のフォルダの下の特定の.gzファイルに文字列が表示されることを確認できます。

zgrep the_string  *.gz -l

1つのフォルダにすべて含まれるフォルダの一覧に対してこれを行うには、次の手順を実行します。

find . -name "*.gz" | xargs zgrep the_string -l

たとえば、出力は次のようになります。

./tmp/2/F.tar.gz
./tmp/2/F1.tar.gz
./tmp/1/F.tar.gz
./tmp/1/F1.tar.gz

これで、その文字列を含むファイルのリストが表示されます。

答え4

このコマンドを使用できます -

zgrep "foo" $(find . -name "*.gz")

関連情報