В файле найти и заменить/изменить несколько строк в строке с помощью сценария оболочки

дескриптор ingress зарезервирован (со значением ffff:)и отделен от дескриптора root , поэтому его необходимо удалить отдельно (аналогичным образом, он был добавлен отдельно от корневого дескриптора ). Чтобы удалить его (и, как следствие, все фильтры под ним ), просто введите эту команду:

tc qdisc del dev eth ingress
2
11.06.2021, 05:09
2 ответа

Используйте потоковый редактор 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
3
28.07.2021, 11:25

Чтобы обработать текст из сценария оболочки, вы должны вызвать инструмент обработки текста, такой как 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.

1
28.07.2021, 11:25

Теги

Похожие вопросы