2013-08-28 263 views
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. 
+0

您可以編輯以瞭解更多詳細信息後,沒有必要離開在評論細節 – krsteeve

+1

你已經表現出一定的樣本輸入和你嘗試的解決方案所以這是一個很好的開始,現在公佈的預期輸出玩完了你的問題。 –

+0

我能夠做到這一點如下: 代碼: awk「{if(/ User = /){s = $ 0; sub(/.* User = /,\」\「,s); sub (/P.*/,\"\",s);} if(s &&/ErrorCode = /){sub(/.* InternalError \\「)」/,\「\」);} printf s; print} 「」file「| grep」server error「| awk -F」,「」{if($ 2〜/ error /){print}}「|排序| Uniq – user2726046

回答

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" 
1

一個使用GNU awk方法,如果該文件的結構是一致的是設置多個字段分隔符,只是打印您需要的領域:

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

如果字段數量可能從線改變了所有的字段行剛剛循環:通過設置RS

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

或者:

$ awk '$1=="User"{print $2}' RS=',? ' FS='=' file 
6272820002384270 
+1

+1。但是,沒有任何GNU awk特定於任何這些解決方案,但是它們可以與任何現代awk一起使用。 –

2

你也可以使用grep,例如

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