awk不读取管道

时间:2014-07-07 03:53:08

标签: 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: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|)

执行时:

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

打印:

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;}' 

它什么都不打印。

3 个答案:

答案 0 :(得分:2)

您的awk命令应为:

awk -F'|' '{print $3}'

你拥有它的方式,你过早地设置你的字段分隔符。

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

awk 'BEGIN {FS="|"}; {print $3}'

或者您可以改为使用cut命令:

cut -d\| -f3

答案 1 :(得分:0)

听起来uniq等待/dev/ttyUSB0关闭或发送更多输出。

Adam Batkin发布了这个答案,但删除了它:

  

uniq命令只会在看到一行时返回输出   与前一行不同。例外是最后一行(或   它将在EOF打印的一组行。但如果它没有得到   EOF,永远不会打印最后一行(或一组行)。

答案 2 :(得分:0)

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

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

有效!