2011-11-07 13 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とまったく同じように書かれていても、Pedanticです。 – CanSpice

答えて

0

ここで私はこのタスクを達成しました。ルビーのおかげです。

#!/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"; 
} 

をタスクがどのように区別されるかを、名前だけで、またはすべての引数を完全に一致させることによって、よりよく定義する必要があります。いったんそれをしたら、カウントのためにハッシュを使うことができます。

関連する問題