从shell脚本到终端的二进制数据

时间:2014-05-02 15:34:47

标签: linux bash shell echo avro

我正在尝试将apache avro-tools(avro-tools-1.7.5.jar)concat实用程序包装成正确的通配(如所写的,所有要连接的文件都需要完全写出来)。需要此实用程序是因为常规cat(或在我的情况下hadoop fs -cat)操作将生成带有中间标题的数据并导致avro解析实用程序出错。我写了一个名为catavro.sh的简单shell脚本:

avrohdfs='hadoop jar /path/to/jar/avro-tools-1.7.5.jar'
DIRS=`hadoop fs -ls $1 | egrep '.avro' | awk '{print $8}'`
echo `$avrohdfs concat $DIRS -`  # dash (-) tells utility to print to stdout

这确实很重要,但如果我运行bash catavro.sh [path to avro data on hdfs] > tmp.avro,结果就是一个损坏的avro文件。尝试读取架构时会抛出错误,或者执行其他操作。如果我用shell脚本替换shell脚本中的最后一行:

echo $avrohdfs concat $DIRS -

仅打印命令,然后在终端上运行生成的命令,将结果存储到同一个tmp.avro文件中,操作很顺利。 tmp.avro的文件大小有点大。

我很确定echo命令应该归咎于此,它似乎破坏了avro-tools concat unitlity产生的二进制数据。用:

替换sh文件的最后一行
`$avrohdfs concat $DIRS - > tmp.avro`

产生与返回命令并在终端中运行命令相同(成功)的结果。但是,虽然我可以写入文件,但如果我可以将其返回到stdout,那么对我来说会更好,这样它就可以通过管道传输到我拥有的过滤工具中。

echo有哪些替代方案?我尝试用以下所有内容替换脚本中的最后一行但没有成功:

echo -E `$avrohdfs concat $DIRS -`
`$avrohdfs concat $DIRS -`
$($avrohdfs concat $DIRS -)
cat `$avrohdfs concat $DIRS -`
trap `$avrohdfs concat $DIRS -` 0 #sort of works, but data misses the ">tmp.avro" and spits into the termal

我检查了PATH变量,它在我的终端和shell脚本中是相同的。非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

问题是shell将参数解释为echo并将换行符转换为空格并删除重复的空格。您可以使用双引号来阻止:

echo "`$avrohdfs concat $DIRS -`"

或者更好的是,只需运行命令,不需要任何echo或其他任何内容:

$avrohdfs concat $DIRS -