我的示例输入看起来像这样。
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 (.*)/)
但是我正在捕捉我真正想要的部分之前的时间,我不知道如何在没有时间的情况下瞄准我想要的东西。任何帮助将不胜感激。谢谢。
答案 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"
]