Вопрос или проблема
Я хочу выполнить команду grep с опцией -P
в двоичном файле BusyBox v1.31.1 () внутри пода Kubernetes с образом curlimages/curl:7.75.0
curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$CFZONE_NAME"\
-H "X-Auth-Email: $CFUSER"\
-H "X-Auth-Key: $CFKEY" \
-H "Content-Type: application/json" \
| grep -Po '(?<="id":")[^"]*' \ # <- Это причина
| head -1
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CFZONE_ID/dns_records?Name=$CFRECORD_NAME" \
-H "X-Auth-Email: $CFUSER" \
-H "X-Auth-Key: $CFKEY" \
-H "Content-Type: application/json"\
| grep -Po '(?<="id":")[^"]*'\ # <- Это причина
| head -1
К сожалению, -P
недоступен
grep: нераспознанная опция: P
BusyBox v1.31.1 () многоцелевой бинарный файл.
Использование: grep [-HhnlLoqvsriwFE] [-m N] [-A/B/C N] PATTERN/-e PATTERN.../-f FILE [FILE]...
Ищет PATTERN в файлах (или stdin)
-H Добавить префикс 'имя_файла:'
-h Не добавлять префикс 'имя_файла:'
-n Добавить префикс 'номер_строки:'
-l Показывать только имена файлов, которые совпадают
-L Показывать только имена файлов, которые не совпадают
-c Показывать только количество совпадающих строк
[...]
Как можно обойти это?
Можно ли использовать grep
с cut
?
grep -o '"id":"[^"]*' | cut -f4- -d\"
Ответ или решение
Ваша задача заключается в том, чтобы получить идентификатор из JSON-ответа API Cloudflare в контейнере с использованием BusyBox, где команда grep
не поддерживает опцию -P
для Perl-совместимых регулярных выражений.
Проблема в том, что команда grep
в вашем образе контейнера curlimages/curl:7.75.0
, основанном на BusyBox v1.31.1, не поддерживает опцию -P
, которая позволяет использовать расширенные регулярные выражения. Тем не менее, вы можете обойти это ограничение, используя комбинацию grep
и cut
, чтобы извлечь необходимые данные.
Вот как вы можете это сделать:
Пример команды для получения идентификатора
Вместо использования grep -Po
вы можете использовать grep
с опцией -o
для извлечения частей строки, а затем передать результат в cut
для дальнейшей обработки. Вот как будет выглядеть ваша команда:
# Получение идентификатора зоны
curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$CFZONE_NAME" \
-H "X-Auth-Email: $CFUSER" \
-H "X-Auth-Key: $CFKEY" \
-H "Content-Type: application/json" | grep -o '"id":"[^"]*' | cut -d'"' -f4 | head -1
# Получение идентификатора DNS записи
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CFZONE_ID/dns_records?Name=$CFRECORD_NAME" \
-H "X-Auth-Email: $CFUSER" \
-H "X-Auth-Key: $CFKEY" \
-H "Content-Type: application/json" | grep -o '"id":"[^"]*' | cut -d'"' -f4 | head -1
Объяснение
-
curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$CFZONE_NAME"
: Эта команда делает запрос к API Cloudflare для получения данных о зоне. -
grep -o '"id":"[^"]*'
: Используется для поиска частей строки, соответствующих шаблону"id":"значение"
, и выводит только совпадения. -
cut -d'"' -f4
: Командаcut
разделяет вывод по символу"
и извлекает четвертое поле, которое является значением идентификатора. -
head -1
: Это необходимо, если в результате может быть несколько идентификаторов, и вам нужно выбрать только первый.
Заключение
Этот подход является отличным обходным решением проблемы отсутствия поддержки регулярных выражений Perl в grep
BusyBox. Вы можете адаптировать приведенные команды под свои нужды, чтобы получать необходимые данные из JSON-ответов API.