합성 Wi-Fi 정보를 얻기 위해 스크립트에서 다음 명령을 사용합니다.
echo "$(
iw dev wlp1s0 link |
grep '^\s*SSID:\s' |
sed -r 's/^\s*SSID:\s//'
) $(
iw dev wlp1s0 link |
grep '^\s*signal:\s' |
sed -r 's/^\s*signal:\s//'
)"
작동하며 출력은 다음과 같습니다.
MySSID -46 dBm
iw dev wlp1s0 link
하지만 결과가 같을 것이라는 것을 알면서도 같은 호출을 두 번 하는 것은 어리석은 일처럼 느껴집니다. 또한 출력을 iw
임시 변수에 저장하는 것을 피하고 싶습니다 .
tee
를 사용하여 출력을 iw
두 작업 모두에 "복사"한 다음 결과를 연결하는 등 내가 할 수 있는 일이 있습니까 ?
답변1
임시 변수를 사용하는 데에는 아무런 문제가 없습니다. 변수는 여러 번 사용될 데이터를 저장하는 데 사용됩니다.
이 경우 두 개의 grep/sed 호출을 GNU grep, sed 또는 awk에 대한 단일 호출로 결합할 수 있습니다. sed를 사용하면 쉽습니다. -n
명시적으로 인쇄된 줄만 출력하는 옵션을 전달하고 대체를 수행하는 줄을 인쇄합니다.
echo "$(
iw dev wlp1s0 link |
sed -nr -e 's/^\s*SSID:\s//p' -e 's/^\s*signal:\s//'
)"
원본 스크립트와 한 가지 차이점이 있습니다. SSID 및 신호 값이 출력에 나타나는 순서대로 인쇄됩니다 iw
. 해당 순서에 독립적이기를 원한다면 sed를 사용하는 것이 번거로울 수 있으므로 awk를 선택하는 도구가 될 것입니다. 이렇게 하면 한 줄에 출력을 얻는 것이 쉽습니다. 다음 스크립트는 각 설정의 마지막 값을 인쇄합니다( iw
하나만 출력되므로 이 특정 경우에는 중요하지 않습니다). 모두 인쇄 ssid = $0
하도록 예제를 변경합니다.ssid = ssid " " $0
iw dev wlp1s0 link | awk '
$1=="SSID:" {sub(/[^:]*:[[:space:]]*/,""); ssid = $0}
$1=="signal:" {sub(/[^:]*:[[:space:]]*/,""); signal = $0}
END {print ssid, signal}
'
일반적으로 말하면 명령의 출력을 두 개의 서로 다른 필터로 보내려는 경우 tee
이를 사용하여 다음으로 전달할 수 있습니다.프로세스 교체. 이것은 파이프를 일반화하는 bash 기능(ksh93의, zsh에도 있지만 일반 sh에는 없음)입니다. 명령 tee
은 지정된 명령에 연결하기 위한 파이프를 지정하는 파일 이름을 확인합니다.
iw dev wlp1s0 link | tee >(
grep '^\s*SSID:\s' |
sed -r 's/^\s*SSID:\s//'
) |
grep '^\s*signal:\s' |
sed -r 's/^\s*signal:\s//'
이 방법의 한 가지 제한 사항은 프로세스 대체 명령이 자체 하위 쉘에서 실행된다는 것입니다. 여기서는 변수를 얻을 수 없으며 해당 출력이 다른 출력과 산재되는 방식을 제어할 수도 없습니다.
답변2
iw
다음은 귀하와 동일한 출력을 가진 명령의 한 줄입니다 .
iw dev wlp1s0 link | grep 'SSID:\|signal' | awk '{printf "%s ", $2$3}'
내 결과:
ZyXEL-AP-2,4GHz -46dBm
답변3
비슷한 것?
iw dev wlp1s0 link |
grep -E '^\s*(SSID|signal):\s' |
sed -r 's/^\s*(SSID|signal):\s//' |
awk '{printf $0}'
grep
가 수락되므로 및 와 (SSID|signal):
일치합니다 .SSID:
signal:
-E
선택 사항이지만 사용하지 않는 경우 특수 의미 문자를 이스케이프 처리하는 것이 좋습니다. 여기 있을 거예요\(SSID\|signal\):
이 부분에도 동일한 정규식을 사용할 수 있습니다 sed
.
마지막으로 awk
후행 줄 바꿈을 모두 제거합니다(그렇지 않으면 출력이 2줄로 표시됩니다).