이 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

/tmp/voipbl.txt파일에서 대략적인 IP를 읽고 이를 기반으로 쉘을 생성합니다 . 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". -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다른 두 행에서는 실행되지 않도록 합니다 .

관련 정보