awk, чтобы вырезать часть поля и все равно напечатать всю строку

awk, чтобы вырезать часть поля и все равно напечатать всю строку

У меня есть такая строка:

08:30:02.480507 IP 192.168.100.150.65119 > 192.168.100.151:53 59865 [1au] A? click.em.redbox.com. (48)

Мне нужно вырезать «.480507» из временной метки, чтобы строка выглядела так:

08:30:02 IP 192.168.100.150.65119 > 192.168.100.151.53: 59865 [1au] A? click.em.redbox.com. (48)

Я повозился с несколькими awk и cut операторами, но безрезультатно. Я хотел бы найти awk one liner, но sed может быть лучшим решением для этого. Я просто недостаточно знаю ни о том, ни о другом, когда дело доходит до резки таким образом.

ПРИМЕЧАНИЕ: Это пример, и часть временной метки, которую мне нужно вырезать, не будет одинаковой, поскольку мне нужно выполнить это действие в нескольких строках с разными временными метками.

решение1

Вероятно awk, самый простой способ — выполнить замену регулярного выражения в первом поле, разделенном пробелами, заменив все от точки до конца поля:

awk '{sub(/\..*/,"",$1)}1' somefile

решение2

Я бы использовал awk

awk --posix '{ gsub(/\.[[:digit:]]{6}/, "", $1); print }' filename

Будет выбрано первое поле (разделенное пробелом) и выполнен поиск по символу ., за которым следуют 6 цифр, после чего поле будет очищено.

решение3

с ГНУsed

sed -r 's/^([^.]+)\.[0-9]+ /\1 /' filename
  • ^([^.]+)захватить начальную строку до первой точки
  • \.[0-9]+сопоставить символ точки, за которым следует более 1 цифры

и если количество символов соответствует указанному в примере,

sed -r 's/^(.{8}).{7} /\1 /' filename

Связанный контент