awkを使用して、一致する文字列内の文字列を検索したいと思います。しかし、私が見つけたawkガイドと例は1つの一致しか採用していないか、有望なSOの質問には非常に具体的な回答があるため、問題を解決するためにそれらから一般的なプリンシパルを簡単に引き出すことはできません。
cat /proc/bus/input/devices
たとえば、次のようなテキストを含むコマンドから「ThinkpadExtraButtons」デバイスのイベントハンドラー番号を取得したいとします。
I: Bus=0011 Vendor=0001 Product=0001 Version=ab54
N: Name="AT Translated Set 2 keyboard"
H: Handlers=sysrq kbd event3
B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
I: Bus=0019 Vendor=17aa Product=5054 Version=4101
N: Name="ThinkPad Extra Buttons"
P: Phys=thinkpad_acpi/input0
H: Handlers=rfkill kbd event7
B: KEY=18040000 0 10000000000000 0 101501b00102004 8000000001104000 e000000000000 0
I: Bus=0003 Vendor=04f2 Product=b2ea Version=0518
N: Name="Integrated Camera"
P: Phys=usb-0000:00:1a.0-1.6/button
次のような出力を生成するには
H: Handlers=rfkill kbd event7
レコード範囲パターンを使用すると、「Thinkpad Extra Buttons」ブロックだけを取得できますが、次のような別の検索パターンを追加しようとしています。
cat /proc/bus/input/devices | awk '/Think/,/event/ {print}; /event/ {print $2}
「ThinkpadExtraButtons」の行だけでなく、関連のないすべてのHandlers行を取得します
Handlers=event0
Handlers=kbd
Handlers=kbd
Handlers=sysrq
N: Name="ThinkPad Extra Buttons"
P: Phys=thinkpad_acpi/input0
S: Sysfs=/devices/platform/thinkpad_acpi/input/input7
U: Uniq=
H: Handlers=rfkill kbd event7
Handlers=rfkill
Handlers=kbd
Handlers=event9
Handlers=event10
その範囲パターンの結果を別のawkコマンドにパイプして、H:Handlers行で検索できることに気付きました。ただし、Thinkpadという名前のデバイスを複数見つけたい場合は機能しませんが、実際にはawkがこの種のことを実行できるはずであり、まだ理解していないので困っています。