• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数日を含むログから各日の先頭を取得する方法)

Linuxコマンドを使って複数日のログから先頭を取得する方法

このQ&Aのポイント
  • Linuxコマンドを使用して、複数日のログファイルから各日の先頭行を取得する方法について説明します。
  • 試行錯誤の結果、以下のコマンドで期待する結果が得られました。
  • ベストな方法を求めて質問します。指定のログファイルが大規模なため、シンプルかつ高速な実行が望まれます。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

awkで、 awk '$1!=old{old=$1; print $1,$2}' log.txt

mibusys
質問者

お礼

教えていただいたawkスクリプトは最初は何のことやら分かりませんでした。 実行してびっくりしました。期待通りの結果でした。 また、大ファイルでの処理時間計測を行なったところ高速に処理できていました。 ちなみに最終的には後述の内容に書き換えました。 私の質問の1-3の処理は6秒。 それに相当する処理すべてを1発で行い4秒でした。 処理速度の短縮は、元々速かった為大幅な改善とまではいえませんが、 それ以上にawkの特性を活かしたスマートな処理になっていると思います。 このコードでスクリプトを組もうと思っています。 非常に参考になりました。ありがとうございました。 awk '(($1 ~ /^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9]/) && ($1 != old)) { old = $1; print NR, $1, $2 }' log.txt > 00d.txt

その他の回答 (1)

  • kachansa
  • ベストアンサー率44% (30/67)
回答No.1

1の部分は、パターンマッチの時間を考えると、 cut -d’ ' -f1 log.txt の方が、空白で区切って、最初のフィールド(今回でいえば、日付)を速く取得できそうな 気がします(行の先頭部分にマッチだから、そんなに変わらないかなぁ)。 まあ、私の場合、まずは必要な部分を取り出すのに、sed か cutとかを使います。 あと、中間ファイルを毎回作るのは、画面確認が必要なので、 cut -d’ ' -f1 log.txt | uniq (って、正規表現をご存知なようなのでパイプは知ってますかね) 今後も、同じ形式のファイルを定期的に処理するならば、PerlとかPHPでスクリプト処理した方が 全体の作業時間は減るかなと思います。 各行を読み込んで、日付と時間をメモリに保存。次の行が別の日付でなければ、スキップして別の日付になったら、日付と時間をファイルに出力。 カウンターを付けておけば、結果の日付前の部分も問題ないかと。 # 今後にどれくらい同じことをするのかで、スクリプト言語を利用するか、Linuxコマンドで済ませるか を私は考えるようにしてます。

mibusys
質問者

お礼

今回教えていただいた方法は、採用することは無いと思います。 しかし、自分の考えていた方法以外の方法で試せたことで勉強になりました。 ご回答ありがとうございました。

mibusys
質問者

補足

不要場部分をそぎ落とし質問したい部分だけを提示したため 背景まったくお伝えしていませんでした。少し書きます。 最終的に行ないたいのは日付ごとでのファイルの分割です。 それは、行数を指定してのheadコマンドとtailコマンドの 組み合わせで行えることを確認したため、残りは各日付の開始行を 効率的に取得する方法だけであった為その部分のみを質問しました。 最終的には、別の処理も複合してシェルスクリプトとする予定です。 ですので実際に使用する際には毎回コマンド入力ということはありません。 言語でのスクリプト化という意味では、実は最初にvbsで作成していました。 しかしトータルの処理時間が30分と、驚愕の遅さであった為 別の方法で処理を行なうことにしました。 PerlやPHPはスキルの問題が大きく(またインストールの問題もあるため) 容易には採用できません。 (いろいろな方法で比較することは非常に意義のあることと思います) 実は、質問の際には実はシェルスクリプト化しておらず時間計測は 行なっていませんでした。ご回答を受け、きちんとスクリプト化し 時間計測を行ないました。 私が質問に記述した方法だと、1が2秒・1-3合計で6秒でした。 なので、「遅いのでは」と心配していたのですが、 記述が冗長なだけで処理速度的には大きく問題ありませんでした。 ご回答いただいたcutを使用する方法も試してみました。 質問に記述した1のコマンド実行時と同じ結果が得られました。 しかし、処理速度は44秒と大幅に遅かったです。

関連するQ&A