Как вставить аргумент в сценарии awk? - PullRequest
1 голос
/ 14 июня 2019

Я пишу скрипт оболочки, который закрывает некоторые службы, и пытаюсь получить его pid, используя следующий скрипт awk. Однако этот скрипт awk не может получить pid. Что с этим не так?

ps -ef | awk -v port_no=10080 '/[m]ilk.*port=port_no/{print $2}'

Результат ps -ef выглядит следующим образом:

username   13155 27705  0 16:06 pts/2    00:00:00 /home/username/.rbenv/versions/2.3.6/bin/ruby /home/username/.rbenv/versions/2.3.6/bin/milk web --no-browser --host=example.com --port=10080

Этот процесс также работает с другим аргументом порта, поэтому я хочу убить процесс, работающий только на port=10080.

Сценарий awk, приведенный ниже, работает нормально, но когда я указываю порт без использования awk -v, как указано выше, он не работает хорошо.

ps -ef | awk '/[m]ilk.*port=10080/{print $2}'

awk версия: GNU Awk 4.0.2

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Эту задачу легко выполнить, используя pgrep:

$ pgrep -f '[m]ilk.*port=10080'

Подробнее см. man pgrep.

1 голос
/ 14 июня 2019

Синтаксис для сопоставления с шаблоном с /../ не работает с переменными в регулярном выражении.Вам нужно использовать синтаксис ~ для него.

awk -v port_no=10080 '$0 ~ "[m]ilk.*port="port_no{print $2}'

Если вы внимательно обратите внимание на регулярное выражение, строка регулярного выражения в правой части ~ будет заключена в двойные кавычки "..", за исключением переменнойимя, содержащее номер порта, который не должен быть в кавычках, чтобы расширение могло произойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...