Как использовать ИЛИ в индексе подстроки с помощью awk

Эта проблема была актуальна и для меня. Что самое интересное, -когда я закрыл сначала вручную пользовательскую сессию, а затем выключил систему, все прошло гладко, без каких-либо задержек. Сегодня я посвятил некоторое время решению проблемы и вот некоторые результаты. Проблема возникает из-за того, что при выключении система ожидает чего-то, что, по ее мнению, должно произойти. Само дело индивидуально для каждого отдельного случая. В моем случае было даже две проблемы, одну из которых я нашел. Система искала несуществующий жесткий диск. Как же так? Потому что я экспериментировал с некоторыми другими версиями Linux и выбрал для всех версий одно и то же дисковое устройство в качестве подкачки. При установке второго линукса изменился UUID устройства, но в системных файлах первого линукса он остался без изменений. Но, повторюсь, -это была моя проблема, у вас может быть совсем не так. После того, как я исправил вышеуказанную проблему, у меня осталась еще одна. Я потерял надежду и просто поддался искушению решить проблему грубой силой. Я изменил в файлах /etc/systemd/user.confи /etc/systemd/system.confпараметр DefaultTimeoutStopSecс 90 secondsна 5 seconds. Не забудьте раскомментировать строку (, чтобы убрать знак #в начале строки с параметромDefaultTimeoutStopSec).

Теперь все работает нормально, система очень быстро выключается.

2
09.01.2020, 13:02
1 ответ

Это возможно с awk, но синтаксис REGEXP работает несколько иначе, чем логические операторы в стиле C-. Предполагая, что вы хотите извлечь IP-адрес во всех упомянутых вами случаях, должно работать следующее:

awk '{if (match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) print(v[2])}' logfile.txt

При этом используется функция matchиз awkдля поиска строки TCP, или UDP, или ICMP, за которой следует пробел, а затем IPv4 (, т.е. 15 символов, состоящих из цифр 0-9. ] или период .), и извлекает фактическое значение последней части регулярного выражения (, которое является частью -, сгруппированной в круглых скобках ), и сохраняет его во внутренней переменной массива awkv.

Если такое совпадение найдено, выводится v[2], которое является фактическим значением второго (...)сгруппированного подвыражения -(, первое из которых является группой ИЛИ -для протоколов ). Обратите внимание, что для этого использования функции match()требуется GNU Awk!

Обратите внимание, что, поскольку это простой оператор действия, в котором выполняется только одна операция, если выполняется условие (вызов match(), возвращающий не -ноль ), его также можно было бы написать на обычный "<condition> { <actions> }" -Синтаксис awk, т.е.

awk 'match($0,/{(TCP|UDP|ICMP)} ([[:digit:]:.]{15})/,v)) {print v[2]}' logfile.txt
4
27.01.2020, 21:57

Теги

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