我正在寻找awk和bash命令的一些帮助, 我的项目有一个嵌入式(非常有限)的硬件, 我需要运行一个名为“digitalio show”的特定命令 命令输出为:
doc.child("trk").child("name")
我需要提取输入参数并将其转换为Active或Passive,并将它们记录到带时间戳的文件中。
日志文件应如下所示:
Input=0x50ff <-- last char only change
Output=0x7f
OR
Input=0x50fd <-- last char only change
Output=0x7f
仅记录更改
命令“digitalio show”是一个嵌入式特定命令,在执行时给出I / O状态,所以我基本上需要使用我有的最小工具将I / O中的每个更改记录到一个文件中在嵌入式H / W中。
我可以每500毫秒运行一次命令,但是如果我将记录所有输出,我可以非常快速地完成闪存,所以我只需要更改日志。
最后这将作为背景守护进行。
谢谢!
Rotem公司。
答案 0 :(得分:0)
据我了解,单次运行digitalio show
命令会输出以下格式的两行:
Input=HEX_NUMBER
Output=0x7f
其中HEX_NUMBER
为0x50ff
或0x50fd
。假设,前者代表&#34; Active&#34;后者代表&#34;被动&#34;。
每500毫秒运行一次命令需要保持状态。最明显的实现是带有sleep
的循环。
但是,sleep
实施方式各不相同。其中一些支持浮点参数(小数秒),有些则不支持。例如,GNU implementation接受任意浮点数,但standard UNIX implementation保证暂停执行至少整数秒。但是,有很多选择。例如,killproc的usleep
接受微秒。或者,您可以编写自己的实用程序。
让我们选择usleep
命令。然后Bash脚本可能如下所示:
#!/bin/bash -
last_state=
while true ; do
i=$(digitalio show | awk -F= '/Input=0x[a-zA-Z0-9]+/ {print $2}')
if test "$i" = "0x50ff" ; then
state="Active"
else
state="Passive"
fi
if test "$state" != "$last_state" ; then
printf '%s;%s\n' $(date '+%Y%m%d%H%M%S') "$state"
fi
last_state="$state"
usleep 500000
done
示例输出
20161019103534;Active
20161019103555;Passive
脚本在无限循环中启动digitalio show
命令,然后使用Input
从awk
行中提取十六进制部分。
$state
变量分配给"Active"
或&#34; Passive
&#34;取决于十六进制字符串的值。
$last_state
变量在最后一次迭代中保留$state
的值。如果$state
不等于$last_state
,则状态将以特定格式打印到标准输出。