amarao (amarao_san) wrote,
amarao
amarao_san

Category:

json iterators (json4shell)

Основное, чем я загорелся, это итераторы и внешние фильтры по json'у.

Итератор: берёт элемент из массива или объекта, берёт заданные поля из него (или сам объект) и вызывает указанную в командной строке программу. После чего выдаёт назад json с stdout это программы.

фильтр: вместо того, чтобы "брать stdout" проверяет код возврата программы, и в зависимости от результата и своих параметров, пропускает или не пропускает элемент дальше.

В тривиальном виде это выглядит так:

cat ip_array|json4shell filter ping -c 1 >ip_online_array.

Как передавать аргументы? Тривиальное решение: как у xargs. Типа, xargs -I FOO command somethingFOObar (заменяет вхождение FOO на элементы из списка с stdin).

Но хочется иметь возможность использовать что-то более красивое. Например, jsonpath/jq, то есть что-то вида filter command put ${.filename} to my server to folder ${.folder} - причём и ${.filename} и ${.folder} берутся из переданного объекта, а так как объектов много, то команда вызывается для каждого из элементов со своей подстановкой.

Вторая идея - зацикливание stdout/in в режиме fold.

Вопрос - как его реализовать?

Stdout предыдущей итерации попадает на stdin текущей, при этом меняется командная строка.

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

Мы формируем список ожидаемых слов, передаём его на stdin фильтра. Файл, в котором надо искать, передаётся через вызов инициализатора, в нашем случае, cat file.

cat search_terms|ifold --init 'cat file_for_grep' --exec grep

Что он делает? Запускает grep, передаёт ему на stdin результат выполнения --init 'cat file_for_grep', в качестве аргумента подставляет первый элемент из search_term. Результат вывода отправляет на stdin следующего grep, с следующей строкой из search_term.

Это первый вариант fold'а.

Второй вариант: Мы передаём "аккумулятор" в виде параметра. То есть:

cat foo|afold --init 'echo 0' --exec 'calc ${acc} ${iter}'

В этом случае ${acc} каждый раз становится равен выводу предыдущей команды (а первый раз - --init).

Я не знаю, какой из вариантов более естественный для шелла, и естественынй ли он...
Tags: json4shell
Subscribe

  • Админская мудрость

    Когда вывод strace на башовый скрипт становится понятнее самого скрипта, граница разумности давно пройдена.

  • Rules of internet

    Rule 34. There is porn of it. Rule 35. It's used to mine cryptocurrencies.

  • CI без сервера

    А вот у меня есть такой запрос: я хочу иметь CI-подобный инструмент (задачи/автоматически вычисляемые зависимости порядка выполнения, параметры,…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments