1
awk  'BEGIN{OFS=","} FNR == 1
            {if (NR > 1) {print fn,fnr,nl}
                        fn=FILENAME; fnr = 1; nl = 0}
                        {fnr = FNR}
                        /ERROR/ && FILENAME ~ /\.gz$/ {nl++}
                        {
                            cmd="gunzip -cd " FILENAME
                            cmd; close(cmd)
                         }
            END                    {print fn,fnr,nl}
        ' /tmp/appscraps/* > /tmp/test.txt

上記は、特定のディレクトリ内のすべてのファイルをスキャンします。ファイル名、各ファイルの行数、および検出された 'ERROR' を含む行数を出力します。

現在、スクリプトが読み取ったファイルのいずれかが通常のファイルでない場合にコマンドを実行するようにしようとしています。つまり、ファイルが gzip ファイルの場合、特定のコマンドを実行します。

上記は、そこに gunzip コマンドを含めて、自分で実行しようとする私の試みです。残念ながら、それは機能していません。また、ディレクトリ内のすべてのファイルを事前に「gunzip」することはできません。これは、ディレクトリ内のすべてのファイルが「gzip」タイプになるわけではないためです。一部は通常のファイルになります。

そのため、別の方法で見つかった.gzファイルを処理するスクリプトが必要です。これにより、それを読み取り、その中にある行数をカウントして出力し、指定されたパターンに一致する行数を見つけました(ファイルは通常のファイルでした)。

助けはありますか?

4

3 に答える 3

1

それよりも簡単にできると思います。

シェル展開では、すでにファイル名を持っています(したがって、それを印刷できます)。したがって、すべてのファイルに対してループを実行し、それぞれに対して次のことを実行できます。

  • ファイル名を印刷する
  • zgrep -c ERROR $file (これは「ERROR」を含む行数を出力します)
  • zcat $file|wc -l (これにより行番号が出力されます)

zgrep と zcat は、プレーン テキスト ファイルと gzip 圧縮されたファイルの両方で機能します。

パス/ファイル名にスペースが含まれていないと仮定します。

for f in /tmp/appscraps/* 
do
   n_lines=$(zcat "$f"|wc -l)
   n_errors=$(zgrep -c ERROR "$f")
   echo "$f $n_lines $n_errors"
done

これはテストされていませんが、動作するはずです。

于 2013-08-09T23:02:50.557 に答える
0

各ファイルに対して次のコマンドを実行できます。

gunzip -t FILENAME; echo $?

終了コード 0 (gzip ファイルの場合) または 1 (破損/その他のファイルの場合) を出力します。これで、IF を使用して出力を比較し、必要な処理を実行できます。

于 2013-08-09T21:06:14.250 に答える