Можно ли искать / заменять в awk до разбора столбцов? - PullRequest
0 голосов
/ 27 ноября 2018

В моем сценарии ниже я предполагаю, что входной файл всегда имеет пробел до и после :, однако это не всегда тот случай, когда входной файл имеет это.

awk '!/^#/ && !/000000000000/ && /[0-9A-Fa-f]{12}/ {
    print "host "$5" {"

    gsub(/..\B/,"&:", $3)
    print "  hardware ethernet "$3";"

    print "  fixed-address "$1";"
    print "}"
    print ""
}' hosts > reservations.conf

Вопрос

Можно ли выполнить глобальный поиск и заменить ":" на " : " (есть пробел до и после ":") до того, как awk начнет анализировать файл?Это должно быть сделано в памяти, чтобы входной файл не был изменен на диске.

Я думаю, это можно сделать с помощью sed, а затем направить его в awk, но часто я сталкиваюсь с этимТакая ситуация, поэтому мне бы очень хотелось узнать, есть ли способ сделать это в awk или gawk.

Пример входных данных

10.52.0.1 : 000000000000 : newhost-52-1  : # 
10.52.0.2 : 180373D0FE86:  ster.dtocal :#

Пример требуемого вывода

host newhost-52-1 {
  hardware ethernet 00:00:00:00:00:00;
  fixed-address 10.52.0.1;
}

host ster.dtocal {
  hardware ethernet 18:03:73:D0:FE:86;
  fixed-address 10.52.0.2;
}

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

На заметку: Ваш первоначальный вопрос был Можно ли искать / заменять в awk до разбора столбцов? .Ответ на этот вопрос - да, это возможно.

Когда вы переопределите переменную, $0 awk по существу переопределит все поля и соответствующую переменную NF.По сути, вы можете сделать что-то вроде этого:

awk '{gsub(/foo/,"foo bar")}{...}'

Или

awk '{$0=$0" "new_field"}{...}'

В первом случае $0 переопределяется непосредственно в команде gsub, во втором случаеэто переопределено присваиванием.Пример:

$ echo "1 2 3" | awk '{sub("3","3 4")}{print NF"|" $1,$2,$3,$4}'
4|1 2 3 4
$ echo "1 2 3" | awk '{$0=$0" foo"}{print NF"|" $1,$2,$3,$4}'
4|1 2 3 foo
0 голосов
/ 27 ноября 2018

Сейчас вы, похоже, полагаетесь на стандартную FS.Если вы используете GNU awk, определите его awk -F" *: *" ...:

$ awk -F" *: *" '
!/^#/ && !/000000000000/ && /[0-9A-Fa-f]{12}/ {
    print "host "$3" {"

    gsub(/..\B/,"&:", $2)
    print "  hardware ethernet "$2";"

    print "  fixed-address "$1";"
    print "}"
    print ""
}' file
host ster.dtocal {
  hardware ethernet 18:03:73:D0:FE:86;
  fixed-address 10.52.0.2;
}

. Я изменил значения $n в вашем коде на более подходящие, но поскольку входные и выходные выборки не совпадали, я тоже не тратилмного времени на размышления о том, как должен выглядеть результат.

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