通过ssh在返回的文本中保留'\ n'换行符

问题描述 投票:0回答:3

如果我在本地命令行中执行带有grep和sort等的find命令,则会得到如下返回的行:

# find ~/logs/ -iname 'status' | xargs grep 'last seen' | sort --field-separator=: -k 4 -g
0:0:line:1
0:0:line:2
0:0:line:3

如果我在ssh上执行相同的命令,则返回的文本将不使用换行符打印,如下所示:

# VARcmdChk="$(ssh ${VARuser}@${VARserver} "find ~/logs/ -iname 'status' | xargs grep 'last seen' | sort --field-separator=: -k 4 -g")"
# echo ${VARcmdChk}
0:0:line:1 0:0:line:2 0:0:line:3

我试图理解ssh为什么要对返回的文本进行消毒,以便将换行符转换为空格。我还没有尝试输出到文件,然后使用scp将其拉回。似乎很浪费,因为我只想在本地查看远程结果。

linux bash ssh opensuse
3个回答
2
投票

当回显变量VARcmdChk时,应将其用"括起来。

$ VARcmdChk=$(ssh ${VARuser}@${VARserver} "find tmp/ -iname status -exec grep 'last seen' {} \; | sort --field-separator=: -k 4 -g")
$ echo "${VARcmdChk}"
last seen:11:22:33:44:55:66:77:88:99:00
last seen:00:99:88:77:66:55:44:33:22:11

请注意,我已将xargs替换为-exec


2
投票

[好,问题是此问题的重复,Why does shell Command Substitution gobble up a trailing newline char?,部分回答。

但是,我会部分回答,因为答案告诉您发生这种情况的原因,但是解决方案的唯一线索是最后有一个小的答案。

解决方案是引用echo参数,如解决方案所示:

# VARcmdChk="$(ssh ${VARuser}@${VARserver} "find ~/logs/ -iname 'status' | xargs grep 'last seen' | sort --field-separator=: -k 4 -g")"
# echo "${VARcmdChk}"
0:0:line:1
0:0:line:2
0:0:line:3

但是没有解释为什么这样做会如此,因为假设变量是字符串,所以应该按预期打印。但是,读取Expansion of variable inside single quotes in a command in Bash提供了有关在字符串中保留换行符等的线索。将要通过回显打印的变量放在引号中可以完全保留内容,并且可以得到预期的输出。


0
投票

echo变量就是为什么将其全部放入一行。运行以下命令将按预期输出结果:

ssh ${VARuser}@${VARserver} "find ~/logs/ -iname 'status' | xargs grep 'last seen' | sort --field-separator=: -k 4 -g"

要使命令输出将每个结果都放在换行上,就像在本地运行命令时一样,可以使用awk将结果拆分到新行上。

awk '{print $1"\n"$2}'

此方法可以像这样附加到您的命令中:

echo ${VARcmdChk} | awk '{print $1"\n"$2"\n"$3"\n"$4}'

或者,您可以根据您的答案在变量周围加上引号:

echo "${VARcmdChk}"

© www.soinside.com 2019 - 2024. All rights reserved.