2011-11-07 7 views
0

J'essaie de comprendre comment j'exécuterais l'analyse d'un groupe de fichiers contenant des données de journal brutes (résultats de crontab -l) et convertirais ces données dans un fichier CSV. Les entrées dans les fichiers sont comme suit:Analyse de fichiers texte et génération d'un fichier CSV

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

Et ainsi de suite.

Je veux les faire entrer dans ce format dans un fichier 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 

Et ainsi de suite.

Quelqu'un peut-il me donner quelques exemples de comment je pourrais y arriver?

+0

Notez que votre question contient une contradiction dans les termes. Un fichier CSV contient des valeurs séparées par des virgules (CSV). Vos valeurs ont un séparateur différent. – MetaEd

+0

@MetaEd: Les entrées sont des listes 'crontab -l', la sortie désirée est un fichier CSV avec le format spécifié, pas de contradictions ici. –

+0

@muistooshort: Il dit que le fichier de sortie ne devrait pas s'appeler CSV parce qu'il utilise des tuyaux plutôt que des virgules comme délimiteurs. Pédant, oui, même si la plupart des gens verraient qu'un CSV avec un délimiteur différent est analysé et écrit exactement la même chose qu'un CSV avec des délimiteurs de virgules. – CanSpice

Répondre

0

Voici comment j'ai fini par accomplir cette tâche, grâce à 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

Vous pouvez analyser ces fichiers avec Perl regexps, organiser des données et enregistrer la sortie en utilisant Text::CSV

0

Quelque chose comme cela vous aider à démarrer:

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

Quant à calculer le nombre de serveurs pour lesquels une tâche se produit, vous devez mieux définir la façon dont vous différenciez les tâches --- par nom seulement, ou en faisant correspondre tous les arguments. Une fois que vous faites cela, vous pouvez utiliser un hachage pour compter.