패턴이 포함된 줄을 다음 줄로 바꿉니다.

패턴이 포함된 줄을 다음 줄로 바꿉니다.

현재 내 주변의 무선 네트워크에 대한 일부 정보를 출력하는 다음과 같은 코드가 있습니다.

sudo iw wlan0 scan | sed -nr '/SSID: |signal: |primary channel: /p' | sed 's/^[\t]*//g' | sed 's/^SSID: //' | sed 's/signal: / * signal: /'

(코드가 너무 길거나 헷갈리더라도 양해 부탁드립니다.) 출력은 대략 다음과 같습니다.

 * signal: -61.00 dBm
<network 1 name>
 * primary channel: 10
 * signal: -37.00 dBm
<network 2 name>
 * primary channel: 1
 * signal: -80.00 dBm
<network 3 name>
 * primary channel: 11
 * signal: -90.00 dBm
<network 4 name>
 * primary channel: 11

iw wlan0 scan그러나 명령의 원시 형식 으로 인해 각 네트워크의 신호 강도가 실제 네트워크 이름 앞에 인쇄됩니다. 내가 원하는 결과는 다음과 같습니다.

<network 1 name>
 * signal: -61.00 dBm
 * primary channel: 10
<network 2 name>
 * signal: -37.00 dBm
 * primary channel: 1
<network 3 name>
 * signal: -80.00 dBm
 * primary channel: 11
<network 4 name>
 * signal: -90.00 dBm
 * primary channel: 11

이 결과를 어떻게 얻을 수 있습니까? 어떻게든 패턴을 검색 * signal:한 후 해당 줄을 다음 줄로 바꿀 수 있을 것 같지만 이를 수행하는 방법을 모르겠습니다.

(가능하다면 다른 명령처럼 내 명령 끝에 추가할 수 있는 것을 원합니다 sed. 그렇지 않으면 bash의 모든 솔루션이 열려 있습니다)

<network # name>편집: 위에서 이것은 내 주변의 네트워크에서 일부 이름을 제거하고 거기에 있을 실제 네트워크 이름을 나타내는 것이라고 말했습니다 . 기본적으로 네트워크 이름이 있는 줄에는 네트워크 이름만 포함되며 "<" 또는 ">" 등은 포함되지 않습니다.

답변1

GNU sed를 사용하여 이것을 시도해 보세요:

sed -ne '/signal:/{h;b};/^[^ ]/{p;x};p' file

바라보다:man sed

답변2

iw --help출력의 마지막 줄을 실행하고 읽는 것이 좋습니다 .


그 외에는 이러한 파이프 없이도 단일 sed호출을 사용할 수 있다고 생각합니다.

iw wlan0 scan | sed -n '/signal:/{s/^[[:blank:]]*/ * /;h}
/^[[:blank:]]*SSID: /{s///;G;p};/primary/{s/^[[:blank:]]*/ /;p}'

즉:

/signal:/{s/^[[:blank:]]*/ * /;h}- signal라인을 포맷하고 h이전 공간을 복사합니다. - 라인을
/^[[:blank:]]*SSID: /{s///;G;p}포맷하고 , 예약된 공간부터 패턴 공간까지 라인을 추가하여 인쇄합니다. - 라인을 포맷 하고 인쇄합니다.SSIDG
/primary/{s/^[[:blank:]]*/ /;p}primaryp

답변3

내 컴퓨터에서 하는건데..

sudo iw wlp0s18f2u1 scan |
sed -Ee:n -e'$!N;/^.sig/!D' \
          -e'/\* pri/s/.([^\t]*\t).*(SSID:[^\t]*\t).*p/\2\1p/;t' \
          -ebn

...얻은 결과는 다음과 같습니다...

SSID: ATT477A7i6
    signal: -61.00 dBm
    primary channel: 6
SSID: ATT5K5I6b4
    signal: -65.00 dBm
    primary channel: 6
SSID: ATT960
    signal: -75.00 dBm
    primary channel: 6
SSID: Bernardo Shores WiFi 4
    signal: -77.00 dBm
    primary channel: 6

GNU와 함께 작동합니다 sed. 보다 이식 가능한 버전은 다음과 같습니다.

(   t=$(printf \\t) nt=[\^$t]*$t
    sudo iw wlp0s18f2u1 scan |
    sed -e:n -e'$!N;/^.sig/!D' \
             -e"/* pri/s/.\($nt\).*\(SSID:$nt\).*p/\2\1p/;t" \
             -ebn
)

관련 정보