3

私は minecraft サーバーを実行しており、ログ ファイルを定期的にクリーンアップするのが好きです。geditまたはnotepad ++で使用できる一連の正規表現コマンドを開発しましたが、それらは完全に機能しますが、プロセスを自動化できるようにしたいと考えています。

重要なファイル クリーニング コマンドは次のようになります。

cat server.log | sed -e 's/REGEXTODELETE//g' > server.log

しかし、正規表現コマンドを SED に適切に変換するのに問題があります。CentOS6.3 ボックスで sed を使用しています。

以下は、notepad++ で機能するコマンドの例です。

^[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+ \[INFO\] Connection reset$

しかし、それを bash スクリプトに入力すると、次のようになります。

cat server.clean.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\] Connection reset$//g' > server.clean.log

ファイル全体を空にします。私はすべてを見てきましたが、空白に問題があると思われますが、約1時間検索した後、立ち往生しています。どんな助けでも大歓迎です、そして私はより多くの例を提供することができます.

4

2 に答える 2

2

一時ファイルを作成せずにインラインでファイルを変更する場合は、sed の-iオプションを使用できます。たとえば、言及した文字列を含む行を削除する場合は、次を使用できます。

sed -i'' '/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$/d' server.log

これにより、不要なパイプが回避されるだけでなく、出力を入力ファイルにリダイレクトする際に発生する混乱も回避されます。

ここで DELETE LINES に sed を使用していることに注意してください。表記法を使用すると、s/RE/text/内容を IN-LINE に置き換えます。出力行の総数は入力と同じになりますが、テキストを空白に置き換えるだけで(私が収集したように)空白行がたくさんできます。

一時ファイルの問題に対処することを気にしない場合は、おそらく、これをもう少し明確にするgrep代わりにを使用して問題を解決できます。sed

grep -v '^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$' server.log > clean..log

またはおそらく:

grep -Pv '^\d+(-\d+)+ \d+(:\d+)+ \[INFO\]  Connection reset$' server.log > clean.log

Linux を使用していて、悪意のある正規表現を使用してもかまわない場合。(私の経験では\d、正規表現を PCRE として扱っている場合を除いて、POSIX クラスの短縮形は確実に機能しません。

于 2012-10-11T23:05:00.147 に答える
1

問題は、入力ファイルが読み取られる前に上書きしていることです。

cat server.clean.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$//g' > server.clean.log

次のようなものでなければなりません

cat server.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$//g' > server.clean.log

一般に、

program <infile >infile

読み取る機会を得るinfile前に切り捨てられるため、(確実に)機能しませんprogram

于 2012-10-11T22:52:35.593 に答える