У меня есть огромный файл на моем сервере 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