【发布时间】:2013-02-15 12:47:02
【问题描述】:
为什么awk 不适用于以下命令而不是sed:
su -c "stdbuf -i0 -o0 -e0 od --width=144 -x /dev/input/event3 | sed 's%^\([a-z0-9]\+ \)\{11\}%%;s%\(....\).*%\1%'"
这会在每次按键时打印 所按键的 USB HID ID 编号。
示例输出(0028 用于 Return,00e4 用于 Right-Ctrl):
0028
0028
0028
0028
0028
00e4
00e4
00e4
这是两行输出没有 sed/cut/awk 过滤时按下 Return 两次。 USB HID ID 编号在第 12 列:
0000000 2d6f 511e 0000 0000 051b 0007 0000 0000 0004 0004 0028 0007 2d6f 511e 0000 0000 051d 0007 0000 0000 0001 001c 0000 0000 2d6f 511e 0000 0000 051e 0007 0000 0000 0000 0000 0000 0000 2d73 511e 0000 0000 a150 0007 0000 0000 0004 0004 0028 0007 2d73 511e 0000 0000 a153 0007 0000 0000 0001 001c 0001 0000 2d73 511e 0000 0000 a154 0007 0000 0000 0000 0000 0000 0000
0000220 2d73 511e 0000 0000 9b5a 0008 0000 0000 0004 0004 0028 0007 2d73 511e 0000 0000 9b5d 0008 0000 0000 0001 001c 0000 0000 2d73 511e 0000 0000 9b5e 0008 0000 0000 0000 0000 0000 0000 2d74 511e 0000 0000 4f90 0005 0000 0000 0004 0004 0028 0007 2d74 511e 0000 0000 4f93 0005 0000 0000 0001 001c 0001 0000 2d74 511e 0000 0000 4f94 0005 0000 0000 0000 0000 0000 0000
我试过了
su -c "stdbuf -i0 -o0 -e0 od --width=144 -x /dev/input/event3 | cut -d' ' -f12"
它也有效。但它只显示在接下来的两次按键之后按下的按键。 stdbuf 在这里没有帮助,尽管它应该将标准输入/输出/错误流缓冲调整为 0。
我的mawk 命令如下所示:
su -c "stdbuf -i0 -o0 -e0 od --width=$((48*3)) -x /dev/input/event3 | mawk '{ print $12 }'"
但它只显示了一些二,然后是一些换行符,然后是二。它似乎非常滞后/缓慢。当我按下一个键时,什么也没有发生。在按不同的键多次后,我总是得到一堆二字和换行符。 无论我按了哪个键!示例:
2
2
2
2
2
2
2
2
2
2
2
2
我该如何解决这个问题?为什么会出现这种情况?
更新
当我使用gawk 而不是mawk 时,它不再滞后(无缓冲)。但是我仍然没有看到正确的值应该是 0028 或 00e4 等等 Return 和 Right-Ctrl 作为示例键。
【问题讨论】:
-
尝试将 '-u' 添加到 awk 调用中,使其不缓冲输出。
-
我在这个系统上有 mawk 1.3.3,它告诉我
awk: not an option: -u -
我安装了 gawk。它也没有选项
-u,但输出似乎没有缓冲。所以,我的最后一个问题是:为什么它只显示二(2)? -
你试过用
dd吗? -
@sotapme 你什么意思?而不是什么?使用 dd 读取事件设备并将其传递给 od?
标签: shell sed stream awk keyboard-events