2

ここで小さな問題があります。不明なサイズのファイルを読み取れるようにする必要があります。数百行以上になる可能性があり、ログファイルは常に変化し、いつチェックするかによって異なります。ファイルからある範囲の行を読み取ることができる php または Linux のメソッドが必要です。ファイル全体をphpメモリに読み込んで行を削除する必要はありません。ファイルがphpの許容メモリよりも大きい可能性があるためです。

また、デフォルトのphpモジュールを使用するか、デフォルトのLinuxツールを使用して、移植性が必要なため、何もインストールする必要はありません。

編集:

Linuxベースのオプションの場合、複数の範囲を提供できるようにしたいので、いくつかの異なる範囲の行を取得する必要があるかもしれません.Linuxではなくphpでそれを行う方法を知っており、すでに持っている過去の行を読むことを避けます.読んだ?

4

4 に答える 4

4

awk を使用:

awk 'NR>=10 && NR<=15' FILE

awk を使用 (2 つの範囲):

awk 'NR>=10 && NR<=15 || NR>=26 && NR<=28' FILE

ed:

echo 2,5p | ed -s FILE

ed2 つの範囲 :

echo -e "2,5p\n7,8p" | ed -s FILE

最後になりましたが、sed2 つの範囲を持つソリューション (最速のソリューション、でテスト済みtime):

sed -n '2,5p;7,8p' FILE
于 2012-10-01T02:48:29.220 に答える
1

のようなものはどうですか

head -100 | tail -15

86〜100行目

于 2012-10-01T02:54:01.817 に答える
0
$ cat input.txt
q
w
e
r
t
y
u
i
$ sed -n 2,5p input.txt
w
e
r
t
于 2012-10-01T02:46:22.253 に答える
0
while ($lines_read < last_line_desired) {
  while ($line = fgets($filehandle, $buffersize) !== false)
    if (line >= first_desired_line) {
      push($interesting_lines, $line)
    }
  }
  $lines_read++
}

ファイルハンドルを開く、予想される行の長さをカバーするのに十分な大きさのバッファサイズを選択するなどは、あなた次第です。

定期的に追加されるファイルを読んでいる場合は、ftell関数とfseek関数を調べて、データ内のどこにいるかを確認し、さらに読む前に古いものをすべてスキップする必要があります。

于 2012-10-01T03:06:09.347 に答える