awk는 명령문의 변수를 평가합니다.

awk는 명령문의 변수를 평가합니다.

나는 이것에 익숙하지 awk않고 온라인에서 찾은 많은 제안을 시도했지만 문제를 해결할 수 없습니다. $number-F arg 값 내에서 평가할 변수가 필요합니다 .

이 문은 예상대로 작동합니다.

inn=$(ip ad)     
vth=$(echo $inn | awk -F ' 6: |@' '{print $2}')
echo $vth

그런데 이 "6"을 추출하고 그에 따라 값을 변경해야 하는데 어떻게 해야 합니까?

이것이 최선의 추측이지만 작동하지 않습니다.

     inn=$(ip ad) 
     vth=$(echo $inn | awk -vn="$number" -F ' n: |@' '{print $2}')
     echo $vth

업데이트: @Archemar가 제공한 솔루션을 사용해 보았습니다.

콘솔에서는 잘 돌아가는데 파일에 추가하면 작동하지 않나요? 왜? 변수 평가가 어떻게 다른지.쉿파일을 작성하고 직접 실행해 보세요.편안?

편집: 1) $inn 추가 2) 콘솔과 .sh 파일에서 실행하는 것의 차이점

답변1

이것은 쉘 문제에 더 가깝습니다. 시도해 보셨나요..?

vth=$(echo "$inn" | awk -F ' '"$number"': |@' '{print $2}')
  • 쉘이 bash인지 확인하십시오(예: 첫 번째 줄은 #!/bin/bash).
  • 다른 곳에서 필요하지 않으면 $inn다음을 사용하십시오.vth=$( ip ad | ... )
  • @(또는) 의 결과를 재현할 수 없습니다 .ip a sip ad

$number사용할 LAN 인터페이스 이름 번호를 캡처하세요 .

vth=$(ip a s | awk -F'[: @]' -v n="$number" '$1 == n { print $3 ; exit; }' )

의 결과는 ip a s구문 분석할 수 없다는 점에 유의하세요.

유틸리티를 사용하여 더 쉽게 구문 분석할 수 있는 json 스크립트를 생성하는 -j옵션이 있습니다 .ipjq

답변2

BEGIN블록 사용 :

awk -v n="$number" 'BEGIN {FS=" " n ": |@"}'

따라서 귀하의 것은 다음과 같습니다:

vth=$(echo "$inn" | awk -v n="$number" 'BEGIN {FS=" " n ": |@"} {print $2}')

관련 정보