用ruby替换文件中的字符串

时间:2011-04-16 22:07:54

标签: ruby regex loops file-io

我正在尝试创建一个读取ps并输出pidcommandline的程序,但如果该进程是由内核启动的,则应该返回一个空行。

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 

2 个答案:

答案 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(/\[[^\[\]]*\]/, '')