Как я могу повернуть ужасный вывод в симпатичную, полезную информацию?

Могли Вы удалять следующие правила:

-A OUTPUT -p udp -s 0/0 --sport 1024:65535 -d 0/0 --dport 161:162 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -p udp -s 0/0 --sport 161:162 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

И замените этим, чуть ниже -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT

-A RH-Firewall-1-INPUT -p udp --sport 161:162 -j ACCEPT

Как запуск, давайте использовать это правило и давайте проверим, работает ли оно.

Наконец, мне любопытно..., это связано с PCI, HIPAA или американскими требованиями Правительства?:-)

2
19.05.2012, 00:41
3 ответа

Я использовал бы Perl для этого, или по крайней мере awk.

perl -ne '
    BEGIN {
        print "\"Job Name\", \"Time\", \"Schedule\", \"Machine\", \"Description\", \"Command\", \"\n";
    }
    chomp; s/^\s+//; s/\s+$//;
    if (($_ eq "" || eof) && exists $fields{insert_job}) {
        print "\"", join("\", \"", @fields{qw(insert_job start_times days_of_week machine description command)}), "\"\n";
        delete @fields{qw(insert_job)};
    }
    if (/^([^ :]+): *(.*)/) {$fields{$1} = $2}
'

Объяснения:

  • BEGIN блок выполняется однажды в начале сценария, остальное работает за каждой входной строкой.
  • Строка, которая начинается chomp снимает изоляцию с ведущего и запаздывающего пробела.
  • Первое if строка включает пустые строки (разделители абзацев), если поле insert_job присутствует.
  • delete строка удаляет insert_job поле. Добавьте другие имена полей, которых Вы не хотите выходить за пределы от одного абзаца до следующего.
  • Последнее if строка хранит поля.
1
27.01.2020, 21:57
  • 1
    хм, я не гуру жемчуга, но существует ошибка, когда я пытаюсь накормить тот код обедом: Backslash found where operator expected at -e line 7, near ""\", \", @fields{qw(insert_job start_times days_of_week machine description command)}), "\" . PS perl v5.14.2 –  rush 19.05.2012, 16:52
  • 2
    @Rush Благодарит, я пропустил кавычку. Я минимально протестировал сценарий на этот раз и зафиксировал еще несколько опечаток. –  Gilles 'SO- stop being evil' 19.05.2012, 16:58
  • 3
    я не получаю вывода, когда я выполняю это кроме строки заголовка. Я вставил Ваш сценарий в "parser.pl", замененный perl -ne с #!perl -n, и удаленный одинарные кавычки. Кто-либо может подтвердить, что они действительно получают ожидаемый вывод? –  Joe A 21.05.2012, 06:40
  • 4
    @JoeA Делает это #!/usr/bin/perl -n, и изменение $fields[$1] = $2 кому: $fields{$1} = $2 (Я забыл фиксировать эту опечатку так или иначе, извините). –  Gilles 'SO- stop being evil' 21.05.2012, 10:16

Немного ужасной sed остроты:

sed -n  \
# we divide out incoming text to small parts, 
# each one as you mentioned from /---.*box.*/ to /profile/
'/---.*box.*/,/profile/{
     # inside of each part we do following things:
     # if string matches our pattern we extract 
     # the value and give it some identifier (which you
     # can see is "ij", "st" and so on)
     # and we copy that value with identifier to hold buffer,
     # but we don't replace the content of hold buffer
     # we just append (capital H) new var to it
     /insert_job/{s/[^:]*: /ij"/;s/ .*/",/;H};
     /start_times/{s/[^:]*: /st/;s/$/,/;H};
     /days_of_week/{s/[^:]*: /dw"/;s/$/",/;H};
     /machine/{s/[^:]*: /ma"/;s/$/",/;H};
     /description/{s/[^:]*: /de/;s/$/,/;H};
     /command/{s/[^:]*: /co"/;s/$/",/;H};
     # when line matches next pattern (profile)
     # we think that it is the end of our part,
     # therefore we delete the whole line (s/.*//;)
     # and exchange the pattern and hold buffers (x;)
     # so now in pattern buffer we have several strings with all needed variables
     # but all of them are in pattern space, therefore we can remove
     # all newlines symbols (s/\n//g;). so it is just one string 
     # with a list of variables
     # and we just need to move to the order we want,
     # so in this section we do it with several s commands.
     # after that we print the result (p)
     /profile/{s/.*//;x;s/\n//g;s/ij\("[^"]*box[^"]*",\)/\1/;
          s/,\(.*\)st\("[^"]*",\)\(.*ij"[^"]*",\)/,\2\1\3\2/;
          s/\([^,]*,[^,]*,\)\(.*\)dw\("[^"]*",\)\(.*ij"[^"]*",[^,]*,\)/\1\3\2\4\3/;
          s/de/"",/;s/ij/""\n/;
          s/\(\n[^,]*,[^,]*,[^,]*,\)\(.*\)ma\("[^"]*",\)/\1\3\2/;
          s/co\("[^"]*"\),\(.*\)/\2\1/;s/de//;p}
     };
     # the last command just adds table caption and nothing more.
     # note: if you want to add some new commands,
     # add them before this one
     1i"Job Name", "Time", "Schedule", "Machine", "Description", "Command"'

Я записал это, поскольку полевой порядок может варьироваться по различным полям, но профиль всегда является последним. В случае, если порядок всегда является тем же, это было бы немного легче.

4
27.01.2020, 21:57
  • 1
    , Ничего себе. Давайте посмотрим, могу ли я объяснить часть этого. sed -n '/---.*box.*/,/profile/{ тихие sed. действительно работают от "/--------поле------/" для "представления". /insert_job/{s/[^:]*: /ij"/;s/ .*/",/;H}; на строке, которая содержит "insert_job", замените все несимволы двоеточия до первого ": "с 'ij"', и замена что-нибудь после пространства с'" ', и остаются на новой линии (как, в переменной?). –  Joe A 19.05.2012, 10:13
  • 2
    я добавил комментарии к своему ответу. –  rush 19.05.2012, 10:55
  • 3
    я добавил комментарии к своему ответу. –  rush 19.05.2012, 10:55

Используя язык TXR:

@(bind inherit-time nil)
@(bind inherit-sched nil)
@(collect)
@  (all)
@indent/* ---------- @jobname ---------- */
@  (and)
@/ *//* ---------- @nil#@type#@nil ---------- */
@  (end)

@  (bind is-indented @(> (length indent) 0))
@  (gather :vars ((time "") (sched "") (mach "") (descr "") (cmd "")))
@/ */start_times: "@*time"
@/ */days_of_week: @sched
@/ */machine: @mach
@/ */description: "@*descr"
@/ */command: @cmd
@  (until)

@  (end)
@  (cases)
@    (bind type "box")
@    (set (inherit-time inherit-sched) (time sched))
@  (or)
@    (bind type "cmd")
@    (bind is-indented t)
@    (set (time sched) (inherit-time inherit-sched))
@  (end)
@(end)
@(output)
"Job Name", "Time", "Schedule", "Machine", "Description", "Command"
@  (repeat)
"@jobname", "@time", "@sched", "@mach", "@descr", "@cmd"
@  (end)
@(end)

Это - очень наивный подход. От каждой записи мы извлекаем все поля, которыми мы интересуемся, заменяя пробелами, которые не присутствуют (значения по умолчанию в :vars аргумент @(gather)). Мы обращаем внимание на тип задания (box или cmd), и добавление отступа. Когда мы видим поле, мы копируем несколько свойств поля в глобальные переменные; и когда мы видим cmd, который располагается с отступом, он копирует эти свойства. (Мы предполагаем вслепую, что они были настроены более ранним box.)

Выполненный:

$ txr jobs.txr jobs
"Job Name", "Time", "Schedule", "Machine", "Description", "Command"
"TA#box#AbC_p", "16:15", "su", "", "Job AbC that runs at 4:15PM on Sundays, and should end before 5:30PM", ""
"TA#cmd#EfGJob_p", "16:15", "su", "vm_machine1", "job EfG that runs within box AbC", "/path/to/shell/script.sh"

Обратите внимание, что вывод разделяется от запятой заключенные в кавычки поля, но ничто не сделано относительно возможности, что данные ontains заключают в кавычки. Если в кавычках так или иначе оставляют description:, затем это будет сохранено, конечно. @*descr нотация является жадным соответствием, и таким образом, description: "a b"c\"d" приведет к descr беря символы a b"c\"d который будет воспроизведен дословно в выводе.

Хорошая вещь об этом решении состоит в том, что, если у нас нет примера данных, мы можем предположить большинство из них от структуры кода, так как они выражают организованное соответствие шаблона через файл. Мы видим, что существуют разделы, собираемые, которые начинаются с a /* --- ... --- */ строка, в которую имя задания встраивается, и что существует поле типа между двумя знаками "диез" посреди имени задания. Затем обязательная пустая строка следует, после которого свойства собраны до другой пустой строки и так далее.

0
27.01.2020, 21:57

Теги

Похожие вопросы