Bash awk不从管道读取数据

Bash awk不从管道读取数据,bash,awk,Bash,Awk,我是awk和shell脚本的新手。 执行此命令时: ~$ sudo cat /dev/ttyUSB0 它打印: SOFTPAY:F:isoutl.c|L:01301|( SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121947070700203231313030323832 SOFTPAY:F:isoutl.c|L:01311|) SOFTPAY:F:isoutl.c|L:01301|( SOFTPAY:F:is

我是awk和shell脚本的新手。 执行此命令时:

~$ sudo cat /dev/ttyUSB0
它打印:

SOFTPAY:F:isoutl.c|L:01301|(
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121947070700203231313030323832
SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01301|(
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121947070700203231313030323832
SOFTPAY:F:isoutl.c|L:01311|)

SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000122009070700203030323131303032383200340032307C6458EE3A4EF4C37D5BEBD6D609A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01301|(
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000122009070700203030323131303032383200340032307C6458EE3A4EF4C37D5BEBD6D609A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121546070700203231313030323832
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121546070700203231313030323832
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000121603070700203030323131303032383200340032AE66FF30893AD0E4ABF1E6F6C17F229AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000121603070700203030323131303032383200340032AE66FF30893AD0E4ABF1E6F6C17F229AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
当我执行:

~$ sudo cat /dev/ttyUSB0 | grep --line-buffered "SOFTPAY:F:isoutl.c|L:01307|"
它打印:

SOFTPAY:F:isoutl.c|L:01301|(
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121947070700203231313030323832
SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01301|(
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121947070700203231313030323832
SOFTPAY:F:isoutl.c|L:01311|)

SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000122009070700203030323131303032383200340032307C6458EE3A4EF4C37D5BEBD6D609A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01301|(
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000122009070700203030323131303032383200340032307C6458EE3A4EF4C37D5BEBD6D609A1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
SOFTPAY:F:isoutl.c|L:01311|)
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121546070700203231313030323832
SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000121546070700203231313030323832
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000121603070700203030323131303032383200340032AE66FF30893AD0E4ABF1E6F6C17F229AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
SOFTPAY:F:isoutl.c|L:01307|600000002008102018010002800004920000121603070700203030323131303032383200340032AE66FF30893AD0E4ABF1E6F6C17F229AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
当我打字时:

~$ sudo cat /dev/ttyUSB0 | grep --line-buffered "SOFTPAY:F:isoutl.c|L:01307|" | uniq
它打印出:

SOFTPAY:F:isoutl.c|L:01307|600020000008002018010000800000920000104334070700203231313030323832
SOFTPAY:F:isoutl.c|L:01307|60000000200810201801000280000492000010435107070020303032313130303238320034003228D4F55F51CBFF1D673D037DBBE5BADCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
但当我执行时:

~$ sudo cat /dev/ttyUSB0 | grep --line-buffered "SOFTPAY:F:isoutl.c|L:01307|" | uniq | awk ' {FS="|"; print $3;}' 

它不打印任何内容。

您的
awk
命令应该是:

awk -F'|' '{print $3}'
按照您的方式,设置字段分隔符太晚了

或者,您可以在
awk
脚本中的
BEGIN
块中设置它,如下所示:

awk 'BEGIN {FS="|"}; {print $3}'
或者您可以使用
cut
命令:

cut -d\| -f3

听起来好像uniq正在等待
/dev/ttyUSB0
关闭或发送更多输出

Adam Batkin发布了此答案,但删除了:

uniq
命令仅在看到一行 与前一行不同。例外情况是最后一行(或 它将在
EOF
处打印的一组行)。但是如果它没有得到一个
EOF
,最后一行(或一组行)将永远不会打印


我找到了/dev/ttyUSB0不发送Eof字符。当我将消息保存到文件并执行命令时:

sudo cat ./myfile | grep --line-buffered "SOFTPAY:F:isoutl.c|L:01307|" | uniq | awk -F "|" '{print $3}'

它起作用了

我赞成你的建议,使用
cut
而不是
awk
@JacobKrall
cut
非常合适。很好的编辑,顺便说一句。对不起你们,我的awk脚本不好,但它能工作。我尝试了以下命令,但仍然不起作用:~$sudo cat/dev/ttyUSB0 | grep--行缓冲“SOFTPAY:F:isoutl.c | L:01307 |”| uniq | cut-d\ |-f3@user2767553您的awk脚本将无法工作,因为它在读取第一行之后才设置字段分隔符,这对于它使用该分隔符分割字段来说太晚了。因此,它将在第一条线路上出错,尽管它将在其余线路上工作。至于你的问题,试着只运行cat命令,然后运行带有grep的cat,然后运行带有uniq的grep的cat。每一个都能正常工作吗?那没有意义。试着去掉
--line buffered
选项。如果从管道中删除
uniq
,会发生什么情况?@Jacob Krall:它工作正常。我不能理解