ファイルからバイト範囲を取得するLinuxコマンド


15

私はそれを知ってheadおり、バイトオフセットを指定するオプションをtail取ることが-cできます。大きなログファイルからバイト範囲を効率的に抽出する方法を探しています。

回答:


17

UnixコマンドのDareDevilがdd救いに!

dd if=yourfile ibs=1 skip=200 count=100

これは、バイト200から始まり、100の次のバイト、つまりバイト200〜300を示します。ibsddは、デフォルトの512バイトではなく、一度に1バイトのみを読み取りますが、デフォルトの512バイトのチャンクで書き込みます。行ってibs、パフォーマンスに悪影響を与えるかどうかを確認します。


782090815バイトのファイルの場合、これらの時間を取得しました: time dd if=file.txt | wc -l= 00:00:03s。time dd if=file.txt ibs=1 count=782090815 | wc -l= 9:05:19
ダニーロソウザモランイス

11

バイトに興味があるなら、odもっと興味があるでしょう。

-j, --skip-bytes=bytes
-N, --read-bytes=bytes

したがって、1024バイトから始まる16バイトを読み取り、ASCIIで出力するには

od -j 1024 -N 16 -a /bin/sh

4

を使用できますdd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks(おそらく、bs=11バイトブロックを取得するために、それ以外の場合は512バイトブロックを使用します)。ただし、一度に1バイトずつ書き込むように指示するのがどれほど効率的かはわかりません。


効率に関する懸念している場合まあ、 - 2 ddのパイプ鎖(第一は、脂肪の部分を切り取り可能性があり、第二はないディスク、パイプの上に細かい仕事をするだろう)を一緒にすることができますが、dd持っていないだけでbsなく、個別のibsobs同様に、そうで少なくとも、読み取りよりも大きなブロックで出力できます。
poige

1

ファイルが過度に大きくないと仮定すると(たとえば数GB程度)、1つのファイルから次のファイルへのパイプは、独自のプログラムを作成するのではなく、取得するのと同じくらい効率的です。

head ... file | tail ...

(またはその逆。どちらでも。)


1
オフセットは大きなオフセットの場合は最初にする必要があります。そうでない場合、ヘッド出力の先頭は破棄されます。
プロスキー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.