在程序进入时添加到程序行前面

时间:2017-05-10 18:33:22

标签: bash

我正在运行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)

写入文件和后处理将不起作用,因为我需要处理每一行的时间戳。

我觉得我犯的是一个小错误,但是我找不到任何输入?

3 个答案:

答案 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更短更有效的解决方案。