Мне нужно получить значение после определенного слова

Используйте это для запуска ssh из скрипта:

ssh -i {privateKey} -o StrictHostKeyChecking=no {userName}@{serverIp} "{command}"

Пример:

ssh -i privateKey -o StrictHostKeyChecking=no user@127.0.0.1 "mkdir testFolder"

Эта команда создаст тестовую папку из кода скрипта.

0
13.03.2020, 11:50
6 ответов

Если вы работаете в Linux или иным образом имеете доступ к GNU grep, вы можете сделать:

$ grep -oP '"name":"\K[^"]+' file 
sLVZt
ubg9x
lo3Qp

Альтернативно, в Perl:

$ perl -lne 'print join "\n", /"name":"([^"]+)/g' file 
sLVZt
ubg9x
lo3Qp
1
28.04.2021, 23:20

Попробуйте это,

 sed 's/,/\n/g' file | awk -F '"' '$2~/name/ {print $(NF-1)}'

sLVZt
ubg9x
lo3Qp
0
28.04.2021, 23:20

Чисто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, например. ).

0
28.04.2021, 23:20

Попробуйте также

grep -oE ".name.:[^,]*" file | awk -F\" '{print $(NF-1)}'
sLVZt
ubg9x
lo3Qp
0
28.04.2021, 23:20

Предполагая, что ваш документ 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
4
28.04.2021, 23:20

Пробовал с помощью команды «Ниже», сработало нормально

perl -pne "s/[,]/\n/g" filename| awk -F ":" '/name/{gsub(/\"/,"",$NF);print $NF}'

выход

sLVZt
ubg9x
lo3Qp
0
28.04.2021, 23:20

Теги

Похожие вопросы