まだ診断されていないアプリケーションのバグが原因で、ディスクがいっぱいのサーバーが数百台あります。重複する行で満たされたファイルが1つあります。ログファイルではなく、変数定義を含むユーザー環境ファイルです(そのため、ファイルを削除することはできません)。
sed
誤って追加された行をチェックして削除する簡単なコマンドを書き、ファイルのローカルコピーでテストしました。意図したとおりに機能しました。
ただし、ディスク全体を使用してサーバーで試したところ、およそ次のエラーが発生しました(コピーと貼り付けではなく、メモリからのものです)。
sed: couldn't flush /path/to/file/sed8923ABC: No space left on deviceServerHostname
もちろん、私が知っている、左にスペースはありません。だから私はものを削除しようとしています!(sed
私が使用しているコマンドは、4000行以上のファイルを約90行に減らします。)
私のsed
命令はただsed -i '/myregex/d' /path/to/file/filename
ディスクがいっぱいでもこのコマンドを適用する方法はありますか?
(クイックフィックスとして数百のサーバーに適用する必要があるため、自動化する必要があります。)
(明らかにアプリケーションのバグを診断する必要がありますが、その間サーバーは正しく動作していません...)
更新:私が直面した状況は、自分が削除できることがわかった他のものを削除することで解決しましたが、この質問への回答は今後も他の人にも役立つと思います。
/tmp
立ち入り禁止です。同じファイルシステム上にあります。
ディスク領域を解放する前にvi
、ファイルを開いて実行することで行を削除できることをテストして確認し:g/myregex/d
、変更をで正常に保存しました:wq
。一時ファイルを保持するために別のファイルシステムに頼ることなく、これを自動化することは可能であると思われます...(?)
sed -i
処理する一時的なコピーを作成します。私ed
は実際の解決策を禁止するのに十分に精通していませんが、これにはより良いと思います
ed
、あなたは実行したい:printf %s\\n g/myregex/d w q | ed -s infile
しかし、いくつかの実装でも同じように一時ファイルを使用して覚えておいてくださいsed
(あなたが試みることができるbusyboxのEDを -それは一時ファイルを作成しません。私の知る限り)
echo
。使用しますprintf
。そして作るsed
あなたは後続の空白を失うことを避けることができるので、あなたが最後の行にドロップし、いくつかの文字を追加します。また、シェルは単一のコマンドラインでファイル全体を処理できる必要があります。それがあなたのリスクです-最初にテストしてください。bash
それは特に悪いです(スタックスペースで行うと思いますか?)。いつでも気分が悪くなるかもしれません。2つのsed
「si推奨」は、少なくともカーネルのパイプバッファーを使用して両者の間で効果を発揮しますが、方法はかなり似ています。コマンドのサブものはfile
、sed w / inが成功したかどうかも切り捨てます。
sed '/regex/!H;$!d;x' <file|{ read v && cat >file;}
て、それが機能するかどうか、残りの私の答えを読んでください。