我正在尝试创建一个读取ps
并输出pid
和commandline
的程序,但如果该进程是由内核启动的,则应该返回一个空行。
require 'fileutils'
procs=`ps -eo pid,cmd`
o = File.open("proc","w")
f = o.write("proc")
o.close
f_in = File.open('proc', 'r')
f_out = File.open('procs', 'w')
replace = ""
f_in.each do |line|
if line =~ (/\s*\[(\w+)\]\$/)
f_out << "\n"
else
f_out << line
end
end
f_out.write("procs")
f_in.close
f_out.close
FileUtils.mv "procs", ["proc", Time.now.strftime("%Y-%m-%d")].join(".")
ps -eo pid,cmd like:
PID CMD 1 /sbin/init 2 [migration/0] 3 [ksoftirqd/0] 4 [watchdog/0] 5 [events/0] 6 [khelper] 7 [kthread] 8 [xenwatch] 9 [xenbus] 17 [kblockd/0]
我想删除括号中的所有行,但保留PID如下:
PID CMD 1 /sbin/init 2 3 4 5 6 7 8 9 17
答案 0 :(得分:2)
看起来它会这样做:
File.open("proc.#{ Time.now.strftime('%F') }", 'w') do |fo|
fo.puts `ps -eo pid,cmd`.lines.map{ |li| li[ /^([^\[]+)/, 1] }
end
li[ /^([^\[]+)/, 1]
表示“从行的开头捕获不是'[
'的所有内容并将其返回。
它创建了一个名为“proc.2011-04-16”的文件,如下所示:
PID CMD 1 /sbin/init 2 3 4 5 [...] 255 upstart-udev-bridge --daemon 296 rsyslogd -c4 303 dbus-daemon --system --fork 315 udevd --daemon 398 avahi-daemon: running 443 avahi-daemon: chroot helper 493 [...]
File.open('proc.' + Date.today.strftime, 'w') do |fo|
fo.puts `ps -eo pid,cmd`.gsub( /\s+\[.+?\]$/, '')
end
答案 1 :(得分:1)
只做
string.gsub(/\[.*?\]/, '')
或
string.gsub(/\[[^\[\]]*\]/, '')