如何按空格或制表符分割命令输出?

时间:2014-03-24 15:08:08

标签: ruby arrays split grep

我试图这样做:

input = %x{netstat -ano | grep ^:80}
input.gsub(/\s+\t/m,' ').strip.split(" ")
puts input[4]

但是我得到了C的输出,我预期<pid> netstat命令的示例输出是:

  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       1800
  TCP    0.0.0.0:8081           0.0.0.0:0              LISTENING       8780
  TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       5540

此外,我不确定如何使grep完全匹配 80(或我指定的任何其他端口)。

2 个答案:

答案 0 :(得分:3)

没有参数的普通拆分已经可以做你想要的了:

input.lines.map do |line|
  proto, local, foreign, state, pid = line.split
  pid
end
#=> ["1800", "8780", "5540"]

你的代码有几个我想指出的问题,也许你可以从中学到一些东西:

  • 您使用的gsubstrip从未实际更改input。您可能希望使用gsub!strip!(mutators)来实现此目的。 split但是没有mutator等价物,因为它的返回值是一个数组,而不是一个字符串。
  • input[4]只是为您提供了input字符串
  • 的第四个字符

答案 1 :(得分:1)

您可以通过匹配字边界来匹配80而不是8080

grep '\<80\>'

但是如果你正在使用Ruby,为什么还要使用grep呢?只需使用正则表达式! Ruby的语法略有不同:

/\b80\b/