-1

为什么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是 forReturn00e4for Right-Ctrl):

0028
0028
0028
0028
0028
00e4
00e4
00e4

这是按两次时没有 sed//过滤的两行输出cut。USB HID ID 编号在第 12 列:awkReturn

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它时不再滞后(无缓冲)。但是我仍然看不到正确的值应该是0028or00e4等​​等ReturnRight-Ctrl作为示例键。

4

1 回答 1

0

带着所有的评论,我找到了解决方案。

@Olivier Dulac 让我想到有不同的awk实现,这解决了滞后问题(使用gawk而不是mawk)。我什至不需要stdbuf.

@Ed Morton 的想法给我带来了一个问题,因为他"在示例中使用了引号。我已经在我的声明中引用了整件事,因为它是使用su. 所以我不得不逃离他们。

我的整个陈述看起来像这样(注意 12 前面的转义美元符号):

su -c "od --width=144 -x /dev/input/event3 | awk '{ print \$12 }'"

现在它按预期工作。

于 2013-02-15T19:17:30.397 回答