получить часть строки после grep
у меня есть огромный файл на моем сервере unix, из которого мне нужно извлечь определенные части
формат строки
aNumber timestamp commandInformation
Я использую команду
grep LATENCY file.log | grep CMDTYPE=NEW
отфильтровать определенные строки, которые я хочу. Я только хочу, чтобы метка времени детали и последние 9 символов из строки были возвращены, а не полная строка. Как я могу это сделать?
6 ответов
Я собираюсь утверждать, что 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