1

これは簡単なはずですが、どうやら今日は頭がありません。

複数のアプリからのエントリを含む 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...)。

4

1 に答える 1

2

これを試して:

while read -r txid
do
    grep "$txid" server.* > "$txid.log"
done < txids.txt

ファイルの順序については、ファイルの名前を 1 桁から 2 桁に変更し、先頭にゼロを付けmv server.log.1 server.log.01ます。

于 2013-05-17T19:44:27.473 に答える