awk -F" " 1보다 큰 공백으로 구분

awk -F" " 1보다 큰 공백으로 구분

나는 다음과 같은 결과를 생성하는 결과를 구문 분석하려고합니다 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에서 쉘 명령을 실행할 수 있다는 것을 기억하십시오.

관련 정보