2

我必须从进程状态(ps)命令中提取某个端口号,但我不太确定如何获取它。

例如,如果我有这一行(ps -ef | grep "blahblahblah"):

xxremote -xcom.xx.management.xremote.port=9999 -xcom.xx.management.xxxremote.ssl=false 

如何提取数字“9999”?注意:这是很长的一行的一部分,我不能使用例如 awk 来计算“=”符号后面的字段数。= 符号的数量会改变。

我尝试使用 cut 命令,但我只知道如何将它与单字符分隔符一起使用,这不是我需要的。我在想也许 awk 或 sed 可以解决问题?我对他们不熟悉。非常感谢你的帮助

ps -ef | grep "blahblahblah" " | awk .... (或 sed)

更新:澄清需要从一行长文本中提取端口号,并且不需要使用 awk 命令。

4

3 回答 3

3
ps -ef | sed -n '/blahblahblah/s/^.*port=\([[:digit:]]\+) .*/\1/p'
于 2012-07-11T17:43:29.087 回答
1

这将做到:

更新为仅过滤包含数据的行,xremote.port=以防数据尚未过滤)

ps -elf | awk -F= '/xremote.port=/{print $2}' | awk '{print $1}'

第一个awk命令将行拆分,=导致第二个字段为:

9999 -xcom.xx.management.xxxremote.ssl

第二个awk命令获取第一个字段,即您的号码。

9999
于 2012-07-11T17:43:11.310 回答
1

必须使用 awk 吗?sed会是更好的选择...

那好吧...

ps -ef | awk '/blahblahblah/ {
    sub(".*port=", "")
    sub(" .*", "")
    print $0
}'

awk 中的命令用字符串sub(a, b)替换正则表达式(在我的情况下恰好是空白。它需要 $0 代表返回的行。ab

正如我所说,sed会更简单:

ps -ef | sed -n '/blahblahblah/s/^.*port=\([^ ]*\).*/\1/p'

请注意,我sed用来选择行blahblahblah并进行替换。

于 2012-07-11T19:39:45.740 回答