无法使用Regex定位字符串的确切部分

时间:2014-04-26 16:57:28

标签: ruby regex bash

我的示例输入看起来像这样。

1727699761 24929 0.0  0.0 103164 2688 ?        S    12:23   0:00 sshd: driscollj1@notty
1727699761 24930 0.0  0.0 28896  2344 ?        Ss   12:23   0:00 /usr/lib/openssh/sftp-server
1727699761 24940 0.0  0.0 103188 2644 ?        S    12:24   0:00 sshd: driscollj1@pts/9
1727699761 24941 0.0  0.2 37800  8996 pts/9    Ss   12:24   0:00 -bash
1727699761 25140 0.0  0.0 31200  2268 pts/9    R+   12:38   0:00 ps -U driscollj1 -u driscoll

我需要的只是命令部分,在这种情况下,

sshd: driscollj1@notty
/usr/lib/openssh/sftp-server
sshd: driscollj1@pts/9
-bash
ps -U driscollj1 -u driscoll

我在Ruby工作,我目前正在使用的正则表达式如下所示。

userProcess = `ps h -U driscollj1 -u driscollj1 u`.scan(/:\d\d (.*)/)

但是我正在捕捉我真正想要的部分之前的时间,我不知道如何在没有时间的情况下瞄准我想要的东西。任何帮助将不胜感激。谢谢。

5 个答案:

答案 0 :(得分:3)

你可以这样做:

sampletext.split(/\n/).each do |line|
    puts line.split(/\s+/, 11).last
end

答案 1 :(得分:2)

您可以通过cut管道内容,只获取您想要的字段:

ps $args | tr -s ' ' | cut -d' ' -f11

实际命令位于第11个字段中。

答案 2 :(得分:2)

我不知道Ruby,但是我用Unix做了很多文本处理,我解决这个问题的方法是使用分隔符将字符串拆分成多个元素,然后放弃前9个元素,然后连接剩下的。

通过快速在线查找,这似乎是在Ruby中实现解决方案的一种方式:

str = `command`
# something to iterate line by line in str...
cur_line.split(" ").drop(9).join(' ')

希望这有帮助!

答案 3 :(得分:1)

我的第一个想法是将ps命令更改为仅返回命令部分(-o command可能?)。但是,如果你不能这样做,这个扫描应该工作。它将匹配" 0:00"但不是" 12:23"因为在冒号(和空格)之前只需要一个数字。

.scan(/\s\d:\d\d (.*)/)

答案 4 :(得分:0)

如果您将格式化的字符串格式化为表格,那么计算字符将比使用正则表达式更好。它将是健壮和灵活的。鉴于你的字符串:

s = <<_
1727699761 24929 0.0  0.0 103164 2688 ?        S    12:23   0:00 sshd: driscollj1@notty
1727699761 24930 0.0  0.0 28896  2344 ?        Ss   12:23   0:00 /usr/lib/openssh/sftp-server
1727699761 24940 0.0  0.0 103188 2644 ?        S    12:24   0:00 sshd: driscollj1@pts/9
1727699761 24941 0.0  0.2 37800  8996 pts/9    Ss   12:24   0:00 -bash
1727699761 25140 0.0  0.0 31200  2268 pts/9    R+   12:38   0:00 ps -U driscollj1 -u driscoll
_

这个简单的命令:

s.each_line.map{|l| l[65...-1]}

会给:

[
  "sshd: driscollj1@notty",
  "/usr/lib/openssh/sftp-server",
  "sshd: driscollj1@pts/9",
  "-bash",
  "ps -U driscollj1 -u driscoll"
]