дескриптор ingress зарезервирован (со значением ffff:)и отделен от дескриптора root , поэтому его необходимо удалить отдельно (аналогичным образом, он был добавлен отдельно от корневого дескриптора ). Чтобы удалить его (и, как следствие, все фильтры под ним ), просто введите эту команду:
tc qdisc del dev eth ingress
Используйте потоковый редактор sed
для изменения текстового файла:
sed 's/\./-/;s//-/;s// /;s// /;s/: /,/;s/ -/,/;s/\[//;s/]//' xms.log > resultlog.txt
Скрипт содержит только s
замещающих команд вида s/pattern/replacement/
, разделенных точкой с запятой. s/\./-/
заменяет первую точку тире. Вы также хотите заменить следующую точку, поэтому вам не нужно повторять шаблон, а просто оставьте шаблон пустым и напишите s//-/
. Точно так же вы делаете все остальные необходимые замены. Если символы со специальным значением в синтаксисе регулярных выражений должны совпадать, вам нужно экранировать их с помощью обратной косой черты:\.
и \[
.
Более читабельно, вы также можете написать как
sed 's/\./-/
s/\./-/
s/\./ /
s/\./ /
s/: /,/
s/ -/,/
s/\[//
s/]//' xms.log > resultlog.txt
Чтобы обработать текст из сценария оболочки, вы должны вызвать инструмент обработки текста, такой как sed
, awk
или perl
, для обработки всего ввода, а не несколько вызовов неадекватных инструментов, таких как read
или echo
в каждой строке вывода.
Здесь я бы использовал регулярные выражения для сопоставления ввода, извлечения соответствующих полей и переформатирования по вашему усмотрению. perl
наиболее подходит для сопоставления регулярных выражений:
perl -lpe '
$_ = "$1-$2-$3 $4 $5,$6," if
m{^\[(\d\d\d\d)\.(\d\d)\.(\d\d)\.(\d\d:\d\d:\d\d)\.(\d\d\d)\]: (\w+)}
' < input.txt > output.txt
Где в синтаксисе регулярных выражений:
^
соответствует началу темы (строк здесь)\[
соответствует символу [
. \d
соответствует десятичной цифре¹. \.
соответствует буквальному символу .
. \w+
соответствует одному или нескольким w
ордерным символам (здесь буквы¹ или знак подчеркивания )как можно большему количеству.
и :
совпадают соответственно. (...)
используется для захвата того, что совпадает в $1
, $2
... Это переформатирует строки, соответствующие шаблону, и оставит другие (, если таковые имеются ), нетронутыми.
¹ ограничено символами ASCII (0123456789 ), так как мы не указали perl
для работы в режиме Unicode и в соответствии с кодировкой локали, поэтому он не будет включать другие десятичные цифры, такие как . То же самое касается букв, соответствующих
\w
.