私は同様のトピックを見つけましたが、それを直接使用するために実装する方法がわかりません。
問題はこれである:
私のプロジェクトでこれを実装しようとしていますが、うまく動作しないようです。私はLinuxを使用しています。誰でもハックできますか?
基本的に私が望むのは、ログバンドルを繰り返し、特定の行とそのスタック\詳細情報をキャプチャすることです。例は次のとおりです。
2020-01-20T05:58:19.119Z verbose vpxa[6E21B70] [Originator@6876 sub=PropertyProvider opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [CommitChangesAndNotify] Updating cached values
2020-01-20T05:58:19.119Z info vpxa[6E21B70] [Originator@6876 sub=Default opID=k5cokp1a-928316-auto-jwal-h5:70047736-92-01-84] [VpxLRO] -- ERROR task-107599 -- **vm-1178** -- vim.VirtualMachine.reconfigure: vmodl.fault.InvalidArgument:
--> Result:
--> (vmodl.fault.InvalidArgument) {
--> faultCause = (vmodl.MethodFault) null,
--> faultMessage = (vmodl.LocalizableMessage) [
--> (vmodl.LocalizableMessage) {
--> key = "msg.disk.extendFailure",
--> arg = (vmodl.KeyAnyValue) [
--> (vmodl.KeyAnyValue) {
パターンが変更されるまで、「vm-1178」を含むすべての行と「-->」で始まるすべての後続の行をキャプチャし、次にこれが発生するまでvm-1178を探し始めます。
これが意味があることを願っています。ありがとうございます!
答え1
この試み、
awk '!/^-->/{p=0} /vm-1178/{p=1} p'
!/^-->/{p=0}
:p
行が始まらないときはいつでもvar(printなど)を0に設定します-->
。/vm-1178/{p=1}
p
:行が一致するたびにvar = 1を設定します/vm-1178/
。p
p
:真の1行を印刷します(ここで= 1)。
答え2
awk
この目的に使用できます。
awk 'index($0,"vm-1178")>0 {in_pat=1; print; next} \
in_pat == 1 && $0 ~ /^-->/ {print; next} \
{in_pat=0}' logfile.txt
これには3つのルールが含まれます。
- 最初のルールは、パターンを含む行を見つけて印刷し、内部フラグを
in_pat
1に設定します。 - 2番目の規則は、次に始まるすべての行も
-->
印刷されることです。 - 3番目のルールは、最初の行のフラグをリセットするために使用されます。いいえパターンを含めるか、で始まらないと、
-->
パターンが再発見されるまで何も印刷されません。
最初のルールでは、index
RegExp マッチングの代わりに関数が使用されます。この方法では、正規表現で特別な意味を持つ文字を含むパターンを見つけることもできます。
答え3
Perlを使用すると、次のように動作します。
perl -ne ' { $t=0 if ( !/^-->/ ); $t=1 if(/vm-1178/); print if($t); }' <filename>