2013-06-27 54 views
1

我試圖從日誌文件中得到所有「CP」值類似下面的文本文件:從提取特定值從排長

2013-06-27 17:00:00,017 INFO - [AlertSchedulerThread18] [2013-06-27 16:59:59, 813] -- SN: 989333333333 ||DN: 989333333333 ||CategoryId: 4687 ||CGID: null||Processing started ||Billing started||Billing Process: 97 msec ||Response code: 2001 ||Package id: 4387 ||TransactionId: 66651372336199820989389553437483742||CDR:26 msec||CDR insertion: 135 msec||Successfully inserted in CDR Table||CP:53 msec||PROC - 9 msec||Successfully executed procedure call.||Billing Ended||197 msec ||Processing ended 
2013-06-27 17:00:00,018 INFO - [AlertSchedulerThread62] [2013-06-27 16:59:59, 824] -- SN: 989333333333 ||DN: 989333333333 ||CategoryId: 3241 ||CGID: null||Processing started ||Billing started||Billing Process: 61 msec ||Response code: 2001 ||Package id: 2861 ||TransactionId: 666513723361998319893580191324005184||CDR:25 msec||CDR insertion: 103 msec||Successfully inserted in CDR Table||CP:59 msec||PROC - 24 msec||Successfully executed procedure call.||Billing Ended||187 msec ||Processing ended 
2013-06-27 17:00:00,028 INFO - [AlertSchedulerThread29] [2013-06-27 16:59:59, 903] -- SN: 989333333333 ||DN: 989333333333 ||CategoryId: 4527 ||CGID: null||Processing started ||Billing started||Billing Process: 47 msec ||Response code: 2001 ||Package id: 4227 ||TransactionId: 666513723361999169893616006323701572||CDR:22 msec||CDR insertion: 83 msec||Successfully inserted in CDR Table||CP:21 msec||PROC - 7 msec||Successfully executed procedure call.||Billing Ended||112 msec ||Processing ended 

...得到的輸出是這樣的:

CP:53 msec 
CP:59 msec 
CP:21 msec 

我該如何使用awk來做到這一點?

+0

那些是''真的有或沒有你只需添加它們來突出你感興趣的領域? –

+0

不,剛添加來突出顯示他們 – Mahdi

+0

對不起,通過把**我導致了錯誤的答案。 – Mahdi

回答

3

cut總是又好又快這些東西:

$ cut -d"*" -f3 file 
CP:53 msec 
CP:59 msec 
CP:21 msec 

無論如何,這些awk辦法可以使它:

$ awk -F"|" '{print $27}' file | sed 's/*//g' 
CP:53 msec 
CP:59 msec 
CP:21 msec 

$ awk -F"\|\|" '{print $14}' file | sed 's/*//g' 
CP:53 msec 
CP:59 msec 
CP:21 msec 

或者也

$ awk -F"*" '{print $3}' file 
CP:53 msec 
CP:59 msec 
CP:21 msec 

在兩者中,我們都設置字段分隔符以將字符串拆分爲一些特定字符|*。然後我們打印一個分割文本塊。

+0

或者:'awk'{print $ 14}'FS ='\\ | \\ |'輸入' –

+0

請注意,打印的星星,這是OP似乎並不想要的。 –

+0

謝謝@WilliamPursell,不知道如何讓'||'成爲分隔符。 – fedorqui

2

一個有趣的sed命令怎麼樣?

sed -n 's/.*\*\*\(.*\)\*\*.*/\1/p' 
2

隨着awk

awk -F"[|*]+" '{ print $14 }' file 
+1

我喜歡這個'-F'表達式,不知道有可能這樣做。 – fedorqui

2
$ awk -F'[|][|]' '{print $14}' file 
**CP:53 msec** 

**CP:59 msec** 

**CP:21 msec** 

如果你真的有'*的輸入,只是調整將其刪除:

$ awk -F'[|][|]' '{gsub(/\*/,""); print $14}' file 
CP:53 msec 

CP:59 msec 

CP:21 msec 
+0

awk -F'[|] [|]''{print $ 14}'logActivity.log | grep「CP」> cptimes 通過這個我可以提取所需的值,謝謝 – Mahdi

+1

@Mahdi你爲什麼管道grep?如果你已經使用了awk,你永遠不需要grep - 如果你有不同於你發佈的輸入,並且只想在第14個字段中使用「CP」的行,那麼只需在awk腳本中指定:'awk -F'[|] [ |]''$ 14〜/ CP/{gsub(/ \ * /,「」);打印$ 14}'文件' –

2

總是有grep

grep -o 'CP:[[:digit:]]* msec' log.txt 

如果它不一定每次都將是毫秒,你可以採取一切都交給了管:

grep -o 'CP:[^|]*' log.txt 
2

代碼GNU

 
$sed -r 's/.*(CP:[0-9]+\smsec).*/\1/' file 
CP:53 msec 
CP:59 msec 
CP:21 msec