LINUX.ORG.RU

Разбить stdin по строкам

 , , , ,


0

1

Короче, хочу что-то типа xargs, или скорее антипод paste.

Дано: программа1 даёт многострочный выхлоп в stdout.

Задача: брать stdout по строкам и для каждой строки вызывать программа2, передавая ей эту строку в stdin.

Помнится, когда-то я наворачивал что-то типа программа1|while read a; echo "$a"|программа2; done, ещё и с IFS шаманил, можно ли проще?

Куда уж проще? Разве что программа1|while read a; программа2<<<"$a"; done

legolegs ★★★★★ ()

Вот ещё вариант:

программа1| parallel --pipe --max-args=1 программа2

legolegs ★★★★★ ()

Я так и не понял, чем вам xargs то не угодил?

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Я так и не понял, чем вам xargs то не угодил?

bodqhrohro

Как бы намекает.

r3lgar ★★★★★ ()
Ответ на: комментарий от r3lgar

Да не, я понял, просто не сообразили:

xargs -n1 -d'\n' -I '{}' sh -c 'echo "{}" | программа2'

vodz ★★★★★ ()
Ответ на: комментарий от vodz

echo «{}»

А огромные строки оно переварит? Шось я сомневаюсь. Помнится, когда я пробовал из девтулзов огромный POST-запрос в виде команды для curl скопировать, шелл отказался этого жирдяя выполнять.

bodqhrohro_promo ()
Ответ на: комментарий от bodqhrohro_promo

А огромные строки оно переварит? Шось я сомневаюсь.

Огромные — нет. Но что-то в виде одной огромной строки — это явно ошибка в дизайне задачи.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

ошибка в дизайне задачи

Всё ждал, когда приползёт типичное ЛОРовское «ненужно»

bodqhrohro_promo ()
Ответ на: комментарий от bodqhrohro_promo

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

anonymous ()
Ответ на: комментарий от bodqhrohro_promo

Всё ждал, когда приползёт типичное ЛОРовское «ненужно»

Вы явно что-то спутали. Тот же POST, благодаря всякими boundary, всяко содержит несколько строк, и потому вам надо не по строке передавать во внешнюю программу (ага, охренеть решение по выжиранию ресурсов), а кодить. Ибо надо так и так парсить.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

всяко содержит несколько строк

Какая разница? В виде аргумента-то оно всё равно превращается в одну. И тут вообще не POST, я то ради пример привёл.

охренеть решение по выжиранию ресурсов

Фига ресурсы, несколько мегабайт.

а кодить

Типа шелл не код, ага.

Ибо надо так и так парсить

Ну так jq распарсит. Он многомегабайтные структуры переваривает отлично и быстро.

bodqhrohro_promo ()
Ответ на: комментарий от bodqhrohro_promo

Какая разница? В виде аргумента-то оно всё равно превращается в одну.

О чём и речь. Нахрена превращать?

Фига ресурсы, несколько мегабайт.

И их передавать по пайпу и по fork на каждую строку.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Нахрена превращать?

Сам предложил, сам спрашиваеть.

и по fork на каждую строку

Ну дык щитоподелать, каждая прога должна сама себя уметь пакетно вызывать без перезапусков, что ли?

bodqhrohro_promo ()
Ответ на: комментарий от bodqhrohro_promo

Сам предложил, сам спрашиваеть

Это решает изначальную задачу - отдавать программе по одной строке на вход. Речь о этой задачи вообще: если данные изначально многострочные, то и обрабатывать надо порциями, которые понимаются как одно целое.

Ну дык щитоподелать, каждая прога должна сама себя уметь пакетно вызывать без перезапусков, что ли?

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

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Речь о этой задачи вообще

Всё-то вам XY problem мерещатся, лишь бы Y закопать.

то и обрабатывать надо порциями, которые понимаются как одно целое

Так построчный вызов именно это и делает.

Но если у вас речь пошла о мегабайтных POST запросах

Все претензии к хромым девтулзам, который только строкой вызова curl их отдают. В лисиных можно чисто тело запроса скопировать, например.

bodqhrohro_promo ()
Ответ на: комментарий от legolegs

Шось он аргументы программа2 разворачивает в шелле, хотя они в одинарных кавычках; какого сена?

bodqhrohro_promo ()

И вот зачем это нужно.

youtube-dl -j https://antifur.bandcamp.com/album/hardvapour|parallel -q --will-cite --pipe --max-args=1 jq -r '.title+"@"+.formats[0].url'|grep -v 'SIDE\|цегла\|1000%\|politic'|col2 @|xargs -n 1 -I '{}' mpv --no-audio-display --af=equalizer=4:3:2:1:0:0:0:0:0:0 '{}'

bodqhrohro_promo ()
Ответ на: комментарий от bodqhrohro_promo

Ещё одного кадра такого вспомнил.

youtube-dl -j https://soundcloud.com/object61/tracks|parallel -q --will-cite --pipe --max-args=1 jq -r '.title+"@"+.formats[0].url'|grep -v 'irl'|col2 @|xargs -I '{}' mpv --no-audio-display --af=equalizer=4:3:2:1:0:0:0:0:0:0 '{}'

Пожалуй, надо оформить в универсальный скрипт-блэклистер.

И сделать бы ещё эту свинью-скотину не отрабатывать целых 6.5 минут...

bodqhrohro_promo ()
Ответ на: комментарий от bodqhrohro_promo

По советам с канала сделал проще, быстрее и надёжнее:

youtube-dl --flat-playlist -J https://soundcloud.com/object61/tracks|jq -r '.entries|map(.url)|join("\n")'|grep -v irl|xargs -n 1 mpv
bodqhrohro_promo ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.