CentOSに巨大なテキストファイル(ログファイル)があり、その上部を削除したいと思います。おそらく毎日数千行です。 (またはおそらく2つに分割するだけです)
このサイトを検索したところ、ほとんどの場合grepを使用して行を削除しましたが、別のファイルに出力していることがわかりました。シェルスクリプト(bash)を使用して、ファイルをその場で更新できるかどうかわかりませんか?の代わりに:
sed current file > new file
cp new file > current file
ありがとう!
sed --in-place $filter $file
ファイルの先頭から行を削除する簡単な方法はありません!
sed -i
を使用しても、次のコマンドで示すように新しいファイルを作成します(>
は私のプロンプトです)。
> echo "Helo World" > toto
> ls -i toto
147543 toto
> sed -i -e 's/Helo/Hello/' toto
> ls -i toto
147292 toto
Iノード番号が同じではないことに注意してください。これは、ファイルをその場で変更するのではなく、同じ名前で新しいファイルを作成することを意味します。
これは、この操作の実行中にログファイルがプログラムによって開かれている場合に重要です。そうである場合は、ファイルを保持しているプログラムが古いファイルに書き込みを続けている間に、新しいファイルを作成します。これを示すために、次のことを試してみましょう。
for f in $(seq 1 100); do date; echo $f; sleep 1; done > file1&
ln file1 file2
sleep 5
sed -i -e '1,10d' file1
ls -l file1 file2
sleep 5
ls -l file1 file2
2番目のls
は、file1
のサイズが同じで、file2
のサイズが大きくなります。 ln
を実行する前にsed
を実行していなかった場合、元のファイルはファイルシステム階層を介してアクセスできずに大きくなり続けていたでしょう。これにより、df
で示されるようにディスク上の使用スペースが発生しますが、du
では示されません。詳細については、 ここ および ここ を参照してください。
ログローテーションはここではあなたの友達ですが、ログプログラムの助けなしにそれを行うことはできません。プログラムにファイルを閉じて再度開くように指示する方法があるはずです。そうすれば、新しいファイルが使用されますが、ログはsed
の開始後に書き込まれます。ファイルの再オープンの終了が失われる可能性があります。ログを失いたくない場合は、最初にファイルをコピーし、プログラムにファイルを再度開くように依頼してから、コピーしたファイルを変更できます。これは、logrotate
が最小限のスクリプトで実行できることです。
このテーマの詳細を読むことができます ここ(Apache 1.3) 、 ここ(Apache 2.4) および ここ(バインド9) 。
ExモードでVimを使用できます:
ex -sc '1d2000|x' file
1
最初の行に移動
2000
2000行を選択
d
削除
x
保存して閉じる
ログをローテーションするためのcronジョブを設定しますか?うーん?
CentOSに巨大なテキストファイル(ログファイル)があり、上部を削除したい
tailを使用して、最後のN行のみを含む新しいファイルを生成できます
tail -n logfile >newlogfile
zcat logfile > $(date +%Y%m%d)logfile.gz && mv -f newlogfile logfile 2>/dev/null
、おそらく毎日数千行。 (またはおそらく2つに分割するだけです)
次のコマンドでファイルの行数を取得できます。
NUMLINES=$(awk 'END{print NR}' logfile)
#do some integer math and split with head and tail
このサイトを検索したところ、ほとんどの場合grepを使用して行を削除しましたが、別のファイルに出力していることがわかりました。シェルスクリプト(bash)を使用して、ファイルをその場で更新できるかどうかわかりませんか?の代わりに:
はい、sedを使用して最初のn行を削除できます
#remove the first 10 lines
sed -i '1,10d' logfile