使用awk和bash监视exec输出到日志

时间:2016-10-18 15:46:59

标签: linux bash shell awk

我正在寻找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公司。

1 个答案:

答案 0 :(得分:0)

据我了解,单次运行digitalio show命令会输出以下格式的两行:

Input=HEX_NUMBER
Output=0x7f

其中HEX_NUMBER0x50ff0x50fd。假设,前者代表&#34; Active&#34;后者代表&#34;被动&#34;。

每500毫秒运行一次命令需要保持状态。最明显的实现是带有sleep的循环。

但是,sleep实施方式各不相同。其中一些支持浮点参数(小数秒),有些则不支持。例如,GNU implementation接受任意浮点数,但standard UNIX implementation保证暂停执行至少整数秒。但是,有很多选择。例如,killprocusleep接受微秒。或者,您可以编写自己的实用程序。

让我们选择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命令,然后使用Inputawk行中提取十六进制部分。

$state变量分配给"Active"或&#34; Passive&#34;取决于十六进制字符串的值。

$last_state变量在最后一次迭代中保留$state的值。如果$state不等于$last_state,则状态将以特定格式打印到标准输出。