Используйте это для запуска ssh из скрипта:
ssh -i {privateKey} -o StrictHostKeyChecking=no {userName}@{serverIp} "{command}"
Пример:
ssh -i privateKey -o StrictHostKeyChecking=no user@127.0.0.1 "mkdir testFolder"
Эта команда создаст тестовую папку из кода скрипта.
Если вы работаете в Linux или иным образом имеете доступ к GNU grep
, вы можете сделать:
$ grep -oP '"name":"\K[^"]+' file
sLVZt
ubg9x
lo3Qp
Альтернативно, в Perl:
$ perl -lne 'print join "\n", /"name":"([^"]+)/g' file
sLVZt
ubg9x
lo3Qp
Попробуйте это,
sed 's/,/\n/g' file | awk -F '"' '$2~/name/ {print $(NF-1)}'
sLVZt
ubg9x
lo3Qp
Чистоawk
-решение могло бы выглядеть так:
awk -F':' -v RS=',' '$1 ~ /"name"$/ {print $2}' file
Это примет ввод и разделит «записи» (, что обычно означает строку )в ,
, а затем всю запись на поля в :
, оставив два поля. за запись. Если первое поле заканчивается в "name"
(, это учитывает начальные квадратные/фигурные скобки ), выведите второе поле, которое является значением после :
.
Если вы хотите избавиться от двойных кавычек, вы можете использовать
awk -F':' -v RS=',' '$1 ~ /"name"$/ {gsub("\"","",$2); print $2}' file
Обновление
Поскольку ваш измененный входной образец содержит начальный "snapshots":
, который также включает :
, но в «несбалансированном» виде, это больше не будет работать.Поскольку в моем ответе указано «чистоawk
-основано», единственная возможная адаптация будет гораздо более сложной и будет выглядеть примерно так:
awk '{n=patsplit($0,field,"\"[^\"]*\":\"[^\"]*\""); for (i=1;i<=n;i++) {split(field[i],elem,":"); if (elem[1]=="\"name\"") print elem[2];};}' file
Ясно, что это гораздо менее элегантно, чем подходы на основе grep
-, а также менее переносимый (не будет работать на mawk
, например. ).
Попробуйте также
grep -oE ".name.:[^,]*" file | awk -F\" '{print $(NF-1)}'
sLVZt
ubg9x
lo3Qp
Предполагая, что ваш документ JSON действителен, например
{"snapshots":[{"name":"sLVZt","user":"comment","current":"n","created":"2015-03-11 05:28:02"},{"name":"ubg9x","user":"test2"},{"name":"lo3Qp","user":"test3","current":"y","created":"2015-03-11 06:02:46"}]}
или (, поскольку пробелы данных, отличные от -, не имеют значения для формата ),
{
"snapshots": [
{
"name": "sLVZt",
"user": "comment",
"current": "n",
"created": "2015-03-11 05:28:02"
},
{
"name": "ubg9x",
"user": "test2"
},
{
"name": "lo3Qp",
"user": "test3",
"current": "y",
"created": "2015-03-11 06:02:46"
}
]
}
затем используйте jq
вот так:
$ jq -r '.snapshots[].name' file.json
sLVZt
ubg9x
lo3Qp
Это извлекает значения ключа name
в каждом элементе массива snapshots
.
Вы также можете легко отфильтровать результат на основе значений других ключей различными способами:
$ jq -r '.snapshots[] | select(.current == "y").name' file.json
lo3Qp
$ jq -r '.snapshots[] | select(.current != "n").name' file.json
ubg9x
lo3Qp
Пробовал с помощью команды «Ниже», сработало нормально
perl -pne "s/[,]/\n/g" filename| awk -F ":" '/name/{gsub(/\"/,"",$NF);print $NF}'
выход
sLVZt
ubg9x
lo3Qp