이 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다음 이를 기반으로 구성하면 쉘을 생성하는 것입니다. awk 스크립트의 매개 변수 $1는 각 줄의 첫 번째 열에 있는 항목을 참조하므로 대신에 있는 문자열은 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문자열인지 확인~이다0이지만 !그것을 부정합니다. 이것은 -nnull이 아닌지 확인하는 것으로 대체될 수 있고 아마도 대체되어야 할 것입니다 .

"1.2.3.4/32" != "#"- 내 생각에 파일에 나타날 수 있는 것과 "1.2.3.4/32"같지 않은지 확인하는 것입니다 .#

운영자 -a의 뜻은그리고. 따라서 문자열이 null이 아니고 같지 않은지 확인합니다 #.

이러한 조건이 충족되면 다음이 실행됩니다.

/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다른 두 줄에서는 실행되지 않는지 확인합니다.

관련 정보