1

ログファイルの特定の日を印刷するスクリプトを作成しました。スクリプトは正しく機能しますが、while read行 でループ部分を記述しました。ログファイルには150000を超える項目が含まれています!スクリプトはそれを1行ずつ読みたいので、何時間もかかります!したがって、whileは何らかの方法で変更する必要があります!私は{1..N}で私について知っていますが、どのログファイルでも機能するより良いものが必要です。

何を指示してるんですか ?

4

1 に答える 1

1

あなたが何をしているかを私たちに見せなければなりません。投稿を編集してwhile、問題を示す最小のループ コードのサブセットを含めてください。また、エラーまたは警告メッセージの正確なテキストを表示してください。

あなたのコメントによると、「...各行を読むにはEnterキーを押す必要があります」。あなたは間違いなく何か間違ったことをしています。各行の読み取りは自動的に行われるべきです。ここでは、bash を使用したファイル処理の基本的な概要を示します。

awkの使用を検討しますか?その標準ツールを使用して、より良いソリューションを投稿できます。

 inputFiles="${@}"
 cat "${inputFiles}"\
 | while read line ; do
     case ${line} in
        2[0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]* ) 
            # matched date
             print ${line}
        ;;
        * )
            # you'll need to add other reg-expes here to extract data you want
        ;;
      esac
 done

の dbl-quotes を削除する必要がある場合があります${inputFiles}

使用の目的はcat ${inputfiles | while read line ...、コマンドラインにリストするすべてのファイルを処理できるようにすることです。

grepログファイルを調べてみましたか?

 date1='2011-09-11' ; date2='2011-09-12'; date3='2011-09-13'
 grep "${date1}|${date2}|${date3}" *.logFiles | grep -i error

上記の while ループで、date1... をケース ターゲットとして使用することもできます。

 case ${line} in
   ${date1}*|${date2}*|${date3}* )
      echo $line
   ;;
 esac

上の「 」を削除しても問題が解決しない場合があります。または、日付が行の最初の要素でない場合は、それぞれの前に*「 」を追加する必要があります。*${dateN}

または、ログファイルを圧縮したままにしている場合は、

 gunzip -c ${zippedLogFiles_gz) | grep "${date1}|${date2}|${date3}" | grep -i error

多くの場合、開始するのに適した場所です(ファイルをその場で解凍するだけです(圧縮されていない出力をパイプに送信するだけです))。

追伸あなたは新しいユーザーのようです。役立つ回答が得られた場合は、承認済みとしてマークすることを忘れないでください。また、有用な回答として + (または -) を付けてください。

于 2011-09-29T02:07:45.457 に答える