Как выводить строчки последовательно awk & sed?

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Закрыто
Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#1

12 май 2019, 06:57

Вообщем есть файл с радио m3u. Нужно вывести одну строку по шаблону. Далее, нужно с каждым вводом команды(команда не должна меняться, т.к она пойдет на съедение апаратной кнопке) выводить следующую.

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

Т.е... как пример:

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

vir0id@android:~/Загрузки$ cat radiorecord.m3u 
#EXTM3U
#EXTINF:-1,Radio Record
http://air.radiorecord.ru:8101/rr_320
#EXTINF:-1,Superdiskoteka 90s Radio
http://air.radiorecord.ru:8102/sd90_320
#EXTINF:-1,Trancemission Radio
http://air.radiorecord.ru:8102/tm_320
#EXTINF:-1,Record Russian Mix
http://air.radiorecord.ru:8102/rus_320
#EXTINF:-1,Medlyak FM
http://air.radiorecord.ru:8102/mdl_320
#EXTINF:-1,Chillout Radio
http://air.radiorecord.ru:8102/chil_320
#EXTINF:-1,Record Club Radio
http://air.radiorecord.ru:8102/club_320
#EXTINF:-1,Gop FM Radio
http://air.radiorecord.ru:8102/gop_320
#EXTINF:-1,Vip Mix Radio
http://air.radiorecord.ru:8102/vip_320
#EXTINF:-1,Pirate Station Radio
http://air.radiorecord.ru:8102/ps_320
#EXTINF:-1,Record DEEP
http://air.radiorecord.ru:8102/deep_320
#EXTINF:-1,Breaks Radio
http://air.radiorecord.ru:8102/brks_320
#EXTINF:-1,Dancecore Radio
http://air.radiorecord.ru:8102/dc_320
#EXTINF:-1,Dubstep Radio
http://air.radiorecord.ru:8102/dub_320
#EXTINF:-1,Record TRAP
http://air.radiorecord.ru:8102/trap_320
#EXTINF:-1,Teodor Radio
http://air.radiorecord.ru:8102/teo_320
#EXTINF:-1,YO FM
http://air.radiorecord.ru:8102/yo_320
#EXTINF:-1,Pump'N'Club
http://air.radiorecord.ru:8102/pump_320
#EXTINF:-1,Record
http://air.radiorecord.ru:8102/rock_320

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

vir0id@android:~/Загрузки$ awk '/http/{print$1}' radiorecord.m3u
http://air.radiorecord.ru:8101/rr_320
http://air.radiorecord.ru:8102/sd90_320
http://air.radiorecord.ru:8102/tm_320
http://air.radiorecord.ru:8102/rus_320
http://air.radiorecord.ru:8102/mdl_320
http://air.radiorecord.ru:8102/chil_320
http://air.radiorecord.ru:8102/club_320
http://air.radiorecord.ru:8102/gop_320
http://air.radiorecord.ru:8102/vip_320
http://air.radiorecord.ru:8102/ps_320
http://air.radiorecord.ru:8102/deep_320
http://air.radiorecord.ru:8102/brks_320
http://air.radiorecord.ru:8102/dc_320
http://air.radiorecord.ru:8102/dub_320
http://air.radiorecord.ru:8102/trap_320
http://air.radiorecord.ru:8102/teo_320
http://air.radiorecord.ru:8102/yo_320
http://air.radiorecord.ru:8102/pump_320
http://air.radiorecord.ru:8102/rock_320

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

vir0id@android:~/Загрузки$ awk '/http/{print$1}' radiorecord.m3u | sed -n 1p
http://air.radiorecord.ru:8101/rr_320
Т.е нужно, что бы(в терминале) после ввода awk '/http/{print$1}' radiorecord.m3u | sed -n * воводилась строка по порядку в списке.
Не

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

http://air.radiorecord.ru:8101/rr_320
, а вот эта

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

http://air.radiorecord.ru:8102/sd90_320
и так далее.
По окончанию таких строк, осуществлялся обратный порядок.
Замонался я уже гуглить. Может кто подскажет, как можно реализовать такое подобие переключалки тем, или иным способом?
Или как осуществить подмену символа 1p на 2p в порядке возростания или убывания? Или вообще... можно ли сделать инкремент на 1 этому кребанному параметру sed -n 1p????

no avatar

achagaev
Сообщения: 34
Зарегистрирован: 09 ноя 2017, 10:21
Благодарил (а): 5 раз
Поблагодарили: 6 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#2

12 май 2019, 10:12

у меня в голову приходят три варианта.
1. крутить while [ 1 ] и запоминать 1p, 2p (1,2,3,...) и использовать его при следующем нажатии кнопки;
2. аналогично первому пункту, но без while, записывать значение 1,2,3,... в темповый файл и читать его var=`cat /tmp/sed_tmp.file`; sed -n $varp. Ну и естественно в скрипте добавить if/else на пограничные значения из списка и логику инкремента/декремента;
3. делать копию m3u, читать эту копию, брать верхнюю строку на воспроизведение, редактировать m3u, удаляя верхнюю строку и добавляя её вниз файла.

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#3

12 май 2019, 13:08

achagaev писал(а):
12 май 2019, 10:12
1. крутить while [ 1 ] и запоминать 1p, 2p (1,2,3,...
achagaev писал(а):
12 май 2019, 10:12
Ну и естественно в скрипте добавить if/else на пограничные значения из списка и логику инкремента/декремента;
Да, я думал об этом, но... как это записать для моего случая. У меня уже голова по швам трещит

no avatar

achagaev
Сообщения: 34
Зарегистрирован: 09 ноя 2017, 10:21
Благодарил (а): 5 раз
Поблагодарили: 6 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#4

12 май 2019, 14:32

Вот так бы я начал делать. Мне не очень нравится, что в одном месте удаляется именно верхняя строчка, наверное позже я бы расширил на удаление именно $working_url из файла, но идея должна быть понятна.
Остаётся только поиграться с $working_file, чтобы брать информацию с уже отредактированного файла, а не с исходного как в примере.

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

#!/bin/bash

##Requires 1 argument - file with list of m3u URLs
if [ $# -eq 0 ]
  then
    echo "File with m3u needed"
    exit 1
fi

#url_file=$1
#working_file=$url_file.work
working_file=$1

##creating backup file
/bin/cp $working_file{,.bak}

##cleanup working file
/bin/sed -i '/^#.*$/d' $working_file

##fetch top 1 line with sed
working_url=`/bin/sed -n 1p $working_file`
/bin/echo "Working URL is: $working_url"

##remove working_url from top of list
/bin/sed -i '1d' $working_file

##add working_url to the end of list
/bin/echo $working_url >> $working_file

#exit
exit 0

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

#!/bin/bash

##Requires 1 argument - file with list of m3u URLs
if [ $# -eq 0 ]
then
echo "File with m3u needed"
exit 1
fi

#url_file=$1
#working_file=$url_file.work
working_file=$1

##creating backup file
/bin/cp $working_file{,.bak}

##cleanup working file
/bin/sed -i '/^#.*$/d' $working_file

##fetch top 1 line with sed
working_url=`/bin/sed -n 1p $working_file`
/bin/echo "Working URL is: $working_url"

##remove working_url from top of list
#cut url to aviod // symbols
cut_url=${working_url#*//*/}
#remove line with $cut_url from $working_file
/bin/sed -i "/^.*$cut_url.*$/d" $working_file

##add working_url to the end of list
/bin/echo $working_url >> $working_file

#exit
exit 0

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#5

12 май 2019, 17:47

achagaev, да, идея с добавлением и удалением строк из файла в файл - работает. Только... попробую реализовать не скриптом, а одной и очень длинной командой с кучей контейнеров(короче примитивно) потому что не знаю как такой скрипт скушает ash :-D

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#6

12 май 2019, 19:43

achagaev, отлично! Всё получилось!
achagaev писал(а):
12 май 2019, 10:12
3. делать копию m3u, читать эту копию, брать верхнюю строку на воспроизведение, редактировать m3u, удаляя верхнюю строку и добавляя её вниз файла.
Только тут не копию читать надо, а оригенал. Т.к меняется он. А копия нужна как шунт... строка >> файл >> строка >> мусорник
Последний раз редактировалось пользователем 3 vir0id; всего редактировалось раз: 12

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#7

12 май 2019, 19:45

Если кому интересно, то могу расписать зачем вообще я тему делал. И что из этого получилось.

Аватара пользователя

rogoznik
Сообщения: 10048
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#8

12 май 2019, 20:02

vir0id, если правильно понял, тебе нужно просто выводить строку указав ее номер, то вот

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

#!/bin/bash
awk '/http/{print$1}' radiorecord.m3u | sed -n "$1 p"
Ну и запуск

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

./script_name.sh <номер_строки>
1.gif
ИзображениеИзображение

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#9

12 май 2019, 20:27

darkfenix писал(а):
12 май 2019, 20:02
если правильно понял, тебе нужно просто выводить строку указав ее номер
Ну не совсем. Я хотел, что бы из того файла radiorecord.m3u выводились строки в терминал поочерёдно. Ну к примеру есть файл с фамилиями для Васи. Набрал в терминале команду Вася, в ответ консоль говорит - Пупкин. Набрал еще раз Вася, консоль говорит Кулачков. И это не рандомно должно было быть, а по списку вниз.
Получилось обьяснить?

Аватара пользователя

rogoznik
Сообщения: 10048
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#10

12 май 2019, 20:51

vir0id, что-то такое
script.sh

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

#!/bin/bash
source param.sh
awk '/http/{print$1}' 1.txt | sed -n "$param p"
((param=$param+1))
echo "param=$param" > param.sh
param.sh Ну и можно вычислить кол-во строк, а по достижении последней ничего не делать.
ИзображениеИзображение

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#11

13 май 2019, 05:05

darkfenix, а эти скрипты ash скушает? Если заменить #!/bin/bash на #!/bin/ash? Компа под рукой нету.

Аватара пользователя

rogoznik
Сообщения: 10048
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#12

13 май 2019, 06:10

vir0id писал(а):
13 май 2019, 05:05
#!/bin/ash?
У меня не установлена, надо пробовать. Но с другой стороны должно работать - я же за основу твой код взял.
ИзображениеИзображение

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#13

13 май 2019, 20:22

darkfenix писал(а):
12 май 2019, 20:51
Ну и можно вычислить кол-во строк, а по достижении последней ничего не делать.
Посмотрел. У меня, код, уже ничего не делает по достижении последней. Вообщем... Вариант с двумя файлами и длинной командочкой мне как-то больше понравился. Да и работает чётко.
Два текстовых файл. trash_file - мусорник, и файл playlists с... ну пускай будет 1,2,3,4,5
А команда получилась вот такая

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

awk '{print$1}' playlists | sed -n 1p >> trash_file && sed -n 1p trash_file >> playlists && sed -i "1d" playlists | sed -i "1d" trash_file
darkfenix писал(а):
13 май 2019, 06:10
Но с другой стороны должно работать - я же за основу твой код взял.
Нет, ash его не скушал. Не понимает вторую строку

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

./script.sh: source: line 2: param.sh: not found
Или это я - "снайпер"?

Аватара пользователя

rogoznik
Сообщения: 10048
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#14

13 май 2019, 21:23

vir0id писал(а):
13 май 2019, 20:22
param.sh: not found
А ты его создал?
ИзображениеИзображение

Аватара пользователя

Автор темы
vir0id
Сообщения: 2757
Зарегистрирован: 19 дек 2017, 18:48
Решено: 15
Откуда: Рига
Благодарил (а): 163 раза
Поблагодарили: 305 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#15

14 май 2019, 04:29

darkfenix писал(а):
13 май 2019, 21:23
А ты его создал?
ну конечно. И права дал. Коприовал из баша ведь, и проверил в баше работает

Аватара пользователя

rogoznik
Сообщения: 10048
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#16

14 май 2019, 06:02

vir0id писал(а):
14 май 2019, 04:29
у конечно. И права дал. Коприовал из баша ведь, и проверил в баше работает
Права можно было не давать. Ну значит ash такого не умеет. А может заменить ash на bash или zsh? Или это никак не провернуть?
ИзображениеИзображение

no avatar

achagaev
Сообщения: 34
Зарегистрирован: 09 ноя 2017, 10:21
Благодарил (а): 5 раз
Поблагодарили: 6 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#17

14 май 2019, 09:14

vir0id писал(а):
13 май 2019, 20:22
Или это я - "снайпер"?
Можно попробовать param=`cat param.sh` вместо source param.sh
Не уверен на счёт реакции ash, так как не знаю разницы между шелами, но попробовать можно.

Аватара пользователя

rogoznik
Сообщения: 10048
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#18

14 май 2019, 10:08

achagaev писал(а):
14 май 2019, 09:14
Можно попробовать param=`cat param.sh` вместо source param.sh
Тогда содержимое файла в переменную загонит, а там строчка
ИзображениеИзображение

no avatar

achagaev
Сообщения: 34
Зарегистрирован: 09 ноя 2017, 10:21
Благодарил (а): 5 раз
Поблагодарили: 6 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#19

14 май 2019, 12:56

darkfenix,
нам никто не запрещает
echo "$param" > param.sh
вместо
echo "param=$param" > param.sh
з. ы. мне было интересно, может ли ash такое, source ему не понятен, судя по инпуту ТС

Аватара пользователя

rogoznik
Сообщения: 10048
Зарегистрирован: 27 июн 2017, 13:36
Решено: 129
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1958 раз
Контактная информация:

Как выводить строчки последовательно awk & sed?

#20

14 май 2019, 13:41

achagaev, согласен, никто не мешает. Я вот думаю почему бы не заменить ash на что более функциональнее типа bash или zsh
ИзображениеИзображение

Закрыто

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей