我想使用 awk 在匹配的字符串中搜索字符串。但是我发现的 awk指南和示例只使用了一个匹配项,或者听起来很有希望的 SO 问题的答案非常具体,以至于我无法轻易地从中得出一般原则来解决我的问题。
例如,我想从cat /proc/bus/input/devices
带有如下文本的命令中获取“Thinkpad Extra Buttons”设备的事件处理程序编号:
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}
我得到了所有不相关的 Handlers 行,而不仅仅是“Thinkpad Extra Buttons”的行
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 似乎应该能够做这种事情,但它让我感到困扰,我还没有弄清楚。