나는 이것에 익숙하지 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 s
ip ad
$number
사용할 LAN 인터페이스 이름 번호를 캡처하세요 .
vth=$(ip a s | awk -F'[: @]' -v n="$number" '$1 == n { print $3 ; exit; }' )
의 결과는 ip a s
구문 분석할 수 없다는 점에 유의하세요.
유틸리티를 사용하여 더 쉽게 구문 분석할 수 있는 json 스크립트를 생성하는 -j
옵션이 있습니다 .ip
jq
답변2
BEGIN
블록 사용 :
awk -v n="$number" 'BEGIN {FS=" " n ": |@"}'
따라서 귀하의 것은 다음과 같습니다:
vth=$(echo "$inn" | awk -v n="$number" 'BEGIN {FS=" " n ": |@"} {print $2}')