2016-01-14 3 views
-1

В файле журнала, который может содержать информацию различной формы, мне нужно grep только те строки, которые содержат подстроку «ABC», а затем среди выбранных строк извлекает (всегда) количество Kb в конце (pattern is ":% 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», то среди выбранных линий извлечения (она всегда существует) число килобайт в конце

Это похоже на работу для 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 

Технически говоря, Вы можете опустить всю строку НАЧАТЬ, но я считаю, что хороший стиль, чтобы быть авансовые о переменных, которые вы ожидаете для использования в программе.

1

Вы можете использовать следующую цепочку:

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

Это работает, даже если поле «kb» не находится в конце. – jofel

+0

@HordonFreeman делает '... | paste -s -d + - | bc 'work (т. е. с дополнительной тире для stdin?). Какую версию пасты вы используете (paste -version)? Возможно, вам понадобится эта паста GNU от coreutils, поскольку другие могут не читать непосредственно из stdin. – jofel

Смежные вопросы