我正在编写一个Shell脚本,该脚本关闭一些服务并尝试通过使用以下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
答案 0 :(得分:1)
使用/../
进行模式匹配的语法不适用于正则表达式中的变量。您需要为此使用~
语法。
awk -v port_no=10080 '$0 ~ "[m]ilk.*port="port_no{print $2}'
如果您仔细注意正则表达式,则~
的rhs上的正则表达式字符串在双引号".."
下,但变量名中包含的端口号不应包含在引号中,例如扩展发生。
答案 1 :(得分:1)
使用pgrep
可以轻松完成此任务:
$ pgrep -f '[m]ilk.*port=10080'
有关详情,请查看man pgrep
。