Как мне найти следующий текст из текстового файла в пакетном скрипте? - PullRequest
0 голосов
/ 12 июня 2019

Я бился головой о стену, пытаясь решить это.

{
"FleetAttributes": {
    "FleetId": "fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05",
    "FleetArn": "arn:aws:gamelift:us-west-2:321110313936:fleet/fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05",
    "FleetType": "ON_DEMAND",
    "InstanceType": "c4.large",
    "Description": "Development build of Project Genesis",
    "Name": "ProjectGenesis-DevelopmentBuild",
    "CreationTime": 1560297730.139,
    "Status": "NEW",
    "BuildId": "build-0f8b9c4f-56a3-48e3-af28-018383af8fd1",
    "NewGameSessionProtectionPolicy": "FullProtection",
    "OperatingSystem": "WINDOWS_2012",
    "ResourceCreationLimitPolicy": {
        "NewGameSessionsPerCreator": 4,
        "PolicyPeriodInMinutes": 15
    },
    "MetricGroups": [
        "default"
    ]
}

Выше приведено содержимое текстового файла. Я пытаюсь извлечь FleetId в пакетном скрипте, чтобы поместить его в переменную, чтобы потом использовать его для другой команды.

Я пробовал findstr и regex, но они настолько ограничены, что кажутся бесполезными.

Какие есть варианты, чтобы найти текст fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05 и поместить его в переменную?

Regex

Приведенного выше примера регулярного выражения достаточно, чтобы найти его, но я не могу использовать его с findstr, потому что его поддержка расширенных символов не работает.

Ответы [ 4 ]

0 голосов
/ 13 июня 2019

Это работает для Windows cmd,

FOR /F "tokens=2 delims=:," %A IN ('findstr "FleetId" [name_json_file.json]') DO echo %A

Внутри пакетного файла,

@echo off

FOR /F "tokens=2 delims=:," %%A IN ('findstr "FleetId" [name_json_file.json]') DO echo %%A

pause
::
0 голосов
/ 12 июня 2019

Я изменил предложение @PaulProgrammer для разрешения аргументов.

for id in `grep "$1" $2 | awk -F ':' '{ print $2 }' | tr -d '" ,'`; do
   echo $id >> "$1"Temp.txt
done

Это позволяет мне передать 2 аргумента следующим образом.

GameLiftIdHelper.sh FleetId TestFleetId.txt
GameLiftIdHelper.sh "Build ID" TestBuildId.txt
0 голосов
/ 12 июня 2019

Ваш ввод выглядит как json - если это json, то вы должны использовать для него синтаксический анализатор json, например jq, например, после исправления вашего входного файла примера, чтобы он был действительным json, просто добавив завершающий }:

$ cat file
{
"FleetAttributes": {
    "FleetId": "fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05",
    "FleetArn": "arn:aws:gamelift:us-west-2:321110313936:fleet/fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05",
    "FleetType": "ON_DEMAND",
    "InstanceType": "c4.large",
    "Description": "Development build of Project Genesis",
    "Name": "ProjectGenesis-DevelopmentBuild",
    "CreationTime": 1560297730.139,
    "Status": "NEW",
    "BuildId": "build-0f8b9c4f-56a3-48e3-af28-018383af8fd1",
    "NewGameSessionProtectionPolicy": "FullProtection",
    "OperatingSystem": "WINDOWS_2012",
    "ResourceCreationLimitPolicy": {
        "NewGameSessionsPerCreator": 4,
        "PolicyPeriodInMinutes": 15
    },
    "MetricGroups": [
        "default"
    ]
}
}

и завершение jq в сценарии оболочки и сохранение его вывода в переменной, как вы просили:

$ cat tst.sh
#!/bin/bash

tag="$1"
file="$2"

var=$(jq --arg tag "$tag" -r '.FleetAttributes[$tag]' "$file")

printf '%s\n' "$var"

$ ./tst.sh FleetId file
fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05

$ ./tst.sh BuildId file
build-0f8b9c4f-56a3-48e3-af28-018383af8fd1

В противном случае, если ваш ввод не действительно JSON или вы не можетеустановите инструмент, подобный jq, который понимает json, тогда awk будет вашей следующей лучшей ставкой:

$ cat tst.sh
#!/bin/bash

tag="$1"
file="$2"

var=$(awk -v tag="$tag" '$1=="\""tag"\":"{sub(/",?$/,""); sub(/.*"/,""); print}' "$file")

printf '%s\n' "$var"

$ ./tst.sh FleetId file
fleet-ad6061f3-6eaa-4a07-b68e-1042f1288e05

$ ./tst.sh BuildId file
build-0f8b9c4f-56a3-48e3-af28-018383af8fd1

, но для этого потребуются значительные изменения:

$ jq -r .FleetAttributes.ResourceCreationLimitPolicy file
{
  "NewGameSessionsPerCreator": 4,
  "PolicyPeriodInMinutes": 15
}

$ jq -r .FleetAttributes.MetricGroups file
[
  "default"
]
0 голосов
/ 12 июня 2019

Потому что вы спросили в своих комментариях, как может выглядеть скрипт bash:

for thing in `grep 'FleetId' yourfile.txt | awk -F ':' '{ print $2 }' | tr -d '" ,'`; do
   # do something with the id as $thing
   echo $thing
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...