1

PHP または Linux コマンド シェルで、10 行を超えるテキスト ファイルを最後の 10 行のみに縮小するための最速の方法を知る必要があります。この例では 10 行を使用します。

ありがとう :)

4

4 に答える 4

3

ファイルを最後まで減らすには、行は

tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file

説明:

tailファイルの最後のn行を出力します。 >それをファイルに書き込みます。 &&コマンドを連鎖させるためのものです。 rmファイルを削除します。 mvファイルの名前を変更します(または別の場所に移動します)。

于 2012-07-25T19:55:14.310 に答える
1

本当に新しいファイルを生成したくない場合は、試してみてください

echo "$(tail -n 10 path/to/file)" >path/to/file

$()、文字列でより適切に機能することを除いて、バッククォートと同じように機能します (内部にあるものは何でも評価し、上記のコマンドの出力と同等です)。私のLinuxマシンではtail、出力がファイルに送られる前に文字列が評価されます(実行されることを意味します)(これが問題の原因tail file >fileです;コマンドが開始されるとすぐにファイルが開かれ、切り捨てられます)。 ビルトインだからだと思いますechoが、それについては引用しないでください。

編集: 実際、私は詳しく調べました。が文字列になっているからtailです。いくつかのフェーズがあります。ここで注目するのは補間、リダイレクト、および実行です。これらは常に特定の定義された順序 (つまり、指定された順序) で発生します。また、文字列を補間する過程で、Bash は文字列内でコマンドを実行する必要があります。リダイレクトが行われる前。ストレートtail file >fileでは、tailプログラムが実際に出力を生成するため、コマンドが実行されるまで出力は発生しませんが、ファイルはその直前に書き込み用に (リダイレクトにより) 既に開かれており、そのファイルを書き込み用に開くと切り捨てられます。 )

phase          tail file >file                   echo "$(tail file)" >file
-------------+---------------------------------+-------------------------------
interpolate   nothing                           run "tail file"; get output (+)
redirect      open file for write; set stdout   open file for write; set stdout
execute       run "tail file" (*)               run 'echo "line\nline\n..."'

(*): 注、fileこの時点ですでに書き込み用に開かれているため、現在は切り捨てられています。したがって、tail0バイトを読み取ります。
(+):リダイレクトによって書き込み用に開かれるfileに読み取られたため、すべてのデータを表示できました。tail

動作は明らかに定義されており、予測可能ですが、これはまだ私にはハッキリしているように感じます。これは bash arcana に依存しているため、取得しようとする行が多すぎたり長すぎたりすると、メモリの問題が発生する可能性があります。(最大 500 文字の行でテストしましたが、問題は見られませんでした。ただし、まだ 10 行を超えてテストしていません。) 同じ inode 番号を保持する必要がない限り、おそらく一時ファイルを使用する方がよいでしょう。奇妙な理由で。

于 2012-07-25T21:38:27.290 に答える
0
tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile

10行を超える可能性のあるファイルの最後の10行のみを提供するように編集されました。

于 2012-07-25T19:55:36.287 に答える
0

Linuxでは次のことができます

tail -n 10 path/to/file > path/to/output/file

これにより、ファイルの最後の10行(-nの後の値で指定された行数)が取得され、別のファイルに追加されます。

既存のファイルを最後の10行だけで上書きする場合は、次のようにします。

tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file

最初の例は別のファイルに出力し、2番目の例は既存のファイルを上書きすることに注意してください。

PHPでこれを行うには、内部のシェルコマンドでexec()を使用するか、file()を使用してファイル全体を配列に読み込み、配列の最後の10個の要素を取得してそれらをに追加するというより面倒な方法を使用します。 fwrite()などを使用したファイル。

于 2012-07-25T19:55:38.053 に答える