1

このデータセットからユーザー番号とエラーだけを取得するのに苦労しています。どこが間違っているのですか?

ソースデータ:

[319041185] :: [2013/08/28 08:10:22.702 P2D98 T020 d] PSComAccountsClient.UserPasswordVerify User=6272820002384270, Password=[not logged], AccessLevel=User
.
.
[319041253] :: [2013/08/28 08:10:22.718 P2D98 T020 e] [FunctorBase.Execute] (ErrorCode=Pedi.InternalError) An internal server error occurred. The account could not be found.

指示:

awk "{if (/User=/) {s=$NF; gsub (/[^0-9]/,\"\",s);} if (s==/[0=9]/ && /ErrorCode=/) {q=sub (/.*InternalError\\")"/,\"\"); } printf s; printf q}" file

現在の出力:

NULL

意図した出力:

6272820002384270 An internal server error occurred. The account could not be found.
4

3 に答える 3

2

grep を使用することもできます。

grep -Po 'User=\K[0-9]*'
于 2013-08-28T15:36:25.543 に答える
1

ファイル構造が一貫している場合に使用する 1 つのアプローチGNU awkは、複数のフィールド セパレータを設定し、必要なフィールドのみを出力することです。

$ awk -F'[=, ]' '{print $10}' file
6272820002384270

フィールド番号が行ごとに変わる可能性がある場合は、すべてのフィールドをループします。

$ awk -F'[, ]' '{for(i=1;i<=NF;i++)if($i~"User=")print substr($i,6)}' file
6272820002384270

または、次の値を設定しますRS

$ awk '$1=="User"{print $2}'  RS=',? ' FS='=' file
6272820002384270
于 2013-08-28T15:36:13.163 に答える
0

まあ言ってみれば:

str='Source: [319041185] :: [2013/08/28 08:10:22.702 P2D98 T020 d] PSComAccountsClient.UserPasswordVerify User=6272820002384270, Password=[not logged], AccessLevel=User'

使用grep -oP:

grep -oP '(?<=User=)\d+' <<< "str"

awk の使用:

awk -F'[,=]+' '{print $2}' <<< "str"
于 2013-08-28T15:36:03.223 に答える