2011-11-07 174 views
0

我想弄清楚如何解析一組包含原始日誌數據(crontab -l的結果)的文件並將這些數據轉換爲CSV文件。文件中的條目如下所示:解析文本文件並生成CSV

10,25,40,55 * * * * /some/cron/here > /dev/null 2>&1 
30 */4 * * * /some/cron/here 

依此類推。

我想他們進入這個格式的CSV文件:

Cronjob | # of Servers | Every minute | Every hour | Every day | Every week | Every month 
----------------------------------------------------------------------------------------- 
CronHere| 10 | N | N | Y | Y | Y 
CronHere| 8 | Y | N | N | Y | Y 

等。

任何人都可以給我一些例子,說明我會如何去做這件事嗎?

+0

請注意,您的問題包含一個矛盾的條款。 CSV文件包含逗號分隔值(CSV)。你的值有不同的分隔符。 – MetaEd

+0

@MetaEd:輸入是'crontab -l'列表,所需的輸出是具有指定格式的CSV文件,這裏沒有矛盾。 –

+0

@ muistooshort:他說輸出文件不應該被稱爲CSV,因爲它使用管道而不是逗號作爲分隔符。迂腐,是的,即使大多數人會看到用不同的分隔符分隔的CSV文件與使用逗號分隔符的CSV文件完全相同。 – CanSpice

回答

0

以下是我如何完成這項任務,感謝ruby。

#!/usr/bin/ruby 

crons = [] 
counts = [] 
cparts = [] 
basedir = "/logdirectory" 
def YorN(part) 
    if part == "*" 
    "N" 
    else 
    "Y" 
    end 
end 
Dir.new(basedir).entries.each do |logfile| 
    unless File.directory? logfile 
    if logfile.split('.')[1] == 'log' 
     file = File.new(logfile, "r") 
     while (line = file.gets) 
     parts = line.split(' ') 
     if parts[5,parts.length-5] 
      cmd = parts[5,parts.length-5].join(' ') 
      idx = crons.index(cmd) 
      if idx 
      counts[idx] += 1 
      else 
      crons << cmd 
      idx = crons.index(cmd) 
      counts[idx] = 1 
      cparts[idx] = parts[0,5] # an Array containing another Array ! 
      end 
     else 
      puts "Error on: #{line} in file #{logfile}" 
     end 
     end 
     file.close 
    end 
    end 
end 
# OUTPUT results 
puts "# Servers Min Hour DOM Month DOW Cronjob" 
crons.each do |c| 
    idx = crons.index(c) 
    puts "#{counts[idx]} #{YorN(cparts[idx][0])} #{YorN(cparts[idx][1])} #{YorN(cparts[idx][2])} #{YorN(cparts[idx][3])} #{YorN(cparts[idx][4])} #{crons[idx]}" 
end 
1

您可以分析用Perl的正則表達式這些文件,整理數據,並使用Text::CSV

0

東西保存輸出這樣會讓你開始:

#!/usr/bin/env perl 
use strict; 
use warnings; 
while (<>) { 
    chomp; 
    my @line = split q(), $_, 6; 
    print join q(|), $line[5], @line[0..4], "\n"; 
} 

至於枚舉服務器的數量,其任務發生時,您需要更好地定義如何區分任務---僅按名稱或完全匹配所有參數。一旦你這樣做了,你可以使用散列進行計數。