편집하다

편집하다

나는 종종 줄과 들여쓰기를 파악해야 합니다. 예를 들어, 들여쓰기된 줄 번호를 알고 있다면 다음과 같이 이를 달성할 수 있습니다.

$ lspci -vq | grep -i wireless -B 1 -A 5

    02:00.0 Network controller: Intel Corporation Wireless 7260 (rev 73)
        Subsystem: Intel Corporation Wireless-N 7260
        Flags: bus master, fast devsel, latency 0, IRQ 64
        Memory at c0600000 (64-bit, non-prefetchable) [size=8K]
        Capabilities: <access denied>

예를 들어, 다음 명령의 출력에는 하나의 무선 LAN 정보만 포함될 수도 있고 모든 정보가 포함되지 않을 수도 있습니다.

$ sudo iwlist wlan0 scan | grep -i "cell 13" -A 34
          Cell 13 - Address: 00:1A:2B:93:A7:9C
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Quality=20/70  Signal level=-90 dBm  
                    Encryption key:on
                    ESSID:"NetMASTER Uydunet-E445"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
                              24 Mb/s; 36 Mb/s; 54 Mb/s
                    Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 48 Mb/s
                    Mode:Master
                    Extra:tsf=0000005b923c8227
                    Extra: Last beacon: 4648ms ago
                    IE: Unknown: 00164E65744D415354455220557964756E65742D45343435
                    IE: Unknown: 010882848B962430486C
                    IE: Unknown: 030106
                    IE: Unknown: 050400010000
                    IE: Unknown: 2A0100
                    IE: Unknown: 2F0100
                    IE: Unknown: 32040C121860
                    IE: Unknown: 2D1A2C181BFF00000000000000000000000000000000000000000000
                    IE: Unknown: 3D1606080400000000000000000000000000000000000000
                    IE: Unknown: DD090010180201F00C0000
                    IE: WPA Version 1
                        Group Cipher : CCMP
                        Pairwise Ciphers (1) : CCMP
                        Authentication Suites (1) : PSK
                    IE: Unknown: DD180050F2020101800003A4000027A4000042435E0062322F00
          Cell 14 - Address: 90:F6:52:90:C2:2F
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Quality=21/70  Signal level=-89 dBm  
                    Encryption key:on
                    ESSID:"selma"
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
                              9 Mb/s; 12 Mb/s; 18 Mb/s

하나의 메시지만 포함하도록 이 출력을 자르려면 어떻게 해야 합니까 Cell?

편집하다

작업 스크립트는 다음 위치에 유지됩니다.https://github.com/ceremcem/sgrep

답변1

일치하는 장 제목을 기반으로 한 솔루션

Cell 13로 시작하지만 앞에서 끝나는 텍스트를 인쇄하려면 다음을 Cell 14사용하세요.

sudo iwlist wlan0 scan | awk '/Cell 13/{f=1} /^ *Cell 14/{f=0} f'

들여쓰기 수준 모니터링 기반 솔루션

그러면 다음을 포함하는 줄로 시작하는 Cell 13모든 줄이 인쇄됩니다.더 큰들여쓰기 수준:

sudo iwlist wlan0 scan | awk '/Cell 13/ && !f{f=1;x=$0;sub(/[^ ].*/,"",x);x=x" ";print;next} f {if (substr($0,1,length(x))==x)print; else f=0}'

작동 방식:

이 코드는 두 개의 변수를 사용합니다. f인쇄하려는 섹션에 있으면 1이고 그렇지 않으면 0인 플래그입니다. 문자열은 x인쇄하려는 섹션 시작 부분의 들여쓰기보다 한 공백 더 크게 설정됩니다.

  • /Cell 13/ && !f{f=1;x=$0;sub(/[^ ].*/,"",x);x=x" ";print;next}

    ( 또는 섹션의 시작을 나타내는 모든 항목을 포함하는 줄을 찾습니다 Cell 13. 줄이 일치하고 아직 섹션에 있지 않은 경우 다음을 수행합니다.

    1. f1로 설정합니다.

    2. 문자열은 x줄 시작 부분의 들여쓰기로 설정됩니다.

    3. 라인이 인쇄됩니다.

    4. 나머지 명령은 건너뛰고 해당 next줄로 이동합니다.

  • f {if (substr($0,1,length(x))==x)print; else f=0}

    인쇄할 섹션 내부(0이 아닌 경우)에 있으면 f들여쓰기 수준이 확인됩니다. 들여쓰기가 최소 이면 x이 줄을 인쇄합니다. 그렇지 않은 경우 설정을 전달하면 섹션의 끝에 도달했음을 의미합니다 f=0.

답변2

REGEXP 일치 항목과 일치 항목 뒤에 들여쓰기된 모든 줄을 출력하려면 다음을 수행하세요.

command | perl -ne '/^( *)/; $i = length $1; $j && $i >= $j and print, next; $j = 0; /REGEXP/ and $j = $i + 1, print'

REGEXP정규식으로 바꾸십시오 .

예를 들어,

$ perl -ne '/^( *)/; $i = length $1; $j && $i >= $j and print, next; $j = 0; /a/ and $j = $i + 1, print' <<EOF
a
b
  c
  a
    b
    a
    c
      b
    d
  e
    b
  a
    c
e
EOF

산출:

a
  a
    b
    a
    c
      b
    d
  a
    c

답변3

일반적인 해결책은 다음을 sed사용하는 것 입니다.범위주소. 선이 시작하고 끝나는 위치를 나타내는 방법이 모두 필요합니다. 가능한키워드,들여쓰기 수준,빈 줄또는 다른 것:

  • 핵심 단어

    iwlist wlan0 scan | sed -n '/Cell 04/{:1;p;n;/Cell/!b1}'

  • 들여쓰기 수준

    iwlist wlan0 scan | sed -n '/Cell 04/{:1;p;n;/^\s\{1,18}\S/!b1}'

  • 빈 줄

    lspci -vq | sed -n '/[Ww]ireless/{:1;p;n;/^$/!b1}'

답변4

사용blockgrep

요약

blockgrep [OPTIONS] PATTERN [FILE...]

PATTERN각각 검색합니다 FILE( STDIN또는 파일 이름이 제공되지 않은 경우 검색).

다른 grep와 달리 blockgrep출력에는 일치하는 블록(일반적으로 코드)이 포함됩니다.

관련 정보