#ruby #linux #perl #parsing #csv
#ruby #linux #perl #разбор #csv
Вопрос:
Я пытаюсь выяснить, как я мог бы проанализировать группу файлов, содержащих необработанные данные журнала (результаты crontab -l), и преобразовать эти данные в файл CSV. Записи в файлах выглядят так:
10,25,40,55 * * * * /some/cron/here > /dev/null 2>amp;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
И так далее.
Кто-нибудь может привести мне несколько примеров того, как я мог бы это сделать?
Комментарии:
1. Обратите внимание, что ваш вопрос содержит противоречие в терминах. Файл CSV содержит значения, разделенные запятыми (CSV). У ваших значений другой разделитель.
2. @MetaEd: Входными данными являются
crontab -l
списки, желаемый результат — файл CSV с указанным форматом, здесь нет противоречий.3. @muistoosh: Он говорит, что выходной файл не должен называться CSV, потому что он использует каналы вместо запятых в качестве разделителей. Педантично, да, даже если большинство людей увидят, что CSV с другим разделителем анализируется и записывается точно так же, как CSV с разделителями-запятыми.
4. @CanSpice: Я взял «таблицу каналов» в качестве описания формата, но я мог ошибаться (это было бы не в первый раз).
5. Извините, если есть какая-либо путаница. По сути, мне просто нужно проанализировать данные, чтобы получить их в формате, указанном в моем исходном сообщении, чтобы я мог импортировать их в электронную таблицу. Я пытаюсь выяснить, как это сделать в ruby, но пока не очень повезло.
Ответ №1:
Вы можете проанализировать эти файлы с помощью регулярных выражений Perl, упорядочить данные и сохранить выходные данные с помощью Text::CSV
Ответ №2:
Что-то вроде этого поможет вам начать:
#!/usr/bin/env perl
use strict;
use warnings;
while (<>) {
chomp;
my @line = split q( ), $_, 6;
print join q(|), $line[5], @line[0..4], "n";
}
Что касается перечисления количества серверов, для которых выполняется задача, вам нужно лучше определить, как вы различаете задачи — только по имени или путем полного сопоставления всех аргументов. Как только вы это сделаете, вы можете использовать хэш для подсчета.
Ответ №3:
Вот как я закончил выполнение этой задачи, благодаря 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