awk - 使用一个 awk 命令在匹配字符串中搜索字符串

标签 awk

我想使用 awk 在匹配字符串中搜索字符串。但是 awk guidesexamples我发现只雇用一场比赛,或 promising sounding SO questions有答案了specific我无法轻易地从他们那里得出一般原则来解决我的问题。

例如,我想从 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

使用record range patterns我可以只取出“Thinkpad Extra Buttons” block ,然后尝试添加另一个搜索模式,如下所示:

cat /proc/bus/input/devices | awk '/Think/,/event/ {print}; /event/ {print $2} 

我得到了所有不相关的处理程序行,而不仅仅是“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 似乎应该能够做这种事情,但我还没有弄清楚这一点,这让我很烦恼。

最佳答案

这种问题很适合逐段处理,而不是逐行处理。 使用 GNU awk:

gawk -v RS='' '
    /N:.*ThinkPad Extra Buttons/ {
        match($0, /(H:.*event[0-9]+)/, a)
        print a[0]
        exit
    }
' /proc/bus/input/devices

如果您愿意超越 awk:

perl -00 -lne 'if (/^N: Name=.ThinkPad Extra Buttons/m) {print /^(H:.*)$/m; exit}' /proc/bus/input/devices

关于awk - 使用一个 awk 命令在匹配字符串中搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15507030/

相关文章:

python - 使用字段数将文件拆分为更小的文件

linux - 十进制值不在 bash 中打印?

linux - 在 bash 中转换日期格式

bash - 将不同文件的列值除以一个常数,然后输出一个减去另一个

regex - 使用 Regex 工具将一个字符串附加到另一个字符串

用于删除重复行的 Bash 脚本,仅当它重复前一行时

shell - 如何删除shell脚本中的子字符串

linux - 按字段排序 UNIX

awk - 为每个 n 列值创建新行,同时保持第 1 列值

python - 根据特定标准选择线路