Awk 스크립트의 Bash 변수

Awk 스크립트의 Bash 변수

다음 내용이 포함된 플랫 파일 데이터베이스(ff_servers.db)가 있습니다.

192.168.154.2 Alaska   hp
192.168.157.3 Colorado dell
192.168.156.3 hawaii   hp

명령줄에서 다음을 실행할 수 있습니다.

awk "BEGIN{IGNORECASE=1;}/alaska/ {print $NF}" ff_servers.db`

나는 얻을 것이다

hp

그러나 Bash 스크립트에서는 "$NF" 문제가 발생합니다. 해당 스크립트의 덤프는 다음과 같습니다.

machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \$NF}" ff_servers.db`
awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print $NF}" ff_servers.db
++ awk 'BEGIN{IGNORECASE=1;}/colorado/ {print }' ff_servers.db
+ target_arch='192.168.157.3   Colorado           dell'

분명히 $NF가 올바르게 번역되지 않았습니다. 내가 뭘 잘못했나요?

답변1

$Bash는 큰따옴표로 변수를 확장합니다(예: ".

명령줄에서 대화형으로 이 작업을 수행할 때도 문제가 됩니다. Bash는 Expand를 시도하고, "$NF"변수가 정의되지 않은 경우 Bash는 이를 빈 문자열로 확장합니다.NF

'일반적 으로 작은따옴표를 사용하여 $NFbash가 확장하지 않도록 할 수 있습니다 .

하지만 확장하고 싶기 때문에 ${server_name}이중 탈출을 시도해 볼 수 있습니다.

machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \\$NF}" ff_servers.db`

문자열 연결을 사용해 볼 수도 있습니다. 차이점은 대부분 스타일에 있습니다.

machine_type=`awk 'BEGIN{IGNORECASE=1;}/'${server_name}'/{print $NF}' ff_servers.db`

이는 bash가 인접한 문자열을 함께 연결하기 때문입니다.

관련 정보