2016-01-14 74 views
-1

在可能包含不同形式信息的日誌文件中,我只需要grep僅包含子字符串「ABC」的那些行,然後在所選行中提取(它始終存在)的數量Kb最後(模式是「:%n Kb」,其中%n是從0開始的數字)。最後,我需要將所有值加起來以獲得應用程序使用的內存量。Linux命令行查找並添加數字

2016-01-14T16:15:01.695Z [INFO] application - ABC 5f18dda7-a30a-44f5-82dd-69d4b5469245: 118 Kb 
2016-01-14T16:15:04.535Z [INFO] application - 5f18dda7-a30a-44f5-82dd-69d4b5469245 
+0

你已經嘗試的東西嗎? – wRAR

回答

1

grep不是一個動詞,而是awk是!

awk '/ABC/ {s+= $(NF-1)} END {print s "Kb"}' 

應該工作(未測試的)

+0

'awk'的確是這樣。你能解釋在這種情況下術語*動詞*的含義嗎?在這種情況下我沒有翻譯它。 – hek2mgl

+0

我只是說在'我需要grep只有那些行...'這個短語中使用'grep'作爲動詞會導致OP錯過顯而易見的解決方案。 'grep'通常用作常用動詞,但'awk'很少,我認爲這是一種諷刺。 –

+0

有趣的解釋! :)借調! – hek2mgl

0

我需要到grep只有那些含有子串「ABC」,然後選擇線中提取線(它總是存在)在端

KB的數量

這看起來像awk的工作。的數量總是倒數第二列,該列的awk可以容易地提取:

awk '/ABC/ { print $(NF-1) }' filename_here 

這裏NF-1是第二最後列的索引,和$得到該列中的值。

但是你想總結一下,而不是僅僅提取。這是一個簡單的任務,它展示了的awk一個稍微高級的用法:

awk ' 
    BEGIN { sum = 0; } 
    /ABC/ { sum += $(NF-1); } 
    END { print sum; } 
' filename_here 

從技術上講,你可以省略整個BEGIN線,但我認爲這是良好的作風是的前期關於你所期望的變量在程序中使用。

1

您可以使用下面鏈:

grep ABC logfile.txt | egrep -o "[0-9]+ Kb" | cut -f1 -d" "| paste -s -d+ | bc 
+0

即使「kb字段」不在最後,也可以使用。 – jofel

+0

@霍頓弗里曼做'... | paste -s -d + - | bc'工作(即爲stdin添加一個破折號?)。你使用什麼版本的粘貼(粘貼 - 版本)?您可能需要從coreutils獲得此GNU粘貼,因爲其他可能不會直接從標準輸入讀取。 – jofel