【问题标题】:Text parse using awk or sed in UNIX. Extract a port number在 UNIX 中使用 awk 或 sed 进行文本解析。提取端口号
【发布时间】:2012-07-11 09:45:37
【问题描述】:

我必须从进程状态 (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 命令。

【问题讨论】:

    标签: bash unix awk


    【解决方案1】:

    这样就可以了:

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

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

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

    9999 -xcom.xx.management.xxxremote.ssl
    

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

    9999
    

    【讨论】:

    • 不需要两个 AWK。使用split()-F '[ =]'。如果参数的顺序不同并且$2 不是正确的呢?
    • @DennisWilliamson 对于-F '[ =]',我仍然需要指定字段来获取数字,在本例中为$3。我使用了 2 个 awk,因为我逐步构建了答案,反映了习惯,也许表明我还有更多关于 awk 的知识供我学习 :)
    • 如果我拉取的文本选择量大得多,如何使用awk命令根据“xremote.port="拉取端口
    • OP 可能意味着你需要一个选择器awk '/xremote.port=/{...}'
    • @user1518487 如果您的问题是关于如何查找包含 xremote.port= 的行,那么 DennisWilliamson 上面发布的内容是在 awk 中查找输入中特定行的标准方法(感谢 Dennis)和您可以将其与第一个 awk 命令放在一起。从原始帖子中,我假设这些行已经被过滤为只包含那些字符串 - 如果没有,那么这将捕获它们。
    【解决方案2】:
    ps -ef | sed -n '/blahblahblah/s/^.*port=\([[:digit:]]\+) .*/\1/p'
    

    【讨论】:

      【解决方案3】:

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

      哦,好吧……

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

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

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

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

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

      【讨论】:

      • 其实我可以用sed。这是我运行 sed 命令时的输出:'9999 ([^' 知道为什么我最后会得到那些额外的字符吗?
      • 我刚刚运行了这个:echo "xxremote -xcom.xx.management.xremote.port=9999 -xcom.xx.management.xxxremote.ssl=false" | sed -n 's/^.*port=\([^ ]*\).*/\1/p' 并得到了9999,最后什么都没有。你对丹尼斯威廉的回答有同样的问题吗?我们基本上有类似的sed 声明。他使用的是 Gnu 的 sed,它允许一些巧妙的技巧,而我使用了 Solaris 的那个。
      猜你喜欢
      • 2011-04-07
      • 2020-09-26
      • 2015-01-12
      • 2018-03-31
      • 2021-07-19
      • 2013-03-03
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多