これはデータです
10:43:19.538281|TraceDetail |UPBSStandardGenericBillPaymentComponent.PostBillPaymentTransaction|Total Time 19/06/2019 10:43:19.538281|TraceDetail |UPBSStandardGenericBillInquiryComponent.GetBillInquiry()|Total Time |2361748 | Consumer Number [0312122221212 ] , UCID [KLOJ0001] , Sending Time [10:43:17.8425459] Receive Time [10:43:18.4941158] Total Time [0:0:651] STAN is [345949]
出力したい
[0312122221212 ]
[KLOJ0001]
[10:43:17.8425459]
[10:43:18.4941158]
[0:0:651]
[345949]
多くのコマンドを試しましたが、次の結果が得られませんでした。
grep -oP 'Consumer Number \K.{26}|UCID \K.{10} |Sending Time \K.{09}|Receive Time \K.{09}|Total Time \\[ \K.{8}|STAN is \K.{8}' /root/Documents/a.txt
合計時間なしで出力を取得します。
[0312122221212 ]
[KLOJ0001]
[10:43:17.8425459]
[10:43:18.4941158]
[345949]
このコマンドを試した場合:
grep -oP 'Consumer Number \K.{26}|UCID \K.{10} |Sending Time \K.{09}|Receive Time \K.{09}|Total Time \K.{8}|STAN is \K.{8}' /root/Documents/a.txt
出力に無効な値が表示されます。
19/06/
[0312122221212 ]
[KLOJ0001]
[10:43:17.8425459]
[10:43:18.4941158]
[0:0:651]
[345949]
答え1
単に以下を使用できます。
grep -oP '\[.*?\]' /root/Documents/a.txt
\[
テキストマッチ[
.*?
貪欲な(怠惰な)方法で文字数に関係なく一致します。
\]
テキストマッチ]
では、正規表現にどのような問題があるかを説明します。
これ:
grep -oP 'Consumer Number \K.{26}|UCID \K.{10} |Sending Time \K.{09}|Receive Time \K.{09}|Total Time \\[ \K.{8}|STAN is \K.{8}' /root/Documents/a.txt
壊れた:grep: missing terminating ] for character class
おそらくここに間違って貼り付けたようです...確認してください。
これ:
grep -oP 'Consumer Number \K.{26}|UCID \K.{10} |Sending Time \K.{09}|Receive Time \K.{09}|Total Time \K.{8}|STAN is \K.{8}' /root/Documents/a.txt
変更可能:
grep -oP 'Consumer Number \K.{29}|UCID \K.{10} |Sending Time \K.{09}|Receive Time \K.{09}|Total Time \K[^/ ]{9}|STAN is \K.{8}' /root/Documents/a.txt
しかし、これが最善のアプローチではないことに注意してください。もともと正規表現の問題はあまりにも許容できることです。したがって、特定の一致のみを含める必要があることを知っている場合は、不要な項目と一致させます。 , [
, , , 使用しないでください... あまりにも緩いのでnumbers
言うべきではありません。たとえば、次のようにより正確に説明します。space
]
.{29}
[][0-9 ]{29}