У меня есть часть скрипта обновления VoIPBL.
cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}'
Он создает такие строки:
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi; | sh
Я понимаю, что вторая часть добавляет строку из файла (IP) в ipset, но что делает тестовое условие? Что это значит, когда у вас есть -z и -a в одном наборе скобок? И что означает часть не равно "#"?
решение1
Он считывает предположительно IP из /tmp/voipbl.txt
файла, а затем создает конструкцию оболочки if на их основе. $1
Параметр из скрипта awk ссылается на элемент в первом столбце в каждой строке, поэтому строка вместо 1.2.3.4/32
будет иметь это значение в каждой итерации.
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then
! -z "1.2.3.4/32"
- Проверяет, что "1.2.3.4/32"
это не null. -z
проверяет, является ли строкаявляетсяноль, но !
отрицает это. Это может и, вероятно, должно быть заменено на -n
то, что просто проверяет на не-ноль
"1.2.3.4/32" != "#"
- Проверяет, что "1.2.3.4/32"
не равно, и, #
как я предполагаю, это может быть что-то, что может появиться в вашем файле.
Оператор -a
означаети. Таким образом, проверяется, что строка не является нулевой И что она не равна #
.
Если эти условия выполнены, то будет выполнено следующее:
/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"
Чтобы лучше это понять, попробуйте запустить команду awk для файла со следующим содержимым:
1.2.3.4/32
# 3.4.5.6/32
Если теперь запустить команду awk для этого файла, вы получите:
$ awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}' file
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi;
if [ ! -z "" -a "" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "" ;fi;
if [ ! -z "#" -a "#" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "#" ;fi;
Тесты гарантируют, что /usr/sbin/ipset
будет запущен только на первой строке, а 1.2.3.4/32
не на двух других.