コマンドライン「バッファ」

コマンドライン「バッファ」

tailファイルの最後の100行を同じファイルに書きたいのですが、コマンドはtail -n 100 file > file機能しません。元のファイルからすべての内容を読み取る前に、標準出力が「ライブ」ファイルに書き込まれるためとします。

出力をパイプに接続する方法はありますか?その後、100行すべてが表示されるまで保存してからファイルに出力しますか?それとも、このようにファイルを減らす別の方法ですか?

答え1

sponge~からその他のユーティリティいいですね。それ:

標準入力を受け取り、ファイルに書き込む

次のように使用します。

tail -n 100 file | sponge file

希望の効果を得るために。

答え2

もちろんSEでいよいよこの質問を投げた瞬間、答えが現れた。私の要件にはあまり適していないので、次のように書いてください。

tail -n 100 file | less > file

答え3

存在する:

tail -n 100 file > file

シェルはプロセスを分岐し、書き込み用にfile開き、切り取り(空のファイルにし)、tailそのプロセスで実行します。切り捨てなしで開くには、リダイレクト演算子をfile使用できます<>

tail -n 100 file 1<> file

しかし、問題はまったく切り捨てが発生しないということです。つまり、file最後の100行を上書きしますが、この100行以降はファイルの元の内容がそのまま残ります。したがって、tail完了したら、切り捨てるために別のコマンドを呼び出す必要があります。

{ tail -n 100 file; perl -e 'truncate STDOUT, tell STDOUT'; } 1<> file

答え4

次のことができます。

printf '%s\n' "$(tail -n 100 file)" > file

関連情報