間に行数が不明な行を探す

間に行数が不明な行を探す

次の出力を含むテキストファイルがあります。

file_0108.json
2023-02-22T01:15:05.531+0000    connected to: mongodb://[**REDACTED**]@localhost
2023-02-22T01:15:08.531+0000    [######..................] db.coll  64.7MB/255MB (25.4%)
2023-02-22T01:15:11.531+0000    [############............] db.coll  128MB/255MB (50.3%)
2023-02-22T01:15:14.531+0000    [##################......] db.coll  196MB/255MB (76.9%)
2023-02-22T01:15:17.286+0000    [########################] db.coll  255MB/255MB (100.0%)
2023-02-22T01:15:17.286+0000    380757 document(s) imported successfully. 0 document(s) failed to import.

ファイル番号(0000 - 1000のブロック開始)すべてのファイルが正常にインポートされたわけではありません。ファイル名で始まり、次に終わるすべてのテキストブロックを見つける方法は?

xxxxx document(s) imported successfully. 0 document(s) failed to import

それでは、削除してエラーだけを残しておきますか?
各チャンクは、ファイル名とチャンクの終わりの間に異なる行数を持つことができます。
一部のブロックにはエラーがありますが、エラーが異なる可能性があるため、エラーなしでブロックを削除する方が簡単になると思います。

エラーブロックの例:

file_0293.json  
2023-02-22T01:52:15.303+0000    connected to: mongodb://[**REDACTED**]@localhost  
2023-02-22T01:52:16.836+0000    Failed: error processing document #46401: invalid character ',' after object key  
2023-02-22T01:52:16.836+0000    46000 document(s) imported successfully. 0 document(s) failed to import.

ベストアンサー1

もしあれば各ブロック内に空白行はありません。テキストを入力してsed各行の後に空白行を挿入し、imported successfullyファイルを「段落」(1つ以上の空白行で区切られたテキストブロック)として扱うことができます。たとえば、

sed -e $'/imported successfully/a\\\n' filename |
  perl -00 -n -e 'print if /Failed:/'

forまた、あなたのコメントでbashループを実行して入力ファイルが生成されると述べましたecho <filename> && mongoimportecho <filename> && mongoimport ; echo今後の実行では、出力がすでに段落に分割されるように実行に変更することをお勧めします。sed改行文字を挿入する必要はなくなり、次のように実行できます。

perl -00 -n -e 'print if /Failed:/' filename

おすすめ記事