私はしばしば行とインデントを理解する必要があります。たとえば、インデントされた行番号を知っている場合は、次のようにこれを達成できます。
$ 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>
たとえば、次のコマンドの出力には1つの無線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
1つのメッセージのみを含むようにこの出力を切り捨てるにはどうすればよいですか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}'
仕組み:
このコードは2つの変数を使用します。 f
印刷したいセクションにある場合は1、それ以外の場合は0のフラグです。文字列は、x
印刷したいセクションの先頭のインデントよりも1つのスペースを大きく設定します。
/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}
印刷するセクションの内側(ゼロ以外)にある場合は、インデント
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
出力には一致するブロック(通常はコード)が含まれます。