grep을 사용하여 출력에서 ​​줄을 구분합니다.

grep을 사용하여 출력에서 ​​줄을 구분합니다.

grep에서 줄을 가져와서 다른 명령으로 정렬하려고 합니다. grep atm에 사용하는 명령은 다음과 같습니다(사용할 내용에 비해 충분하지는 않지만 더 나은 컨텍스트를 제공합니다).

iwlist wlan0 scanning | grep -oE '(ESSID:|Quality=|Encryption Key:).*'

출력은 다음과 같습니다(그러나 내 컴퓨터의 위치에 따라 변경됩니다).

Quality=64/70 Signal Level=-49dBm
Encryption key:on
ESSID:"Hringdu_20558"
Quality=61/70 Signal Level=-48 dBm
Encryption key:on
ESSID:"SiminnEBE932"
Quality=30/70 Signal Level=-71 dBm
Encryption key:on
ESSID:"Siminn106C46
Quality=28/70 Signal Level=-83 dBm
Encryption key:on
ESSID:"SiminnECC63F"

다른 명령을 실행하기 위해 이 줄만 사용하고 싶습니다.

$ssid=$(zenity --list --text "Available Networks" --list --column "ESSID" --column "Secure" --column "Signal" "$ESSID" "$ENC" "$Signal");

빠른 무선 네트워크 선택 팁의 시작입니다. $ESSID/$ENC/$Signal은 이전 grep의 출력을 기반으로 하므로 cut/awk/로 분할한 후 grep 출력에 대해 추가 처리를 수행해야 하며 결과는 다음 sed와 같습니다.

91%
on
Hringdu_20558

(참고: 64에 10을 곱하고 7로 나누어 백분율을 구했습니다. 64*10/7)

스크립트는 감지된 각 ESSID에 대한 zenity 명령에 이러한 행을 반복적으로 적용합니다. 그리고 문제를 더하자면, grep 출력이 zenity 명령의 역순이라는 것을 알 수 있습니다. 즉, "Hringdu_20558"이 먼저 들어가고 "87%"가 마지막에 들어가야 한다는 의미입니다.

즉, 이 특정 시나리오에서는 어떻게든 grep 출력에서 ​​세 번째 줄을 가져와 다른 명령에 추가해야 합니다. 그런 다음 처음 두 줄과 시작한 줄 다음의 세 번째 줄을 처리합니다. 더 많은 라인.

본질적으로 위의 출력을 기반으로 최종 zenity 명령은 다음과 같아야 합니다.

$ssid=$(zenity --list --text "Available Networks" --list --column "ESSID" --column "Secure" --column "Signal" "Hringdu_20558" "on" "91%" "SiminnEBE932" "on" "87%" "Siminn106C46" "on" "43%" "SiminnECC63F" "on" "40%");

어떻게 해야 하나요? 기본 쉘 스크립트만으로 수행할 수 있습니까?

답변1

나는 이것으로 끝납니다 :

ssid=$(iwlist wlan0 scanning |
awk -F: '
BEGIN{ printf "zenity --list --text \"Available Networks\" --list --column ESSID --column Secure --column Signal "; }
/Quality/{ split($0,x,"="); Quality = int(x[2]*100/70+.5); }
/Encryption/{ Encryption = $2; }
/ESSID/{ ESSID = $2;
         printf "%s \"%s\" \"%s%%\" ", ESSID, Encryption, Quality
}' |
sh)

실제로 grep을 사용하지는 않지만 원하는 것을 수행합니다.

관련 정보