Bash массив grep как шаблон, думает, что это файл - PullRequest
0 голосов
/ 10 января 2020

Я использую Heroku cli, чтобы получить список резервных копий из Heroku. Я ищу только те, у которых запланировано резервное копирование (heroku pg:backups:schedules), но единственный способ получить их идентификатор - через heroku pg:backups, который печатает все. Я пытаюсь использовать grep, чтобы вырезать вывод и дать мне список идентификаторов только для тех, которые мне нужны.

Я думаю, что я должен иметь возможность использовать список массива имен резервных копий, которые мне нужны, и grep это против полного списка резервных копий. Однако grep либо не нравится итерация массива (array[0]), либо он считает, что я передаю ему имя файла.

for (( x=0; x<DB_COUNT; x++ ))
do
    BACKUP_NAMES[($x)]=$(heroku pg:backups:schedules -a $APP_NAME | sed -n '1!p' | cut -f1 -d":")
    BACKUP_IDS[($x)]=$(heroku pg:backups -a $APP_NAME | grep '[a-z][0-9][0-9][0-9]*' | grep -w $BACKUP_NAMES)
done

Я пробовал grep -w ${BACKUP_NAMES[$x]} grep -w "$BACKUP_NAMES[$x]" grep -w "$BACKUP_NAMES" и тысячи других, но я либо получаю синтаксическую ошибку, либо grep думает, что $ BACKUP_NAMES - это файл, а не шаблон. Я пытался выяснить это часами, и я просто в полном замешательстве.

РЕДАКТИРОВАТЬ:

BACKUP_NAMES содержит DATABASE_NAME DATABASE_NAME2

Выход heroku pg:backups

=== Backups
ID    Created at                Status                              Size     Database
a555 2020-01-09 07:26:21 +0000 Completed 2020-01-09 07:30:08 +0000 1.16GB DATABASE_NAME
a554 2020-01-08 07:26:21 +0000 Completed 2020-01-08 07:30:08 +0000 5.93GB DATABASE_NAME2
a553 2020-01-07 07:26:21 +0000 Completed 2020-01-07 07:30:08 +0000 1.16GB DATABASE_NAME3
a552 2020-01-06 07:26:21 +0000 Completed 2020-01-06 07:30:08 +0000 5.89GB DATABASE_NAME4
a551 2020-01-05 07:26:21 +0000 Completed 2020-01-05 07:30:08 +0000 3.21GB DATABASE_NAME5
a550 2020-01-04 07:26:21 +0000 Completed 2020-01-04 07:30:08 +0000 1.16GB DATABASE_NAME6

Выход heroku pg:backups:schedules

=== Backup Schedules
DATABASE_NAME: daily at 5:00 UTC
DATABASE_NAME2: daily at 7:00 UTC

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Если вы хотите назначить массив списку идентификаторов резервных копий, как о:

for i in $(heroku pg:backups:schedules -a "$APP_NAME" | sed -n '1!p' | cut -f1 -d":"); do
    backup_ids+=($(heroku pg:backups -a "$APP_NAME" | grep -w "$i" | grep -o '[a-z][0-9][0-9][0-9]*'))
done
echo "${backup_ids[@]}"

Вывод:

a555 a554

[EDIT]
Если ваш bash не поддерживает синтаксис +=, попробуйте вместо этого:

for i in $(heroku pg:backups:schedules -a "$APP_NAME" | sed -n '1!p' | cut -f1 -d":"); do
    backup_ids[j]=$(heroku pg:backups -a "$APP_NAME" | grep -w "$i" | grep -o '[a-z][0-9][0-9][0-9]*')
    ((j+=1))
done
echo "${backup_ids[@]}"
0 голосов
/ 10 января 2020

Вы уверены, что вам нужен l oop? Я думаю, что вы можете записать имена резервных копий в одну переменную, включая символы новой строки, и использовать их при замене процесса в качестве параметра grep -w -f:

backup_names=$(heroku pg:backups:schedules -a $APP_NAME | sed -n '1!p' | cut -f1 -d":")
heroku pg:backups -a $APP_NAME | grep -w -f <(echo "$backup_names")

Я также удалил grep '[a-z][0-9][0-9][0-9]*', поскольку он не изменился вывод для предоставленных вами данных.

...