나는 다음과 같은 결과를 생성하는 결과를 구문 분석하려고합니다 nmcli dev wifi
.
* SSID MODE CHAN RATE SIGNAL BARS SECURITY
Prk Infra 11 54 Mbit/s 99 ▂▄▆█
VIDEOTRON2255 Infra 11 54 Mbit/s 67 ▂▄▆_ WPA1 WPA2
a space Infra 6 54 Mbit/s 65 ▂▄▆_ WPA2
* TNCAP4D0B18 Infra 11 54 Mbit/s 52 ▂▄__
awk -F" "
처음에는 거의 모든 상황을 구문 분석하는 데 사용했습니다 . Wi-Fi 네트워크가 연결된 모든 장치 a space
는 전혀 작동하지 않는 것으로 나타났습니다 .
그래서 하나가 아닌 두 개의 공백을 사용해 보았지만 예상한 결과가 나오지 않았습니다. 위 출력의 열을 일관되게 구문 분석하려면 어떻게 해야 합니까?
현재 스크립트는 다음과 같습니다.
nmcli dev wifi | sed 's/\*//g' > /tmp/scan
networks=$(cat /tmp/scan | awk -F" " '{print $1}' | sed '1d')
# ...
bars=$(cat /tmp/scan | awk -F" " '{print $6}' | sed '1d')
답변1
awk -F' {2,}' # means - two or more spaces.
또는
awk -F' +' # means - one space, then one or more spaces.
이 명령은 동일한 의미를 갖습니다. 필드 구분 기호로 2개 이상의 공백을 사용합니다.
답변2
첫 번째 행을 구문 분석하여 각 열이 시작되는 위치를 찾은 다음 열 번호를 기준으로 다른 행을 구문 분석합니다. 예를 들어 다음 스크립트는 SSID인 열 2를 인쇄합니다.
nmcli_output=$(nmcli dev wifi)
printf %s\\n "$nmcli_output" | awk -v column=2 '
NR==1 {
i=1; p=1;
while(match($0,/^[^ ]+ +/)) {
a[i++] = p;
p += RLENGTH;
$0 = substr($0, RLENGTH+1);
}
}
NR!=1 {
text = substr($0, a[column], a[column+1] ? a[column+1]-a[column] : length);
sub(text, / +$/, "");
print text
}'
수행하려는 작업에 따라 awk를 여러 번 호출하는 것이 최선의 해결책이 아닐 수도 있습니다. 이 system
함수를 사용하여 awk에서 쉘 명령을 실행할 수 있다는 것을 기억하십시오.