На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6
Сообщение
strangeman » 27.08.2010 15:19
Необходимо получить список групп в musca одной строкой (для последующего вывода в dzen2, но это не суть важно). Задача вроде бы элементарная, но почему-то у меня не получается решить ее однострочником.
Получается только такое:
Код: Выделить всё
#!/bin/bash
pr=`musca -c 'show groups'|tr '\n' ' '`
echo "$pr"
Вся проблема заключается в том, что необходимо удалить все переводы строки, кроме последнего. Я поступил философски: сначала удалил все переводы, а потом добавил один в конце, выводя через echo. А можно ли как-то упростить конструкцию?
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 15:25
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
Сообщение
strangeman » 27.08.2010 15:26
t.t писал(а): ↑ 27.08.2010 15:25
musca -c 'show groups' | tr '\n' ' ' | sed 's/$/\n/'
Вот с sed-то я как раз и толком не знаком. Спасибо.
Babusha
Сообщения: 203
ОС: Убунту
Сообщение
Babusha » 27.08.2010 15:35
Если ты даже и не знал, можно просто без перехода на новую строку, использовать точку с запятой,
Можно так было:
Код: Выделить всё
pr=`musca -c 'show groups'|tr '\n' ' '`; echo "$pr"
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6
Сообщение
strangeman » 27.08.2010 15:39
Babusha писал(а): ↑ 27.08.2010 15:35
Если ты даже и не знал, можно просто без перехода на новую строку, использовать точку с запятой,
Можно так было:
Код: Выделить всё
pr=`musca -c 'show groups'|tr '\n' ' '`; echo "$pr"
Не, это я знаю.
Но такую конструкцию однострочником назвать сложно. Хотя, это все дело терминологии.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 15:43
Babusha писал(а): ↑ 27.08.2010 15:35
Если ты даже и не знал, можно просто без перехода на новую строку, использовать точку с запятой,
Можно так было:
Код: Выделить всё
pr=`musca -c 'show groups'|tr '\n' ' '`; echo "$pr"
Тогда уж musca -c 'show groups' | tr '\n' ' '; echo
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник
Сообщение
Nazyvaemykh » 27.08.2010 15:50
А вот так будет работать?
echo $(musca -c 'show groups'|tr '\n' ' ')
¡ Страсть к разрушению есть творческая страсть !
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 15:53
Или даже 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
Сообщение
strangeman » 27.08.2010 15:57
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
Статус: Подопытный участник
Сообщение
Nazyvaemykh » 27.08.2010 16:01
echo "$(musca -c 'show groups' | tr '\n' ' ')"
t.t , вот видите, может и не работать. (:
¡ Страсть к разрушению есть творческая страсть !
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 16:17
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
Сообщение
watashiwa_daredeska » 27.08.2010 16:32
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 16:37
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 27.08.2010 17:27
Ага. А чего в этом варианте не нравится-то? Что памяти требуется O(1) вместо O(n)?
Или точка с запятой? Второй недостаток легко исправить:
Код: Выделить всё
musca -c 'show groups' | awk -v ORS='' '{print $0 " "}END{print "\n"}'
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 18:25
Что-то ты невнимателен сегодня. Повторяю по буквам:
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
Сообщение
watashiwa_daredeska » 27.08.2010 18:47
t.t писал(а): ↑ 27.08.2010 18:25
Что-то ты невнимателен сегодня. Повторяю по буквам:
Я понял, что этот вариант уже был. Вопрос состоит в том, зачем городить прочие, вроде
echo $() ? Размер командной строки, кстати, ограничен.
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник
Сообщение
Nazyvaemykh » 27.08.2010 19:04
watashiwa_darede... ,
чтобы уложиться у единственный конвейер, больше ни для чего.
¡ Страсть к разрушению есть творческая страсть !
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo
Сообщение
/dev/random » 27.08.2010 19:11
Для echo - нет. По крайней мере в баше.
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 27.08.2010 19:28
/dev/random писал(а): ↑ 27.08.2010 19:11
Для echo - нет. По крайней мере в баше.
Однако всё равно лучше обойтись конвейером, если возможно, ибо через echo — это загрузка файла в память, что не есть гуд для произвольно взятого файла.
Nazyvaemykh писал(а): ↑ 27.08.2010 19:04
чтобы уложиться у единственный конвейер, больше ни для чего.
А можно поинтересоваться, какой в этом глубинный смысл?
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 27.08.2010 19:53
угу. на первом пне и слаке 10.2 какие-то жалкие 32768 байта :)
/dev/random писал(а): ↑ 27.08.2010 19:11
Для echo - нет. По крайней мере в баше.
именно.
strangeman писал(а): ↑ 27.08.2010 15:19
Вся проблема заключается в том, что необходимо удалить все переводы строки, кроме последнего. Я поступил философски: сначала удалил все переводы, а потом добавил один в конце, выводя через echo. А можно ли как-то упростить конструкцию?
в тему?
strangeman писал(а): ↑ 27.08.2010 15:26
Вот с sed-то я как раз и толком не знаком.
зря...
вдогонку:
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник
Сообщение
Nazyvaemykh » 27.08.2010 20:20
drBatty , лишний пробел в начале строки появляется, либо в первой строке делать не H, а h, либо отдельно удалить пробел, либо N вместо d и перезход на метку…
или
¡ Страсть к разрушению есть творческая страсть !
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 20:33
watashiwa_daredeska писал(а): ↑ 27.08.2010 18:47
t.t писал(а): ↑ 27.08.2010 18:25
Что-то ты невнимателен сегодня. Повторяю по буквам:
Я понял, что этот вариант уже был. Вопрос состоит в том, зачем городить прочие, вроде
echo $() ?
Мне из слов автора не было до конца понятно, допустимы ли две команды через точку с запятой.
Это да. Тогда, если недопустимы, лучше с sed.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 27.08.2010 20:55
t.t писал(а): ↑ 27.08.2010 20:33
Тогда, если недопустимы, лучше с sed.
А как в sed обойтись без загрузки всего содержимого в память?
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 27.08.2010 21:00
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
Сообщение
drBatty » 27.08.2010 21:56
Nazyvaemykh писал(а): ↑ 27.08.2010 20:20
лишний пробел в начале строки появляется
я знаю. но так изящнее. (и часто - вполне допустимо).
watashiwa_darede... писал(а): ↑ 27.08.2010 20:55
А как в sed обойтись без загрузки всего содержимого в память?
никак. sed обрабатывает текст
построчно .
PS: тоже согласен, недостаток. но речь шла о музыке? уж если вы нашли гигабайты для треков, найдите и килобайты для имён (:
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник
Сообщение
Nazyvaemykh » 27.08.2010 22:12
drBatty , musca (муха) — это такой оконный менеджер, к музыке он никакого отношения не имеет.
¡ Страсть к разрушению есть творческая страсть !
ZyX
Сообщения: 355
ОС: Gentoo
Сообщение
ZyX » 28.08.2010 00:37
Кстати, если достаточно того, что скрипт работает в bash и zsh (но не в POSIX shell), то можно использовать следующую конструкцию:
Код: Выделить всё
cat <(musca -c 'show groups'|tr '\n' ' ') <(echo)
Плюс такой конструкции в том, что она не будет ждать, пока musca завершится, а сразу начнёт передавать данные дальше. И, разумеется, не требуется хранить всё в памяти.
strangeman
Сообщения: 160
Статус: заблудившийся биоробот
ОС: Ubuntu 12.04, Debian 6
Сообщение
strangeman » 28.08.2010 10:04
drBatty писал(а): ↑ 27.08.2010 19:53
strangeman писал(а): ↑ 27.08.2010 15:26
Вот с sed-то я как раз и толком не знаком.
зря...
Кто ж спорит. Универ закончил, время появилось, сейчас разбираюсь помаленьку.
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 28.08.2010 12:16
drBatty писал(а): ↑ 27.08.2010 21:56
никак. sed обрабатывает текст построчно.
Вот-вот. И я про то.
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Сообщение
drBatty » 28.08.2010 12:19
Nazyvaemykh писал(а): ↑ 27.08.2010 20:20
лишний пробел в начале строки появляется, либо в первой строке делать не H, а h, либо отдельно удалить пробел, либо N вместо d и перезход на метку…
можно ещё его потом удалить: