명령은 대화형 셸에서는 작동하지만 스크립트에서는 작동하지 않습니다.

명령은 대화형 셸에서는 작동하지만 스크립트에서는 작동하지 않습니다.
  • 플랫폼: RHEL7
  • 셸: 배쉬
  • 예상 결과: 값을 변수로 저장

다음과 같은 텍스트에서 IP를 캡처하려고 합니다.

              {
                "ip": "12.34.56.7",
                "type": "LEARNED"
              }

터미널에서 다음 명령을 실행하면 예상대로 IP를 얻습니다.

grep '"ip":' ../path/to/file.txt | awk '{ print $2 }' | tr -d '"' | tr -d ','

스크립트에 있는 내용은 다음과 같습니다.

IP=grep '"ip":' ../path/to/file.txt | awk '{ print $2 }' | tr -d '"' | tr -d ','

IP=나는 모든 것을 따옴표로 묶거나 주사위를 사용하되 사용하지 않고 grep ip 텍스트 주위의 따옴표를 이스케이프 처리하는 등 몇 가지 다른 작업을 시도했습니다 . \\이 문제에 접근하는 올바른 방법이 확실하지 않습니다. 스크립트에 따옴표가 없으면 스크립트는 내 명령을 분해하거나 어떤 이유로 awk에서 $2를 제거합니다.

정보를 제공해 주셔서 감사합니다.

답변1

쉘 명령의 출력을 변수에 할당하려면 VAR=$(command)귀하의 경우에 따라 다음을 사용하십시오.

IP=$(grep '"ip":' ../path/to/file.txt | awk '{ print $2 }' | tr -d '"' | tr -d ',')

그러나 얼마 전 누군가가 sed너무 많은 복잡성을 피하기 위해 파이프라인을 발명하기로 결정했습니다.

IP=$(sed '/"ip":/!d;s/",//;s/.*"//' ../path/to/file.txt)
  • /"ip":/!d"ip":없는 줄 은 모두 무시
  • s/",//뒤따르는 큰따옴표와 쉼표를 제거하세요.
  • ;s/.*"//나머지 큰따옴표 앞의 모든 항목을 제거합니다.

관련 정보