我正在运行xinput测试并尝试为数据添加时间戳。
从另一个问题来看,我正在使用:
xinput test $KEYBOARD_ID | (echo -n $(date +"$date_format") && cat) > $LOGFILE_NAME
然而,这是第一行的日期,而不是每一行。
如果我做一个while循环:
while IFS= read -r line
do
echo -n $(date +"date_format") &&cat)
done < $(xinput test $KEYBOARD_ID)
循环立即退出,因为xinput测试尚未生成任何文本。
进程替换也失败了,只是约会文件的第一行。
while IFS= read -r line
do
(echo -n $(date +"$date_format") && cat) > $LOGFILE_NAME
done < <(xinput test $KEYBOARD_ID)
写入文件和后处理将不起作用,因为我需要处理每一行的时间戳。
我觉得我犯的是一个小错误,但是我找不到任何输入?
答案 0 :(得分:2)
也许这会有所帮助......
$ seq 10 | xargs -n1 -I {} echo $(date) {}
Wed May 10 14:43:09 EDT 2017 1
Wed May 10 14:43:09 EDT 2017 2
Wed May 10 14:43:09 EDT 2017 3
Wed May 10 14:43:09 EDT 2017 4
Wed May 10 14:43:09 EDT 2017 5
Wed May 10 14:43:09 EDT 2017 6
Wed May 10 14:43:09 EDT 2017 7
Wed May 10 14:43:09 EDT 2017 8
Wed May 10 14:43:09 EDT 2017 9
Wed May 10 14:43:09 EDT 2017 10
请注意,如下所示,如果您希望按user000001
为gawk
解决方案添加时间戳,则不会为每一行更新此时间戳。
答案 1 :(得分:2)
以下GNU awk命令相当于@ karakfa的答案,但启动的进程更少,因此如果设备生成大量事件可能会更快:
xinput test "$KEYBOARD_ID" | gawk '{print strftime(), $0}' > "$LOGFILE_NAME"
答案 2 :(得分:1)
我觉得我犯了一个小错误,但我找不到它
是的。它是cat
。它读取输入的其余部分并将其放在那里。相反,您应该只写当前行,并将其附加到文件:
while IFS= read -r line
do
(echo "$(date +"$date_format") $line") >> $LOGFILE_NAME
done < <(xinput test $KEYBOARD_ID)
哪个可以更正规地写为
while IFS= read -r line
do
echo "$(date +"$date_format") $line"
done < <(xinput test $KEYBOARD_ID) > "$LOGFILE_NAME"
我会选择@ user000001更短更有效的解决方案。