LINUX.ORG.RU

awk - использование полей $1, $2, $3... в регулярных выражениях

 , ,


1

1

Здравствуйте! Принимайте новенького.
Пишу простенькую Bash-функцию проверки наличия IP-адреса или шаблона, которому он соответствует, в файле hosts.allow.
Так работает:...

function isAllowed() {
    awk '("'$1'" ~$2) && ($2 != "") {print $2}' /etc/hosts.allow
}

isAllowed 192.168.0.100

..., но ищет шаблон в любой части IP-адреса, а нужно - только в начале. Т.е. если в hosts.allow присутствует шаблон 168.0. ,то он будет соответствовать IP-адресу 192.168.0.100, что не правильно.

Добавляю символ ^ в регулярное выражение, т.е. меняю ~$2 на ~^$2 и получаю ошибку:

awk: ("192.168.0.100" ~^$2) && ($2 != "") {print $2}
awk:                   ^ syntax error
awk: ("192.168.0.100" ~^$2) && ($2 != "") {print $2}
awk:                        ^ syntax error
awk: ("192.168.0.100" ~^$2) && ($2 != "") {print $2}
awk:                                      ^ syntax error
Помогите пожалуйста исправить ошибку.



Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от anonymous

не то

Нет, шаблон со строкой местами менять нельзя!
В данном контексте:

$2 - это поле (шаблон, регулярное выражение), получаемое командой awk из файла hosts.allow[br]
$1 - это параметр (IP-адрес) переданный функции для сопоставления шаблону.

Man1980
() автор топика

Может быть тебе было бы удобнее в качестве разделителя использовать точку? awk -F.

sin_a ★★★★★
()
Ответ на: не то от Man1980

("'$1'" ~$2) -> (index("'$1'",$2)==1)

но тебе вероятно требуется не это.

как эта функция должна отреагировать на 192.168.0.100 в первом параметре ($1) и строчку "xxx 192.168.0.10" в файле?

anonymous
()

я как-то писал проверку ip адресов в определенных подсетях, делал исключительно с помощью bash, суть такова

OIFS=$IFS
ip='192.168.11.22'
IFS='.'
ip=(ip) #тут получится массив [192] [168] [11] [22]
IFS=$OIFS
if (( ip[2] > $MAX_NET )) ; then echo $BAD ; fi

вроде работет

anonymous
()
Ответ на: комментарий от anonymous

то, что нужно!

Спасибо огромное! Все получилось! Вот рабочий вариант:

function isAllowed() {
    awk '(index("'$1'",$2)==1) && ($2 ~/[0-9]+\.$/) || ("'$1'" == $2) {print $2}' /etc/hosts.allow
}

isAllowed 192.168.0.100
Man1980
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.