Форматирование выхода Awk и regex

Shorewall-lite - это очень легкий инструмент для управления конфигурацией межсетевого экрана, созданной на другом сервере. Он не подходит для настройки конфигурации, но позволяет управлять сгенерированной конфигурацией. Он неплохо работает на OpenWRT, дистрибутиве, предназначенном для маршрутизаторов.

Текущая версия Shorewall основана на Perl. Это может сделать установку намного больше, чем вы хотели бы для маршрутизатора.

Из инструментов, которые я использовал, я считаю Shorewall самым простым в использовании. Есть пример конфигурации, которая обычно требует небольших изменений. Я довольно легко выполнил довольно сложную конфигурацию для небольшой сети.

1
08.10.2018, 11:56
4 ответа

вы можете попробовать это:

    #!/bin/bash
    cat file |sed '1d' | while IFS= read line; do

    n1=$(echo $line | awk '{print $1}')
    n2=$(echo $line | awk '{print $3}') 

    echo "
    delayMicroseconds($n1);
    pulseIR($n2);
    "
    done

delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);

В качестве альтернативы вы можете попробовать perlследующим образом;

perl -pe 's/(\d+)[\D]+(\d+)[\D]+/delayMicroseconds($1);\npulseIR($2);\n/' file
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);
2
27.01.2020, 23:10

Здесь нет необходимости в каких-либо регулярных выражениях -только printfдля форматирования полей в строку:

$ awk '{printf("delayMicroseconds(%d);\npulseIR(%d);\n", $1, $3)}' file
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);
11
27.01.2020, 23:10

С GNU sed:

$ sed -Ee 's/([0-9]+) usec, ([0-9]+) usec.*/delayMicroseconds(\1);\npulseIR(\2);/' < data 
delayMicroseconds(62640);
pulseIR(3500);
...

-Eуказывает sedиспользовать расширенные регулярные выражения (*), команда s/pattern/replacement/запускает операцию поиска -замены в текущей строке(sedповторяет инструкции, данные для каждой входной строки ).

Шаблон имеет вид ([0-9]+) usec, ([0-9]+) usec.*, где [0-9]означает одну любую цифру, +любое число предыдущего «атома», а (...)сохраняет («захватывает» )все, что совпало. Итак, ([0-9]+)означает любое количество любых цифр и сохраняет результат. Буквы сопоставляются как -, а конечная .*соответствует любому количеству любых символов, просто чтобы съесть возможный мусор в конце строки.

При замене \1и \2заменяются сохраненным содержимым групп (...)(, но сами скобки здесь буквальные ), а \nозначает символы новой строки (. ] это может работать не на всех seds ).


(*)См. Почему мое регулярное выражение работает в X, но не в Y? для различия между различными типами регулярных выражений. Кроме того, в Интернете есть несколько руководств по sed. Я предлагаю найти один или два и поиграться с ними, хотя бы для ознакомления с командой s///.

2
27.01.2020, 23:10

Использование GNU awk:

awk -v RS=' usec[,\n] ?' '{print (NR%2?"delayMicroseconds":"pulseIR")"("$0")"}' file

В качестве разделителя записей используется строка usec. Это позволяет перехватывать каждое число как отдельную запись, поэтому команда printальтернативно отображает 2 строки с нужным числом.

1
27.01.2020, 23:10

Теги

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