每次处理从 tail -f 传输的一行输入时,如何使 awk 执行(即重新执行)系统命令(例如日期)
How to make awk execute (i.e. re-execute) a system command (e.g. date) each time a line of input piped from tail -f is processed
我正在尝试将当前时间添加到从不断增长的文本文件的每一行中提取的几列中,然后打印到屏幕上。
tail -f dumpfile.txt|awk '{ "date +%T"|getline curtime;print curtime, , }'
文件中的示例输入行是:
N 7056 65433 flags 0dbc a000 OK 0
上面的命令从尾部打印每一行,但是它只执行一次date
,即启动命令行的时间:
Desired Actual
13:10:05 7050 OK 13:10:04 7050 OK
13:10:05 7051 OK 13:10:04 7051 OK
13:10:06 7052 OK 13:10:04 7052 OK
13:10:06 7053 OK 13:10:04 7053 OK
13:10:07 7054 OK 13:10:04 7054 OK
13:10:07 7055 OK 13:10:04 7055 OK
13:10:08 7056 OK 13:10:04 7056 OK
我如何重写它,以便每次进入新行时都执行日期命令?
谢谢。
第一个 getline
耗尽了 date
的输出(因为它只是一行),随后对 getline
的调用失败并保持 curtime
不变。每次读取时都需要关闭与 date +%T
关联的文件描述符,例如:
tail -f dumpfile.txt | awk 'BEGIN{cmd="date +%T"} {cmd|getline curtime; print curtime,,; close(cmd)}'
使用 GNU awk:
| awk '{print strftime("%H:%M:%S", systime()), , }'
输出(示例):
16:58:35 7056 OK
我正在尝试将当前时间添加到从不断增长的文本文件的每一行中提取的几列中,然后打印到屏幕上。
tail -f dumpfile.txt|awk '{ "date +%T"|getline curtime;print curtime, , }'
文件中的示例输入行是:
N 7056 65433 flags 0dbc a000 OK 0
上面的命令从尾部打印每一行,但是它只执行一次date
,即启动命令行的时间:
Desired Actual
13:10:05 7050 OK 13:10:04 7050 OK
13:10:05 7051 OK 13:10:04 7051 OK
13:10:06 7052 OK 13:10:04 7052 OK
13:10:06 7053 OK 13:10:04 7053 OK
13:10:07 7054 OK 13:10:04 7054 OK
13:10:07 7055 OK 13:10:04 7055 OK
13:10:08 7056 OK 13:10:04 7056 OK
我如何重写它,以便每次进入新行时都执行日期命令?
谢谢。
第一个 getline
耗尽了 date
的输出(因为它只是一行),随后对 getline
的调用失败并保持 curtime
不变。每次读取时都需要关闭与 date +%T
关联的文件描述符,例如:
tail -f dumpfile.txt | awk 'BEGIN{cmd="date +%T"} {cmd|getline curtime; print curtime,,; close(cmd)}'
使用 GNU awk:
| awk '{print strftime("%H:%M:%S", systime()), , }'
输出(示例):
16:58:35 7056 OK