それぞれ約100MBのログファイルはほとんどありません。個人的には、このような大きなファイルを扱うのは面倒です。私にとって興味深いログ行は、200行から400行程度しかないことを知っています。
これらのファイルから関連するログ行を抽出する良い方法は何でしょうか。つまり、行番号の範囲を別のファイルにパイプしたいだけです。
たとえば、入力は次のとおりです。
filename: MyHugeLogFile.log
Starting line number: 38438
Ending line number: 39276
Cygwinでそのファイル内のその範囲だけをcat
するために実行できるコマンドはありますか?どういうわけかその範囲を標準出力に表示できれば、出力ファイルにパイプすることもできます。
注:可視性を高めるためにLinux
タグを追加しますが、cygwinで動作するソリューションが必要です。 (通常、Linuxコマンドはcygwinで機能します)
sed
の仕事のように聞こえます:
sed -n '8,12p' yourfile
... yourfile
の8行目から12行目を標準出力に送信します。
行番号を追加する場合は、cat -n
最初:
cat -n yourfile | sed -n '8,12p'
wc -l
を使用して、合計行数を把握できます。
head
とtail
を組み合わせて、必要な範囲を取得できます。ログが40,000行で、最後の1562行が必要であり、次に最初の838行が必要だと仮定します。
tail -1562 MyHugeLogFile.log | head -838 | ....
または、おそらくsed
またはawk
を使用するより簡単な方法があります。
100 000行のファイルにファイルを分割しようとしたときに、このスレッドを見ました。そのためのsedよりも優れたソリューションは次のとおりです。
split -l 100000 database.sql database-
次のようなファイルが表示されます。
database-aaa
database-aab
database-aac
...
そして、単にファイルの一部を切り取りたい場合(26行目から142行目など)、それをnewfileに入力する場合は、cat file-to-cut.txt | sed -n '26,142p' >> new-file.txt
これはどう:
$ seq 1 100000 | tail -n +10000 | head -n 10
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
tail
を使用して10,000行目以降から出力し、head
を使用して10行のみを保持します。
sed
と同じ(ほぼ)結果:
$ seq 1 100000 | sed -n '10000,10010p'
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010
これには、ライン範囲を直接入力できるという利点があります。
最後のX行のみに関心がある場合は、このような「tail」コマンドを使用できます。
$ tail -n XXXXX yourlogfile.log >> mycroppedfile.txt
これにより、ログファイルの最後のXXXXX行が「mycroppedfile.txt」という新しいファイルに保存されます
これは古いスレッドですが、grepに言及している人がいないことに驚きました。 -Aオプションを使用すると、検索一致後に印刷する行数を指定できます。-Bオプションを使用すると、一致する前の行が含まれます。次のコマンドは、ファイル「mylogfile.log」に「my search string」が出現する前と後の10行を出力します。
grep -A 10 -B 10 "検索文字列" mylogfile.log
大きなファイル内に複数の一致がある場合、出力はすぐに扱いにくくなります。 2つの便利なオプションは、grepに行番号を含めるように指示する-nと、出力で一致したテキストを強調表示する--colorです。
検索対象のファイルが複数ある場合、grepを使用すると、複数のファイルをスペースで区切ってリストできます。ワイルドカードも使用できます。すべてを一緒に入れて:
grep -A 10 -B 10 -n --color "my search string" * .log someOtherFile.txt