Скопировать первую строку из файла , удалить ее и (Копировать вставить удалить)

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

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

Ответить
froa
Сообщения: 12

Скопировать первую строку из файла , удалить ее и

Сообщение froa »

Добрый вечер, нужна реализация на shell скрипте следующей задумки
1. открываем файл тхт
2.копируем первую строчку
3.удаляем ее из файла
4.закрываем файл
5.вставляем строчку в файл sh после нужных символов допустим после sait.ru/вот_тут

Реализовано на питоне , но очень нужна реализация на shell скрипте
Реализация на pyton :

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

def record():
    with open('C:\op\link.txt') as  inp :
        try:
            temp = inp.readlines()
            url = temp.pop(0)
            with open ('C:\op\link.txt','w') as out:
                for i in temp :
                    out.write( i)
                return ''.join(['Сайтюру', url] )
        except IndexError:
            print('1')
PACKAGE = 'com.android.chrome'
ACTIVITY = 'com.google.android.apps.chrome.Main'
COMPONENT = PACKAGE + "/" + ACTIVITY
URI = record()


С помощью shell можно ли подобное сделать ? что бы вставить строчку в этот код :

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

#!/system/bin/sh
shell
am start -n com.android.chrome/com.google.android.apps.chrome.Main 'http://sait.ru/СЮДА'
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Скопировать первую строку из файла , удалить ее и

Сообщение Bizdelnick »

Примерно так:

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

s=$(head -n1 "$FILE1")
sed -i "s|site\.ru/?|site.ru/$s|" "$FILE2"
sed -i '1d' "$FILE1"
Не проверял. По-хорошему строку надо ещё URL-кодировать и экранировать в ней то, что может быть неправильно интерпретировано sed'ом.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
froa
Сообщения: 12

Re: Скопировать первую строку из файла , удалить ее и

Сообщение froa »

Это выходит как отдельный скрипт ? То есть его нужно запускать отдельно перед запуском моего скрипта ?
В связке это не реализовать ?
Каждый раз при запуске скрипта что бы бралась первая строчка с удалением и вставлялась в нужное место
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Скопировать первую строку из файла , удалить ее и

Сообщение Bizdelnick »

В смысле — чтобы был только один скрипт? Можно, конечно. Какой вопрос Вы задали, на тот я и отвечал. Замените вторую строчку приведённого мной кода на нужную команду, и всех дел.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2601
ОС: Gentoo

Re: Скопировать первую строку из файла , удалить ее и

Сообщение ormorph »

Смотрю тут андроид, если нет прав root могут быть проблемы с реализацией т.к. может отсутствовать sed и т.п.
Для android 5.0 и выше root не обязателен, есть пакет termux, он позволяет запускать bash установить wget отдельно, т.к. wget входящий в busybox урезанный. В данном пакете программы устанавливаются через apt.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2601
ОС: Gentoo

Re: Скопировать первую строку из файла , удалить ее и

Сообщение ormorph »

Нашел тут решение на более старые версии Android без рута.
Ставится Terminal IDE, устанавливается система и запускается Terminal IDE.
После этого доступен bash sed и прочие утилиты linux. Конечно решение не такое красивое как в termux, на моем девайсе например не работали комбинации ctrl alt в termux это клавиша громкости. Но для удобства можно соединить по telnet:
На android поднимаем сетевой интерфейс и выполняем:

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

$ export PS1=#
# telnetd


После этого можно соединиться, на компьютере выполнить:

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

$ telnet -e '' xxx.xxx.xxx.xxx 8080

Где xxx.xxx.xxx.xxx IP android девайса, посмотреть можно выполнив в Terminal IDE ifconfig.
После будет доступна консоль и будут доступны консольные редакторы nano, vim.
А так n-ю строку можно получить с помощью sed выполнив:

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

# первая строка
sed '1!d' "$FILE1"
# вторая строка
sed '2!d' "$FILE1"

В скрипте можно заменить head.
Спасибо сказали:
froa
Сообщения: 12

Re: Скопировать первую строку из файла , удалить ее и

Сообщение froa »

все верно , у меня андройд, с root правами и busybox )
Я так понимаю изменять $File На $ /расположение/до/Файла /1.txt ?
У меня скрипт и текстовый файл лежит в одной папке
/storege/sdcard0/Download/link.sh - расположение скрипта
-\\- link.txt - расположение текстового файла , именно с этого файла нужно брать первую строку .
В итоге нужно прогнать через скрипт более 1000 строк
Можно конечно и вручную - но это запарно, на питоне это реализовал уже но разница во времени в 2 раза больше ( python+monkeyrunner 40 сек обработка 1 строки,выполнение скрипта, а на shell до 20 )
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2601
ОС: Gentoo

Re: Скопировать первую строку из файла , удалить ее и

Сообщение ormorph »

froa писал(а):
24.01.2017 20:36
все верно , у меня андройд, с root правами и busybox )
Я так понимаю изменять $File На $ /расположение/до/Файла /1.txt ?


Почти так.
В шел File - название переменной в которой содержится путь к файлу, $File возвращает значение переменной File:

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

# присваивание переменной File
File="/расположение/до/Файла /1.txt "
# вывод на экран значения переменной File
echo $File


Знак долара ставится перед названием переменной, чтобы отличить обычный текст от переменной.
Т.е.

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

AA="World!"
#Выводит на экран Hello World!
echo "Hello $AA"

Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2601
ОС: Gentoo

Re: Скопировать первую строку из файла , удалить ее и

Сообщение ormorph »

В итоге нужно прогнать через скрипт более 1000 строк

Ну тогда зачем вообще удалять строки в файле?
Их можно прогнать по очереди в цикле и никаких сторонних утилит не надо, только средства shell:

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

#!/system/bin/sh

File="/путь/test1.txt"

while read tmp
do
  am start -n com.android.chrome/com.google.android.apps.chrome.Main "http://sait.ru/$tmp"
done < $File
Спасибо сказали:
froa
Сообщения: 12

Re: Скопировать первую строку из файла , удалить ее и

Сообщение froa »

Спасибо, я запустил скрипт и по началу он не работал. Потом подкрутил его для андройда и как все началось :D он начал обрабатывать строки , а паузы я не стал выставлять ибо думал не сработает :DDD Спасибо тебе )
Скинь свой номер чего либо , закину пару соток ))
И еще вопрос . В shell есть такая функция как call на Windows в cmd
что бы запустить внутри на писаного выше цикла .
Насколько успел понять то так :

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

#!/system/bin/sh

File="/путь/test1.txt"

while read tmp
do
  am start -n com.android.chrome/com.google.android.apps.chrome.Main "http://sait.ru/$tmp"
 ./путь/до/script.sh
done < $File


Пока он выполняется цикл ждет, как только выполниться последняя команда в script.sh то цикл продолжит ?
Еще раз спасибо !
Вопрос не по теме . С чего начать обучение ? в Shell. Толковый учебник мб или сайт ?
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2601
ОС: Gentoo

Re: Скопировать первую строку из файла , удалить ее и

Сообщение ormorph »

Скинь свой номер чего либо , закину пару соток ))

не надо, тут просто спортивный интерес)

как только выполниться последняя команда в script.sh то цикл продолжит ?

Ну да.
Для shell обычно Дэвид Тейнсли - Linux и Unix. Программирование в SHELL
Для bash если надо Advanced Bash Scripting Guide, есть русские переводы например тут

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

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

export TMP="белеберда"
/путь/до/script.sh


В script.sh вывести на экран значение глобальной переменной TMP:

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

echo $TMP

Зы: конструкция вызова скрипта ./ нужна для вызова скрипта из текущего каталога, а так хватит просто указания пути к скрипту без точки впереди.
Спасибо сказали:
Ответить