【问题标题】:awk instead of sed is not working (slow, laggy and wrong output)awk 而不是 sed 不起作用(缓慢、滞后和错误的输出)
【发布时间】: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 用于 Return00e4 用于 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 时,它不再滞后(无缓冲)。但是我仍然没有看到正确的值应该是 002800e4 等等 ReturnRight-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


【解决方案1】:

借助所有的 cmets,我找到了解决方案。

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

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

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

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

现在它按预期工作了。

【讨论】:

  • 如果您最初告诉我们脚本在 su -c 引号内,我希望您会立即得到答复,告诉您问题出在哪里,而不是几个人浪费时间试图弄清楚从你说你正在使用的命令行中取出。
  • 很抱歉。我已经了解了这一点,并将在未来发布整个命令。
猜你喜欢
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2019-12-18
  • 2020-01-21
相关资源
最近更新 更多