나는 종종 줄과 들여쓰기를 파악해야 합니다. 예를 들어, 들여쓰기된 줄 번호를 알고 있다면 다음과 같이 이를 달성할 수 있습니다.
$ 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
. 줄이 일치하고 아직 섹션에 있지 않은 경우 다음을 수행합니다.f
1로 설정합니다.문자열은
x
줄 시작 부분의 들여쓰기로 설정됩니다.라인이 인쇄됩니다.
나머지 명령은 건너뛰고 해당
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 [OPTIONS] PATTERN [FILE...]
PATTERN
각각 검색합니다FILE
(STDIN
또는 파일 이름이 제공되지 않은 경우 검색).
다른 grep
와 달리 blockgrep
출력에는 일치하는 블록(일반적으로 코드)이 포함됩니다.