Сохранять '\ n' перевод строки в возвращаемом тексте через ssh - PullRequest
0 голосов
/ 30 октября 2019

Если я выполняю команду поиска с использованием 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 вернуть его обратно. Кажется пустой тратой, поскольку я просто хочу просматривать удаленные результаты локально.

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Хорошо, вопрос является дубликатом этого вопроса, Почему командная подстановка оболочки поглощает завершающий символ новой строки? , поэтому частично ответили.

Однако я говорю частично, какответы говорят вам о причинах, по которым это происходит как таковое, но единственным ключом к решению является небольшой ответ в самом конце.

Решение состоит в том, чтобы процитировать аргумент 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

но нет объяснения, почему это работает как таковое, поскольку предполагается, что переменная является строкой, поэтому должна печататься как ожидалось. Однако чтение Расширение переменной внутри одинарных кавычек в команде в Bash дает ключ к сохранению символов новой строки и т. Д. В строке. Помещение переменной, выводимой echo в кавычки, сохраняет содержимое абсолютно, и вы получите ожидаемый результат.

2 голосов
/ 30 октября 2019

Когда вы выводите переменную 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.

0 голосов
/ 30 октября 2019

Переменная 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}"

...