sudo hexdump -v -e '1/1 "%02x\n"' /dev/ttyUSB0 | awk '$1=="ed" {
getline byte1
getline byte2
number = strtonum("0x" substr(byte2,2,1))+2
data =" ::ED." byte1"."byte2
while(number-->0)
{getline byte; data = data"."byte}
print data"."
}' | tr '[a-z]' '[A-Z]'| grep -v '^.....00'
我正在运行这个小脚本,并且尝试将时间戳附加到每行以毫秒为单位(这应该是实时值),而不是所有行的静态值。我期待这样的输出,
:: 144146 ::ED.数据
:: 144146 ::ED.数据
:: 144146 ::ED.数据
我应该得到毫秒值,而不是每行中的 144146,并且这些值应该不同。我有一个 python 脚本来满足我正在寻找的内容
导入时间
def timestamp():
now = time.time()
localtime = time.localtime(now)
milliseconds = '%03d' % int((now - int(now)) * 1000)
return time.strftime('%Y%m%d%H%M%S', localtime) + milliseconds
value = timestamp()
print value
无论如何,我可以在我的脚本中实现相同的功能吗?
答案1
如果您使用两个非便携式设备,这是可能的:
- GNU awk 的双向 I/O(请参阅相关的 StackOverflow 答案);
- 毫秒输出
date
(参见服务器故障解答)。
这样,您就可以在输入中添加时间戳作为前缀,如下所示:
awk '{"date +%Y%m%d%H%M%S%3N" |& getline timestamp;
print timestamp,$0;
close("date +%Y%m%d%H%M%S%3N")}'
(请注意,这close
是强制性的,并且那里的字符串应该与您在第 1 行运行的命令相匹配。有关详细信息,请参阅上述 SO 答案。)
将其合并到您的程序中,您将得到:
sudo hexdump -v -e '1/1 "%02x\n"' /dev/ttyUSB0 | awk '$1=="ed" {
getline byte1
getline byte2
number = strtonum("0x" substr(byte2,2,1))+2
"date +%Y%m%d%H%M%S%3N" |& getline timestamp;
data = timestamp " ::ED." byte1"."byte2
close("date +%Y%m%d%H%M%S%3N")
while(number-->0)
{getline byte; data = data"."byte}
print data"."
}' | tr '[a-z]' '[A-Z]'| grep -v '^.....00'