Bash 连续串行数据流上的命令行编号操作

Bash 连续串行数据流上的命令行编号操作,bash,serial-port,numbers,Bash,Serial Port,Numbers,我在命令行中运行以下命令: prog1 | prog2 上面的输出(例如,X)是一个4位十六进制数,例如FA34。 prog1是一个java程序,它每100ms读取一次串行数据prog2是cut命令,用于剪切我需要的部分。这工作正常,我可以在标准输出上每隔100ms看到所需的值 我想要的是: prog1 | prog2 | 如何在命令行中一次性使用管道或不使用管道来执行此操作 注意:我编写了一个bash脚本来将X转换为十进制并乘以2。但我无法将X作为参数导入脚本。这会将prog2的输出读取为变量

我在命令行中运行以下命令:

prog1 | prog2

上面的输出(例如,X)是一个4位十六进制数,例如FA34。
prog1
是一个java程序,它每100ms读取一次串行数据
prog2
cut
命令,用于剪切我需要的部分。这工作正常,我可以在标准输出上每隔100ms看到所需的值

我想要的是:

prog1 | prog2 |

如何在命令行中一次性使用管道或不使用管道来执行此操作


注意:我编写了一个bash脚本来将X转换为十进制并乘以2。但我无法将X作为参数导入脚本。

这会将prog2的输出读取为变量v,然后将其转换为十进制(使用基本符号
16#v
)并乘以2

prog1 | prog2 | ( read v ; let v=16#$v*2 ; echo $v )
如果流包含多个数字,请将最后一部分更改为

( while read v ; do let v=16#$v*2 ; echo $v ; done )
说明:


使用%d打印将其转换为十进制,bc执行乘法操作。要在管道中执行此操作,可以使用
perl

    prog1 | prog2 | perl -ne 'printf ("%d\n",(hex "$_")*2);'
这将在prog2(-n选项)的ouptut行上循环,并从十六进制(
hex“$\u”
)重新格式化,并在输出为十进制之前乘以2

编辑

您可能需要清除stdout缓冲区,在perl中,您可以使用“$|++”:

 prog1 | prog2 | perl -e '$|++; while(<STDIN>) { chomp; printf ("%d\n",(hex "$_")*2); }'
prog1 | prog2 | perl-e'$|++;while()

这里有一个有趣的可能性:

{ echo "iscale=16"; prog1 | prog2; } | sed 's/$/*2/' | bc

此回响为<代码> ISCALE=16 第一(要告诉<代码> BC/<代码>考虑用户输入的基数16)。然后,

sed
*2
附加到每一行,所有这些都经过bc转换为十进制并乘以2

有一个限制:您的程序
prog2
必须以大写形式输出所有十六进制数字(例如,
FA34
而不是
FA34
)。如果这是一个限制,请使用:

{ echo "iscale=16"; prog1 | prog2; } | sed 's/\(.*\)/\U\1*2/g' | bc

相反。

1。有一个标准的工具-
xargs
prog1 | prog2 | xargs echo“ibase=16;obase=a;2*”| bc
(或类似的东西)2。您可以从bash脚本中的stdin中读取该数字。它没有给出错误,但我在标准输出(我指的是屏幕)上看不到任何内容。您看到prog1 | prog2的输出了吗?如果是这样,您可以发布输出吗?
echo“FA34\nAAAA\nBABA\nBABE\n”| xargs-I^printf“%d*2\n”0x^ | bc
。我已经在bash中测试了上述代码,zsh@imp25@choroba my
prog1 | prog2
java net.tinyos.tools.Listen | cut-c49-50,52-53
。输出如下所示:serial@/dev/ttyUSB0:115200:重新同步0FFF 0FFF 0FFF serial@/dev/ttyUSB0:115200:错误数据包0FFF 0FFF 0FFF。它继续…0FFF只是一个虚拟值。谢谢,解决方案有效。ut,我找到了一个使用gnuplot replot的替代解决方案,以避免我遇到的时间延迟。它没有错误,但我在标准输出(我指的是屏幕)上看不到任何东西。@mlomailom:Try
echo FA34{read v;let v=16#$v*2;echo$v;}
。如果它工作,prog2的输出就有问题。它工作。嗯……这是我的程序1和程序2:java net.tinyos.tools.Listen | cut-c49-50,52-53,它每100ms给我一个十六进制值,比如FA23。有什么想法吗?@mlomailom:更新了无尽流的答案。prog1 | prog1 |(读v时;让v=16#$v*2;echo$v;done)没有错误,但我在标准输出上看不到任何东西(我指的是屏幕)。和我得到的其他两个答案一样。不知道为什么!奇怪。如果您只是尝试打印标准输入,而没有任何格式设置,会发生什么情况?i、 e.
perl-ne'打印“$\n”您可能需要刷新标准输出,使其在管道完成之前更新。我将添加一个编辑作为示例。发生了一些问题。结果如下:
$java net.tinyos.tools.Listen | cut-c49-50,52-53 | perl-e'$|++;while(){chomp;printf(“%d\n”,(十六进制“$”*2);}
result serial@/dev/ttyUSB0:115200:重新同步serial@/dev/ttyUSB0:115200:坏数据包serial@/dev/ttyUSB0:115200:忽略未知数据包类型0x0 serial@/dev/ttyUSB0:115200:坏数据包serial@/dev/ttyUSB0:115200:坏数据包。8190 8190 8190 8190 8190 8190 . . . 8190继续。谢谢,解决方案有效。但是,我用gnuplot replot找到了另一种解决方案,以避免我遇到的时间延迟。
{ echo "iscale=16"; prog1 | prog2; } | sed 's/\(.*\)/\U\1*2/g' | bc