一部のプロセスのログを含む大容量ファイルがあります。ログには「REQUEST(常に)/RESPONSE(時々)」などの行が含まれていますが、RESPONSEが必ずしもREQUESTの次の行ではないことに注意してください。 RESPONSE が表示される前に REQUEST ヘッダーが複数回表示されることがあります。存在する場合は、リクエストとレスポンスに参加し、その行を印刷したいと思います。これがこれまで試したことですが、出力にいくつかの行がありませんでした。
awk 'BEGIN {filename = "log1.etb"}
{line_num++; print "FNR: " FNR " NR: " NR " Counter: " line_num;
if ($0 ~ /REQUEST.*RPCLIB/)
{seqid = $0; sub(/^.*@SeqID/,"SeqID",seqid);
line_req = $0; line_resp = ""; ref_resp = 0;
ref_req = line_num; tot_req++;
print "REQUEST: " $0;
for(i=1;i<=line_num+99999;i++1) {getline < "log.etb"; if ($0 ~ /RESPONSE/ && $0 ~ seqid) {ref_resp = +i; line_resp = $0; break;}};
print "FNR: " FNR " NR: " NR " REQUEST: " ref_req " RESPONSE: " ref_resp " " seqid;
print line_req"+"line_resp > filename;
FNR = line_num-1; NR = FNR;
}
}
END {print "Total REQUEST: " tot_req}
' ../EXX/log.etb
入力する:
REQUEST 2019-01-16 00:32:07.809@{fields}@SeqID = 9517
RESPONSE 2019-01-16 00:32:07.809@{fields}@SeqID = 9517 , Partner SeqID = 3393
REQUEST 2019-01-16 00:32:07.809@{fields}@SeqID = 9515
REQUEST 2019-01-16 00:32:07.810@{fields}@SeqID = 9520
RESPONSE 2019-01-16 00:32:07.810@{fields}@SeqID = 9520 , Partner SeqID = 3395
希望の出力:
REQUEST 2019-01-16 00:32:07.809@{fields}@SeqID = 9517+W02/RESPONSE 2019-01-16 00:32:07.809@{fields}@SeqID = 9517 , Partner SeqID = 3393
REQUEST 2019-01-16 00:32:07.809@{fields}@SeqID = 9515+
REQUEST 2019-01-16 00:32:07.810@{fields}@SeqID = 9520+W02/RESPONSE 2019-01-16 00:32:07.810@{fields}@SeqID = 9520 , Partner SeqID = 3395
要求/応答に関連付けられているSeqID番号ですが、ある時点でログに再び表示されることがあります。また、REQUEST は、RESPONSE の前に何度も発生する可能性があり、RESPONSE が発生する場合と発生しない場合があります。
ベストアンサー1
コメントできないため、回答としてコメントを残します。申し訳ありません。
SEQIDが一致したら、REQUESTとRESPONSEに参加したいですか?まず、seqidに基づいてデータをソートするとどうでしょうか?応答が常に要求に従うことを保証します。