web-dev-qa-db-ja.com

cygwinの行番号の開始と終了に基づいてテキストファイルを切り取る(切り取る)方法は?

それぞれ約100MBのログファイルはほとんどありません。個人的には、このような大きなファイルを扱うのは面倒です。私にとって興味深いログ行は、200行から400行程度しかないことを知っています。

これらのファイルから関連するログ行を抽出する良い方法は何でしょうか。つまり、行番号の範囲を別のファイルにパイプしたいだけです。

たとえば、入力は次のとおりです。

filename: MyHugeLogFile.log
Starting line number: 38438
Ending line number:   39276

Cygwinでそのファイル内のその範囲だけをcatするために実行できるコマンドはありますか?どういうわけかその範囲を標準出力に表示できれば、出力ファイルにパイプすることもできます。

注:可視性を高めるためにLinuxタグを追加しますが、cygwinで動作するソリューションが必要です。 (通常、Linuxコマンドはcygwinで機能します)

54
bits

sedの仕事のように聞こえます:

sed -n '8,12p' yourfile

... yourfileの8行目から12行目を標準出力に送信します。

行番号を追加する場合は、cat -n 最初:

cat -n yourfile | sed -n '8,12p'
108
Johnsyweb

wc -lを使用して、合計行数を把握できます。

headtailを組み合わせて、必要な範囲を取得できます。ログが40,000行で、最後の1562行が必要であり、次に最初の838行が必要だと仮定します。

tail -1562 MyHugeLogFile.log | head -838 | ....

または、おそらくsedまたはawkを使用するより簡単な方法があります。

10
David

100 000行のファイルにファイルを分割しようとしたときに、このスレッドを見ました。そのためのsedよりも優れたソリューションは次のとおりです。

split -l 100000 database.sql database-

次のようなファイルが表示されます。

database-aaa
database-aab
database-aac
...
7
Dorian

そして、単にファイルの一部を切り取りたい場合(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

これには、ライン範囲を直接入力できるという利点があります。

4
thkala

最後の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

0
hbolingbroke