Grep с опцией -P в busybox

Вопрос или проблема

Я хочу выполнить команду 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

Объяснение

  1. curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$CFZONE_NAME": Эта команда делает запрос к API Cloudflare для получения данных о зоне.

  2. grep -o '"id":"[^"]*': Используется для поиска частей строки, соответствующих шаблону "id":"значение", и выводит только совпадения.

  3. cut -d'"' -f4: Команда cut разделяет вывод по символу " и извлекает четвертое поле, которое является значением идентификатора.

  4. head -1: Это необходимо, если в результате может быть несколько идентификаторов, и вам нужно выбрать только первый.

Заключение

Этот подход является отличным обходным решением проблемы отсутствия поддержки регулярных выражений Perl в grep BusyBox. Вы можете адаптировать приведенные команды под свои нужды, чтобы получать необходимые данные из JSON-ответов API.

Оцените материал
Добавить комментарий

Капча загружается...