【问题标题】:Preserve '\n' newline in returned text over ssh通过 ssh 在返回的文本中保留 '\n' 换行符
【发布时间】:2019-10-30 13:54:16
【问题描述】:

如果我在本地命令行中使用 grep 和 sort 等执行查找命令,我会得到如下返回的行:

# 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


    【解决方案1】:

    当你回显变量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 提供了有关在字符串中保留换行符等的线索。将要通过 echo 打印的变量放在引号中可以绝对保留内容,并且您会得到预期的输出。

      【讨论】:

        【解决方案3】:

        变量的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}"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          相关资源
          最近更新 更多