Разбор текстовых файлов и генерация CSV - PullRequest
0 голосов
/ 08 ноября 2011

Я пытаюсь выяснить, как мне выполнить анализ группы файлов, содержащих необработанные данные журнала (результаты crontab -l), и преобразовать эти данные в файл 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

И так далее.

Может ли кто-нибудь дать мне несколько примеров того, как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 08 ноября 2011

Вы можете анализировать эти файлы с помощью регулярных выражений Perl, упорядочивать данные и сохранять выходные данные, используя Text :: CSV

0 голосов
/ 09 ноября 2011

Вот как я закончил эту задачу, благодаря 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
0 голосов
/ 08 ноября 2011

Примерно так вы могли бы начать:

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

Что касается перечисления количества серверов, для которых выполняется задача, вам нужно лучше определить, как вы дифференцируете задачи - только по имени, илиполностью сопоставляя все аргументы.Как только вы это сделаете, вы можете использовать хеш для подсчета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...