これは簡単なはずですが、どうやら今日は頭がありません。
複数のアプリからのエントリを含む 20 ギガのログが 50 あります。そのうちの 1 つはログ行にトランザクション ID を追加します。確認する必要がある 42 のトランザクション ID があり、適切な行を個別のファイルに解析したいと考えています。
単一のファイルを実行するには、コマンドは単純に次のようになります。
grep CDBBDEADBEEF2020X02393 server.log* > CDBBDEADBEEF2020X02393.log
これにより、50 個の server.log すべてから、そのトランザクションに分離されたログが作成されます。
これで、42 個の txnID を持つファイルができました (ここでは 4 に短縮):
CDBBDEADBEEF2020X02393
CDBBDEADBEEF6548X02302
CDBBDE15644F2020X02354
ABBDEADBEEF21014777811
そして私は書いた:
#/bin/sh
grep $1 server.\* > $1.log
しかし、それは機能していません。シバンを #/bin/bash -xv に変更すると、次のような奇妙な出力が得られます (明らかに、正しいエスケープ マジックがどうあるべきかで遊んでいます)。
$ ./xtrakt.sh B7F6E465E006B1F1A
#!/bin/bash -xv
grep - ./server\.\*
' grep - './server.*
: No such file or directory
コマンドラインも試しました
grep - server.* < txids.txt > $1
しかし、明らかに $1 は無意味であり、コマンドの入力リダイレクト形式を使用して txid ごとに名前が付けられたファイルを取得する方法がわかりません。
アイデアをお寄せいただきありがとうございます。必要に応じて後でコンテキストを調べることができるように、grep で元のファイル名を出力行に入れたいので、シェル スクリプトで foreach を実行するルートには行っていません。
また、server.* ファイルを数値順に並べると便利です (server.log.1、server.log.2 ではなく、server.log.1、server.log.10...)。