[решено] Реально ли упростить скрипт до однострочника? (bash, tr)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6

[решено] Реально ли упростить скрипт до однострочника?

Сообщение strangeman »

Необходимо получить список групп в musca одной строкой (для последующего вывода в dzen2, но это не суть важно). Задача вроде бы элементарная, но почему-то у меня не получается решить ее однострочником.
Получается только такое:

Код: Выделить всё

#!/bin/bash
pr=`musca -c 'show groups'|tr '\n' ' '`
echo "$pr"


Вся проблема заключается в том, что необходимо удалить все переводы строки, кроме последнего. Я поступил философски: сначала удалил все переводы, а потом добавил один в конце, выводя через echo. А можно ли как-то упростить конструкцию?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

strangeman писал(а):
27.08.2010 15:19
Необходимо получить список групп в musca одной строкой (для последующего вывода в dzen2, но это не суть важно). Задача вроде бы элементарная, но почему-то у меня не получается решить ее однострочником.
Получается только такое:

Код: Выделить всё

#!/bin/bash
pr=`musca -c 'show groups'|tr '\n' ' '`
echo "$pr"


Вся проблема заключается в том, что необходимо удалить все переводы строки, кроме последнего. Я поступил философски: сначала удалил все переводы, а потом добавил один в конце, выводя через echo. А можно ли как-то упростить конструкцию?
musca -c 'show groups' | tr '\n' ' ' | sed 's/$/\n/'
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение strangeman »

t.t писал(а):
27.08.2010 15:25
musca -c 'show groups' | tr '\n' ' ' | sed 's/$/\n/'

Вот с sed-то я как раз и толком не знаком. Спасибо.
Спасибо сказали:
Аватара пользователя
Babusha
Сообщения: 203
ОС: Убунту
Контактная информация:

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение Babusha »

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

Код: Выделить всё

echo -n "Hello"; echo " World"


Можно так было:

Код: Выделить всё

pr=`musca -c 'show groups'|tr '\n' ' '`; echo "$pr"
Спасибо сказали:
Аватара пользователя
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение strangeman »

Babusha писал(а):
27.08.2010 15:35
Если ты даже и не знал, можно просто без перехода на новую строку, использовать точку с запятой,

Код: Выделить всё

echo -n "Hello"; echo " World"


Можно так было:

Код: Выделить всё

pr=`musca -c 'show groups'|tr '\n' ' '`; echo "$pr"


Не, это я знаю. :)
Но такую конструкцию однострочником назвать сложно. Хотя, это все дело терминологии.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

Babusha писал(а):
27.08.2010 15:35
Если ты даже и не знал, можно просто без перехода на новую строку, использовать точку с запятой,

Код: Выделить всё

echo -n "Hello"; echo " World"


Можно так было:

Код: Выделить всё

pr=`musca -c 'show groups'|tr '\n' ' '`; echo "$pr"
Тогда уж musca -c 'show groups' | tr '\n' ' '; echo
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение Nazyvaemykh »

А вот так будет работать?
echo $(musca -c 'show groups'|tr '\n' ' ')
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

Или даже echo $(musca -c 'show groups' | tr '\n' ' ')

Теперь уж точно однострок.

Nazyvaemykh писал(а):
27.08.2010 15:50
А вот так будет работать?
echo $(musca -c 'show groups'|tr '\n' ' ')
Синхронно. (:

А чего ему не работать?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение strangeman »

Nazyvaemykh писал(а):
27.08.2010 15:50
А вот так будет работать?
echo $(musca -c 'show groups'|tr '\n' ' ')

Нет, подобный вариант я пробовал. Там в результирующей строке есть астериск и в такой конструкции он неверно интерпретируется, в итоге вместо него выводятся названия всех файлов из директории.
Должно быть:

Код: Выделить всё

0 - group0 1 * group1 2 - group2 3 - group3 4 - group4

А выводит:

Код: Выделить всё

0 - group0 1 список_всех_файлов_из_директории_запуска group1 2 - group2 3 - group3 4 - group4
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение Nazyvaemykh »

echo "$(musca -c 'show groups' | tr '\n' ' ')"

t.t, вот видите, может и не работать. (:
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

Nazyvaemykh писал(а):
27.08.2010 16:01
echo "$(musca -c 'show groups' | tr '\n' ' ')"

t.t, вот видите, может и не работать. (:
И правда, про экранирование-то я и забыл. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение watashiwa_daredeska »

Код: Выделить всё

musca -c 'show groups'|tr '\n' ' '; echo
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

watashiwa_daredeska писал(а):
27.08.2010 16:32

Код: Выделить всё

musca -c 'show groups'|tr '\n' ' '; echo
тыц
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение watashiwa_daredeska »

t.t писал(а):
27.08.2010 16:37
тыц
Ага. А чего в этом варианте не нравится-то? Что памяти требуется O(1) вместо O(n)? :) Или точка с запятой? Второй недостаток легко исправить:

Код: Выделить всё

musca -c 'show groups' | awk -v ORS='' '{print $0 " "}END{print "\n"}'
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

watashiwa_daredeska писал(а):
27.08.2010 17:27
t.t писал(а):
27.08.2010 16:37
тыц
Ага. А чего в этом варианте не нравится-то?
Что-то ты невнимателен сегодня. Повторяю по буквам:
t.t писал(а):
27.08.2010 15:43
musca -c 'show groups' | tr '\n' ' '; echo
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение watashiwa_daredeska »

t.t писал(а):
27.08.2010 18:25
Что-то ты невнимателен сегодня. Повторяю по буквам:
Я понял, что этот вариант уже был. Вопрос состоит в том, зачем городить прочие, вроде echo $()? Размер командной строки, кстати, ограничен.
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение Nazyvaemykh »

watashiwa_darede...,
чтобы уложиться у единственный конвейер, больше ни для чего.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5288
ОС: Gentoo

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение /dev/random »

watashiwa_daredeska писал(а):
27.08.2010 18:47
Размер командной строки, кстати, ограничен.

Для echo - нет. По крайней мере в баше.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение watashiwa_daredeska »

/dev/random писал(а):
27.08.2010 19:11
Для echo - нет. По крайней мере в баше.
Однако всё равно лучше обойтись конвейером, если возможно, ибо через echo — это загрузка файла в память, что не есть гуд для произвольно взятого файла.
Nazyvaemykh писал(а):
27.08.2010 19:04
чтобы уложиться у единственный конвейер, больше ни для чего.
А можно поинтересоваться, какой в этом глубинный смысл?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение drBatty »

watashiwa_darede... писал(а):
27.08.2010 18:47
Размер командной строки, кстати, ограничен.

угу. на первом пне и слаке 10.2 какие-то жалкие 32768 байта :)
/dev/random писал(а):
27.08.2010 19:11
Для echo - нет. По крайней мере в баше.

именно.
strangeman писал(а):
27.08.2010 15:19
Вся проблема заключается в том, что необходимо удалить все переводы строки, кроме последнего. Я поступил философски: сначала удалил все переводы, а потом добавил один в конце, выводя через echo. А можно ли как-то упростить конструкцию?

в тему?

Код: Выделить всё

sed -n 'H;$!b;g;s/\n/ /gp'

strangeman писал(а):
27.08.2010 15:26
Вот с sed-то я как раз и толком не знаком.

зря...

вдогонку:

Код: Выделить всё

sed 'H;$!d;g;s/\n/ /g'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение Nazyvaemykh »

drBatty, лишний пробел в начале строки появляется, либо в первой строке делать не H, а h, либо отдельно удалить пробел, либо N вместо d и перезход на метку…

Код: Выделить всё

sed '1h;1!H;$!d;g;s/\n/ /g'

или

Код: Выделить всё

sed 'h;bA;:B;H;:A;$!N;bB;g;s/\n/ /g'
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

watashiwa_daredeska писал(а):
27.08.2010 18:47
t.t писал(а):
27.08.2010 18:25
Что-то ты невнимателен сегодня. Повторяю по буквам:
Я понял, что этот вариант уже был. Вопрос состоит в том, зачем городить прочие, вроде echo $()?
Мне из слов автора не было до конца понятно, допустимы ли две команды через точку с запятой.

watashiwa_daredeska писал(а):
27.08.2010 18:47
Размер командной строки, кстати, ограничен.
Это да. Тогда, если недопустимы, лучше с sed.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение watashiwa_daredeska »

t.t писал(а):
27.08.2010 20:33
Тогда, если недопустимы, лучше с sed.
А как в sed обойтись без загрузки всего содержимого в память?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение t.t »

watashiwa_daredeska писал(а):
27.08.2010 20:55
t.t писал(а):
27.08.2010 20:33
Тогда, если недопустимы, лучше с sed.
А как в sed обойтись без загрузки всего содержимого в память?
Это я ещё про длину строки отвечал. Забыл, что для echo в bash она неограничена, а поста /dev/random тогда ещё не видел.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение drBatty »

Nazyvaemykh писал(а):
27.08.2010 20:20
лишний пробел в начале строки появляется

я знаю. но так изящнее. (и часто - вполне допустимо).
watashiwa_darede... писал(а):
27.08.2010 20:55
А как в sed обойтись без загрузки всего содержимого в память?

никак. sed обрабатывает текст построчно.

PS: тоже согласен, недостаток. но речь шла о музыке? уж если вы нашли гигабайты для треков, найдите и килобайты для имён (:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение Nazyvaemykh »

drBatty, musca (муха) — это такой оконный менеджер, к музыке он никакого отношения не имеет.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение ZyX »

Кстати, если достаточно того, что скрипт работает в bash и zsh (но не в POSIX shell), то можно использовать следующую конструкцию:

Код: Выделить всё

cat <(musca -c 'show groups'|tr '\n' ' ') <(echo)

Плюс такой конструкции в том, что она не будет ждать, пока musca завершится, а сразу начнёт передавать данные дальше. И, разумеется, не требуется хранить всё в памяти.
Спасибо сказали:
Аватара пользователя
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение strangeman »

drBatty писал(а):
27.08.2010 19:53
strangeman писал(а):
27.08.2010 15:26
Вот с sed-то я как раз и толком не знаком.

зря...


Кто ж спорит. Универ закончил, время появилось, сейчас разбираюсь помаленьку.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение watashiwa_daredeska »

drBatty писал(а):
27.08.2010 21:56
никак. sed обрабатывает текст построчно.
Вот-вот. И я про то.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: [решено] Реально ли упростить скрипт до однострочника?

Сообщение drBatty »

Nazyvaemykh писал(а):
27.08.2010 20:20
лишний пробел в начале строки появляется, либо в первой строке делать не H, а h, либо отдельно удалить пробел, либо N вместо d и перезход на метку…

можно ещё его потом удалить:

Код: Выделить всё

sed 'H;$!d;g;s/\n/ /g;s/^ //'
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ответить