Сценарий оболочки печатает некоторое количество слов после указанного c слова - PullRequest
1 голос
/ 18 марта 2020

Я новичок в сценариях оболочки. У меня есть файл журнала, и я хочу grep только «истекшее время» и сразу после этого напечатать цифру c.

Журнал выглядит так -

Thread:MkdirSUProc workarea:92d70a0a8 cid_working_on:3164187 line:1085 clientIP:10.176.118.170:39575 elapsed time:649 ms additional_info:, Replication info:
stack:  fs/server/mapserver/create.cc:1085
        fs/server/mapserver/locks.cc:108 lkOwner:0x92c38c0a8
Thread:WriteFile workarea:9dbc7c538 cid_working_on:2402759 line:875 clientIP:10.176.118.170:0 elapsed time:17287 ms additional_info:, Replication info:  wa = 0x9dbc816c8
stack:  fs/server/mapserver/write/writev3.cc:875

Требуется вывод как -

649
17287

Всякий раз, когда я использую grep, он печатает всю строку. Любая помощь и направление будут оценены.

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

1-е решение: Это можно сделать в одном awk, не могли бы вы попробовать следующее.

awk 'match($0,/elapsed time:[0-9]+/){print substr($0,RSTART+13,RLENGTH-13)}' Input_file

2-е решение: Используя разделители полей, попробуйте:

awk -F'elapsed time:|ms' '$2{print $2}' Input_file

Вывод будет следующим.

649
17287
2 голосов
/ 18 марта 2020

Вы можете использовать:

grep -o 'elapsed time:[0-9]*' file | grep -o '[0-9]*'

Или, если ваш grep поддерживает Perl -совместимые регулярные выражения (PCRE):

grep -Po 'elapsed time:\K[0-9]+' file
1 голос
/ 19 марта 2020

Обычно для этих задач предпочитается sed.

Вы можете использовать:

sed -n 's/.* elapsed time:\([0-9]*\) ms.*/\1/p' file

649
17287
...