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

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

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

aNumber timestamp commandInformation

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

grep LATENCY file.log | grep CMDTYPE=NEW

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

Ответ 1

Используйте awk(1):

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Вы можете делать все с помощью 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.\+\(.........\)$/\1 \2/; p'
12:44:22.432095 123456789