получить часть строки после grep

у меня есть огромный файл на моем сервере unix, из которого мне нужно извлечь определенные части

формат строки

aNumber timestamp commandInformation

Я использую команду

grep LATENCY file.log | grep CMDTYPE=NEW

отфильтровать определенные строки, которые я хочу. Я только хочу, чтобы метка времени детали и последние 9 символов из строки были возвращены, а не полная строка. Как я могу это сделать?

6 ответов


использовать awk(1):

awk ' { print " "substr(,length()-8) }'

cut выполните задание

grep something somewhere | grep againsomething | cut -f2 -d' '

Я собираюсь утверждать, что perl-лучший выбор, чем awk здесь:

perl -ne 'next if ! (/LATENCY|CMDTYPE=NEW/ && /^\d+.*\s+(.*)\s+.*(.{9})$/); print " \n";'

регулярное выражение является более надежным, позволяя опустить строки, которые не соответствуют более строгому шаблону. Сценарии awk выше будут видеть переполнения в вызове substr (я честно не знаю, что отрицательные индексы делают в awk), если вы подаете его сломанный вход, как частичные строки из конца журнала.


можно использовать awk следующим образом:

grep LATENCY file.log | grep CMDTYPE=NEW | awk '{print ,substr(,length()-9,9)}'

нет необходимости использовать grep, awk может сделать это:

awk '/LATENCY/ && /CMDTYPE=NEW/ {print  " " substr(, length()-8)}' file

вы можете сделать все с sed самостоятельно:

$ echo "234432 12:44:22.432095 LATENCY blah CMDTYPE=NEW foo bar 123456789" | \
sed -n '/LATENCY/!b;/CMDTYPE=NEW/!b;s/^.\+\s\+\([0-9:.]\+\)\s.\+\(.........\)$/ /; p'
12:44:22.432095 123456789