Bash awk不从管道读取数据
我是awk和shell脚本的新手。 执行此命令时: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
~$ 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
@JacobKrallcut
非常合适。很好的编辑,顺便说一句。对不起你们,我的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:它工作正常。我不能理解