从字符串中提取数字

时间:2013-08-28 15:32:05

标签: awk

我很难从这个数据集中拉出用户编号和错误。我哪里错了?

来源数据:

[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.

3 个答案:

答案 0 :(得分:2)

您也可以使用grep,例如

grep -Po 'User=\K[0-9]*'

答案 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

答案 2 :(得分: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"