Erklären Sie, was dieser Awk-Befehl macht

Erklären Sie, was dieser Awk-Befehl macht

Ich habe einen Teil des VoIPBL-Updateskripts.

cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\"  != \"#\" ]; then /usr/sbin/ipset  -A voipbl_temp \""$1"\" ;fi;"}'

Es werden Zeilen wie diese erstellt:

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

Ich verstehe, dass der zweite Teil darin besteht, eine Zeile aus der Datei (IP) zu einem IP-Set hinzuzufügen, aber was bewirkt die Testbedingung? Was bedeutet es, wenn Sie -z und -a in derselben Klammerngruppe haben? Und was bedeutet der Teil, der nicht gleich „#“ ist?

Antwort1

Es liest vermutlich IPs aus der /tmp/voipbl.txtDatei und erstellt dann eine darauf basierende Shell-Konstruktion. Der $1Parameter aus dem awk-Skript bezieht sich auf das Element in der ersten Spalte jeder Zeile, sodass die Zeichenfolge anstelle von 1.2.3.4/32in jeder Iteration dieser Wert sein wird.

if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32"  != "#" ]; then

! -z "1.2.3.4/32"- Überprüft, ob die Zeichenfolge "1.2.3.4/32"nicht null ist. -zIstNull, aber das !negiert das. Dies könnte und sollte wahrscheinlich durch ersetzt werden, -ndas nur auf Nicht-Null prüft

"1.2.3.4/32" != "#"- Es wird geprüft, ob das "1.2.3.4/32"nicht gleich ist. #Ich vermute, dass dies in Ihrer Datei vorkommen könnte.

Der -aBetreiber meintUnd. Es wird also überprüft, dass die Zeichenfolge nicht null ist UND dass sie nicht gleich ist #.

Wenn diese Bedingungen erfüllt sind, wird Folgendes ausgeführt:

/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"

Um dies besser zu verstehen, versuchen Sie, den Befehl awk auf einer Datei mit folgendem Inhalt auszuführen:

1.2.3.4/32

# 3.4.5.6/32

Wenn Sie jetzt Ihren awk-Befehl für diese Datei ausführen, erhalten Sie:

$ 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;

Die Tests stellen sicher, dass der Test /usr/sbin/ipsetnur auf der ersten Zeile ausgeführt wird 1.2.3.4/32und nicht auf den anderen beiden.

verwandte Informationen