2013-04-29 88 views
1

这是我的第一个问题:)远程SSH命令,在标准输出缺少LF

我在运行远程SSH命令时遇到问题。问题是该命令的输出将返回一个不带LF的字符串来分隔行。我自己检查了Hive的输出,它通常输出LF,当我从远程主机运行命令时,它们缺失。有没有办法维护远程主机的输出?

这里的代码片段:

#!/bin/bash 
partition="2013-04-02" 
query=$(cat <<EOF 
set mapred.job.name="Unique IP - $partition"; 
select 
distinct 
src 
,dst 
,service 
,proto 
,action 
from 
logs 
where 
src rlike "^10\." 
and src not rlike "^10\.90\." 
and src not rlike "^10[0-9]\." 
and src not rlike "\.5[2-8]$" 
and dst <> "" 
and day="$partition"; 
EOF) 

ssh=`ssh [email protected] "hive -S -e '$query' 2>&1" 
echo $ssh > output.tsv 

回答

2

它有在那里换行(一个或多个),但你没有看到他们,因为你没有周围的参数扩展双引号中的echo命令。

echo "$ssh" >output.tsv 

ETA:本$( ... )语法命令替换一般比`...`语法要好得多,因为它的巢,并与嵌套的引号工作三立。虽然它并没有在这种情况下无所谓,这是很好的引用命令替换的习惯来获得,以及:

ssh="$(ssh [email protected] "hive -S -e '$query' 2>&1")" 

注意,$( .. )里面的双引号不会引起任何问题用外引号标出。

最后,如果你正在使用这个值做的是呼应成一个文件,你可以跳过变量,只是其重定向到那里摆在首位:

ssh [email protected] "hive -S -e '$query' 2>&1" >output.tsv 

或只是

ssh [email protected] "hive -S -e '$query' " >&output.tsv 
+0

感谢您的帮助!这样简单的解决方案! – Daedalus8 2013-04-29 17:31:01

+0

最后一个适合我。 – Saad 2014-05-12 11:22:22

0

各地ssh …的反引号的转换你的换行符为空格,因为他们应该。

尝试

ssh [email protected]op "hive -S -e '$query' 2>&1" > output.tsv 
+0

不,反引号不会转换任何东西。这是'echo $ ssh',由于缺少引号,所以会进行空白转换。 – 2013-04-30 03:43:58