Заменить строки в файле на ruby - PullRequest
0 голосов
/ 17 апреля 2011

Я пытаюсь создать программу, которая читает 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 вроде:

    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 ]

2 голосов
/ 17 апреля 2011

Похоже, это будет сделано:

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 голос
/ 17 апреля 2011

Просто сделай

string.gsub(/\[.*?\]/, '')

или

string.gsub(/\[[^\[\]]*\]/, '')
...