Как печатать только вхождения шаблона в sed?

Вариант ответа @l0b0:

dmesg --follow | awk '
   /BUG: workqueue lockup/  { system ("killall someprocessname") ; rem="done at each occurrence. You could add further things, like print to a logfile, etc.,"
        }'

Это давайте сделаем цикл, который имеет некоторые преимущества:

  • это будет работать до тех пор, пока этот процесс не умрет.
  • Он также не вызывает более 1 killallпри появлении строки поиска «ОШИБКА :workqueue lockup», что улучшает другой ответ.

Для проверки :Вы можете поместить это в скрипт с именем thescriptи выполнить nohup thescript &, чтобы thescriptпродолжал работать даже после выхода из сеанса.

Как только вы убедитесь, что он работает, завершите его, а затем вы сможете (вместо того, чтобы запускать его каждый раз в оболочке с помощью nohup), преобразовать его в daemon script, который затем можно запустить на текущем уровне выполнения..

т.е. :используя другой сценарий в качестве модели (вам необходимо иметь по крайней мере разделы запуска, остановки и состояния ), вы можете соответствующим образом изменить thescript, а затем поместить его в /etc/rc.d/init.d, и иметь символическую ссылку на него с именем Sxxthescriptпод соответствующим (s )/etc/rc.d/rcN, Nявляется числом для вашего обычного уровня запуска (см. верхние строки who -a, чтобы узнать текущий уровень запуска -). И также иметь соответствующие символические ссылки Kxxthescriptна каждом (или почти на каждом )уровне выполнения, чтобы скрипт надлежащим образом уничтожался при переключении уровней выполнения.

Или выполните «соответствующие действия», чтобы запустить/остановить его через systemd или любую аналогичную систему, используемую в вашем дистрибутиве.

0
21.04.2020, 20:45
1 ответ

Чтобы получить третье;-поле с разделителями из вашего файла, используйтеcut:

$ cut -d ';' -f 3 file
AS 3N123N8j a5njs

Чтобы получить отображаемое поле, вырежьте 6-е поле:

$ cut -d ';' -f 6 file
A9S

Вы также можете использовать awkдля этого с awk -F ';' '{ print $6 }' file.

С sedвы не можете использовать флаг /nдля команды s(, где nявляется цифрой ), потому что вам нужно заменить всю строку . Это включает фактически соответствие всей строке, а не только конкретному полю.

Таким образом, одним из способов получить шестое;-поле с разделителями было бы использование

$ sed 's/^\([^;]*;\)\{5\}\([^;]*\);.*/\2/' file
A9S

или, если ваш sedподдерживает расширенное регулярное выражение с -E,

$ sed -E 's/^([^;]*;){5}([^;]*);.*/\2/' file
A9S

То есть сопоставьте пять полей, где каждое поле соответствует [^;]+;(, включает завершающий ;для каждого поля ), а затем искомое поле, за которым следует остальная часть строки. Замените все это полем, которое нам нужно.

Короче говоря, вам лучше использовать cutили awkдля этой задачи.

2
19.03.2021, 02:27

Теги

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