Объясните, что делает эта команда Awk

Объясните, что делает эта команда Awk

У меня есть часть скрипта обновления 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не на двух других.

Связанный контент