大規模ログファイルからテキストおよびバイナリ抜粋を削除するシェルスクリプトまたはコマンド

大規模ログファイルからテキストおよびバイナリ抜粋を削除するシェルスクリプトまたはコマンド

毎日作成される大容量ログファイルから大容量バイナリファイル(PDFファイル)を削除する必要があります。これは私たちのサーバーで多くのスペースを占めています。ログをより小さく管理しやすくするために、ログから大きなPDFを削除する必要があります。

文字列間のテキスト(またはバイナリ)を取り出す必要があります。

  • <my:PDF>そして</my:PDF>
  • <applicationForm>そして</applicationForm>
  • <image>そして</image>
  • <extractedSignature>そして</extractedSignature>

sedユーティリティがこれを実行できるかどうかはわかりません。これらのファイルはサイズが大きく、切り取る必要があります。私はログローテーションアドバイスを探しているのではなく、上記の文字の間にあるこれらの大きなテキストログを削除できるスクリプトやコマンドだけを探しています。私は何をすべきかわかりません。このファイルはかなり大きいです。これを達成するために、sed、tail、head、tr、または他のツールを使用する方法がわかりません。

答え1

ログファイルが実際にXML形式のようです。それでは、どうすればいいですか?本物あなたがすべきことは、XMLパーサーを使用することです。読むこの有名なStackOverflowの答えより多くの情報を知りたい場合。

説明によると、SAXベースのパーサーはおそらく最善の選択肢です。これは、ファイル全体をメモリにロードする必要がないストリーム指向のパーサです。 XMLでは非常に単純な変換のみを行うため、XSLTはおそらく非常に良い候補になります(使用すると速度が速くなります)。xsltprocからlibxslt)。これは潜在的に関連技術を示すSO回答

答え2

start//と//パターンの間に複数の行がある場合は、end範囲の合計を使用できますd

一般的に言えば

/start/,/end/d

// と //(含む) の間のstartすべての行がend削除されます。

ファイルを作成し、次の行を追加してsomefileとして保存します。

/<\"my:PDF\">/,/<\"\/my:PDF\">/d
/<\"applicationForm\">/,/<\"\/applicationForm\">/d
/<\"image\">/,/<\"\/image\">/d
/<\"extractedSignature\">/,/<\"\/extractedSignature\">/d

それからこれを使う

sed -f somefile logfile >prunedfile

答え3

sedを使用すると、次のことができます。

cat LOG | sed -e "s/<\"my:PDF\">.*<\/\"my:PDF\">/<\"my:PDF\"><\/\"my:PDF\">/g;" > LOGx

本質的に、これは「<"my:PDF">パターンの後にランダムな数の文字が続き、パターンが続くパターンを見つけてパターンに</"my:PDF">置き換えます<"my:PDF"></"my:PDF">。これをグローバルに行います」を意味します。

置き換える必要がある他の文字列に対して、必要に応じてこの操作を繰り返します。

答え4

アクティビティログを編集するのは面倒で危険なので、サービスが中断されるまで待つ必要があります。これが不可能な場合は、ロギングプログラムがファイルに書き込むのではなく、出力をフィルタに渡すことができるかどうかを確認できます。これにより、情報がディスクに書き込まれる前にフィルタが不要なエントリを削除できます。フィルタ死亡ログエントリが失われるため、これはやや危険です。

残念ながら、sed正規表現は「貪欲」です。単一のログ行に削除するフィールドが複数ある場合、sed はその間のすべてのエントリを削除します。

<"my:PDF">.*?<"/my:PDF"><"keeper">.*?<"/keeper"><"my:PDF">.*?</my:PDF">

-pオプション(man perlrunを参照)を使用すると、Perlはsedと非常によく似ていますが、貪欲ではない正規表現(*?の?)を要求できます。

Perl -p -e '\
    s|<"my:PDF">.*?<"/my:PDF">||g;
    s|<"applicationForm">.*?<"/applicationForm">||g;
    s|<"Picture">.*?<"/Picture">||g;
    s|<"extractedSignature">.*?<"/extractedSignature">||g;
           '巨大な.log>巨大な.log〜&&\
MV巨大。ログ〜巨大。ログ

関連情報