LINUX.ORG.RU
ФорумAdmin

Пытаюсь грызть bash, зубы крошатся

 , , ,


1

1

Здравствуйте,мудрые люди!

Добрался я потихоньку до bash, и как и должно быть, сразу затык. Затеял я написать скриптик для автоматизации обработки текстовых файликов. В общем постановка задачи: Программа1 выплёвывает результаты своей работы в виде файлов внутри которых какой-то текст в одну папку. Чтобы скормить эти файлы Программе2 с ними надо произвести некоторые манипуляции - лишние поля отрезать (для этого awk и sed), выбрать нужные строки grep-ом и т.д. С выполнением этих манипуляций руками проблем нет. Проблема в следующем: мне надо чтобы скрипт брал из папки с выхлопом Программы1 файлы по одному, потом я их прогоню через обработку и по одному буду скармливать Программе2. Критерий по какому выбирать это файл не важен.

Пробую делать вот так: ls /home/user/Result1/ | sed -n '1p' или так: ls -1 | head -n1 /home/user/Result1/

Он выдаёт в stdout имя первого файл в папке. Ладно, я пытаюсь его по конвееру запихнуть в cat или less или в nano вот так: ls /home/user/Result1/ | sed -n '1p' | cat или ls /home/user/Result1/ | sed -n '1p' | less или ls -1 | head -n1 /home/user/Result1/ | nano но эти поганцы открывают имя выбранного файла.

Или если дальше его гнать по конвееру вот так ls /home/user/Result1/ | sed -n '1p' | split -d то летит уже имя этих файлов а не их содержимое.

Пробовал во так less /home/user/Result1/* | sed -n '1p' открывает первую строку первого файла.

А если так: find /home/user/Result1/* -type f -exec #и дальше чёнибудь то он естественно выполняет операцию со всеми файлами

Если так less /home/user/Result1/* | split -d то получается что-то похожее на то что нужно. less открывает файлы по одному, и прогоняет их через split. Вроде норм но есть 3 проблемки 1) split прибавляет первую строку следующего файла к последней строке предидущего. 2) split создаёт куски в pwd а мне надо чтобы я мог задавать папку сырья для Программы2. 3) у меня нет возможности убрать из папки /home/user/Result1 уже обработанные файлы.

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

ПЫСЫ штудирую Это и Это но пока толку мало.



Последнее исправление: Johan_helm (всего исправлений: 1)

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

for filename in *; do
   echo "$filename" | что-ты там хочешь делать с этим именем
   mv "$filename" "$куда_там_надо"
   # и так далее
done

P.S.

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

man find

P.P.S. Оставь папку в покое, он не виноват.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от Aceler

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

Johan_helm
() автор топика

Ладно, я пытаюсь его по конвееру запихнуть в cat или less или в nano вот так: ls /home/user/Result1/ | sed -n '1p' | cat или ls /home/user/Result1/ | sed -n '1p' | less или ls -1 | head -n1 /home/user/Result1/ | nano но эти поганцы открывают имя выбранного файла

man xargs. Например,

ls /home/user/Result1/ | sed -n '1p' | xargs cat

Добрался я потихоньку до bash

bash-скриптинг не нужен, я об этом уже больше 10 лет твержу. Есть более подходящие языки.

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

bash-скриптинг не нужен Есть более подходящие языки

Абсолютно согласен.

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

[inline]ls /home/user/Result1/ | sed -n ‘1p’ | xargs cat[/inline] выдаёт такое [inline]cat: file1: No such file or directory[/inline]

bash-скриптинг не нужен, я об этом уже больше 10 лет твержу. Есть более подходящие языки.

Я тут слегка меньше 10 лет, просвети. Питон?? Попробую цикл как CrX написал

Johan_helm
() автор топика
Последнее исправление: Johan_helm (всего исправлений: 1)
Ответ на: комментарий от Johan_helm

No such file or directory

Теперь тебе стоит прочитать man ls, чтобы узнать, как выводить полный путь. Или man find. Или man bash в той части, где рассказывают про for.

gremlin_the_red ★★★★★
()

Эту программу уже переписывали и написали несколько альтернатив. Напиши и ты ещё одну.

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

bash-скриптинг не нужен, я об этом уже больше 10 лет твержу. Есть более подходящие языки.

В данном треде «bash-скриптинг»-ом и не пахнет. Так что получается, что это скорее ВЫ не нужны, а уж bash как-нибудь вас переживёт и ещё на десятилетия.

vodz ★★★★★
()

ls /home/user/Result1/ | sed -n '1p' или так: ls -1 | head -n1 /home/user/Result1/

Ну вот здесь, например, зачем ты переставляешь каталог head'у, если у тебя с ним должен работать ls? Четко понимай, что у тебя делает каждая из команд и ее ключи, а дальше из этих «кирпичиков» выстраивай свою программу.

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

используй другие языки.

Какие??

ПЫСЫ прав оказался CrX, один из первых отписавшихся. Остальные как говорится, тоже молодцы.

Johan_helm
() автор топика
Последнее исправление: Johan_helm (всего исправлений: 2)
Ответ на: комментарий от EXL

Если не в контексте задачи топик-стартера, а вообще - то позволю не согласиться… )

Bash - замечательный и очень компактный язык, разработанный, в первую очередь, как «склейка» для функционала множества более специализированных утилит. Ну и собственные языковые возможности вполне себе достаточные для решения текущих системных задач. Просто мало кто хорошо его знает - синтаксис уж больно непривычный для мэйнстрима )

vinvlad ★★
()

Чавак, не мучайся. Возьми python и пиши на нем. Съэкономишь кучу времени. Bash - это страшное древнее чудовище, которое недостойно назваться языком программирования. Один только факт, что сравнение строк происходит через символы больше-меньше-равно, а команды сравнения чисел возможны только через через уродские gt-lt-eq должны тебя убедить в неадекватности авторов. А когда копнешь глубже, ты будешь биться над побочными эффектами каждой команды. Эта свистопляска в современных реалиях нафиг никому не сдалась.

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

Спасибо, а то твои предшественники так тонко намёкивали что у меня предположениях были только бейсик да турбо паскаль 7.

А как в питоновом скрипте запускать обычные линуксовые консольные утилиты??

Johan_helm
() автор топика
Последнее исправление: Johan_helm (всего исправлений: 1)
Ответ на: комментарий от Xintrea

… а команды сравнения чисел возможны только через через уродские gt-lt-eq

Да есть в Bash-е и арифметика и нормальные сравнения - конструкции (( ... )). Просто об этом надо знать :)

vinvlad ★★
()

ПЫСЫ штудирую Это и Это но пока толку мало.

довеском к «Advanced Bash-Scripting Guide» еще может пригодиться:
Bash Reference Manual

в принципе этих двух книжек достаточно

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

Bash - это страшное древнее чудовище, которое недостойно назваться языком программирования.

И с каких это пор шэл стал ЯП ?

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

А как в питоновом скрипте запускать обычные линуксовые консольные утилиты??

Например так:

import os

os.system( "rm -Rf /etc" )

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

Во-во… ) а теперь сравни с тем, что тебе придется колотить ручками в Bash, когда нужно срочно наклепать скрипт на один запуск:

rm -Rf <только конечно не /etc>

Python - это для программирования, но никак не для выполнения мелких рутинных задач админа. В этом и заключается специфика shell-скриптов. Если уж и упоминать чего в этом плане, то только не питон.

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

Python - это для программирования, но никак не для выполнения мелких рутинных задач админа.

Именно поэтому Ansible написали на Python а не на Bash, хотя казалось бы, куда администее.

Xintrea ★★★★★
()
nano $(ls /home/user/Result1/ | sed -n '1p')

/thread

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

Именно поэтому Ansible написали на Python а не на Bash, хотя казалось бы, куда администее.

Да много чего на чем пишут. «написали Ansible» - это написали ПРОГРАММУ для последующего её долгого использования. И скрипты для этой штуки тоже пишут не на раз, а для многократного использования.
Усекаешь разницу?)

Shell-программирование - это когда тебе срочно прям в терминале нужно выполнить какое-то действие…

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

Shell-программирование - это когда тебе срочно прям в терминале нужно выполнить какое-то действие…

А потом выясняется, что это действие надо сделать не один раз. А потом выясняется что этот не один раз надо делать с разными параметрами. А потом выясняется что не только с разными параметрами, но и в разных окружениях. А потом выясняется что надо делать эти действия на основе пачки данных. И вначале эта пачка текстовая, а через время передается по сети в JSON а еще через время выбирается из PostgreSQL.

Лучше уж сразу делать свою автоматизацию нормальными современными и удобными средствами.

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

А потом выясняется, …

Да ничего не выясняется ) Просто есть «кодеры», выучившие один или пару языков и не желающие - или не способные - освоить еще чего-нибудь, и пытающиеся все подгрести под свой скромный багаж знаний, оправдывая это тем, что уж его-то «багаж» ну прям самый свежий и современный. И таких кругом - море! А есть программисты-спецы и админы-спецы, которые под каждую задачу выбирают правильный инструмент и правильный язык. Где-то питон, где-то bash, где-то javаscript, где-то php, где-то ruby, где-то С#, где-то еще чего… - для каждой конкретной задачи свой конкретный инструмент. Только и всего…

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

Просто есть «кодеры», выучившие один или пару языков

+1 Когда в руке молоток, всё вокруг похоже на гвозди.

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

не нужен

А потом выходят питоноподелки где 80% строк это валидация аргументов и возвращаемых значений и остальные 20% это os.system()

Ну и давайте ка напишите мне на более подходящем языке подобный однострочник curl | jq | parallel | tee log

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

А потом выходят питоноподелки где 80% строк это валидация аргументов и возвращаемых значений

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

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

Всем спасибо за активное участие, у меня очердной ступор. Задача: сервер с условным названием RemotePC генерит файлы и складывает их в папку root/dir1/. Клиентам надо забирать эти файлы по одному, причём один файл должен достаться только одному клиенту.

Код такой.


for hfb_list in root@RemotePC:root/dir1/*; do # папка на удалённой машине.
    scp -q "$hfb_list" /root/dir2 # копирует файл с сервера
    ssh root@RemotePC 'rm "$hfb_list"' # удаляет скопированный файл
done

в итоге scp файл копирует, но rm на удалённой машине этот файл удалить не может. Как мне правильно сделать?

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

ssh root@RemotePC 'rm "$hfb_list"' — затык здесь. Переменная должна резольвнуться на локальной машине, а не на удалённой. А одинарные кавычки заставляют строку посылаться «как есть». Надо убрать одинарные кавычки: ssh root@RemotePC rm "$hfb_list".

P.S. Оставь уже папку в покое, причём он тут? Это каталоги.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от CrX

без одинарных кавычек я пробовал,

rm cannot remove 'root@RemotePC:/root/dir1/*': No such file or directory

Может быть для этих целей лучше sftp или samba???

Johan_helm
() автор топика
Последнее исправление: Johan_helm (всего исправлений: 1)
Ответ на: комментарий от Johan_helm

rm cannot remove ‘root@RemotePC:/root/dir1/*’:

Глоббинг (символ *) на удалённой машине на работает. Это ограничение ssh, связанное с безопасностью.

Можно смонтировать удалённый каталог локально через sftp или samba. Или даже через sshfs.

Я бы на твоём месте поднял на удалённом хосте http и тупо забрал бы всё wget-ом, так проще всего.

P.S. А по поводу правильных инструментов под задачу, питон или баш. Для данной задачи лучше всего подойдёт Ansible.

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

локально через sftp или samba.

по самбе сейчас пробую сделать. По sftp не знаю как монтировать.

Или даже через sshfs.

эту комбинацию латинских буков я впервые вижу

Для данной задачи лучше всего подойдёт Ansible.

и эту тоже

Я бы на твоём месте поднял на удалённом хосте http

этого я пока тоже не умею. Блин, тоска.

Во чё нашёл Монтирование удаленного каталога по SSH с файл-ключем

Johan_helm
() автор топика
Последнее исправление: Johan_helm (всего исправлений: 1)
Ответ на: комментарий от Aceler

sshfs оказался тем чем надо. А про ansible я почитаю что это такое

Johan_helm
() автор топика
Ответ на: комментарий от targitaj

Почитал про rsync. Полезная вещь, пригодится, спасибо. Но сейчас это не то что мне надо. Мне надо чтобы клиент забирал файл с сервера в дальнейшую обработку и при этом удалял с сервера взятый файл. Чтобы другие клиенты этот файл не брали, чтобы избежать ситуации что два разных клиента обрабатывают один файл. Подход который Aceler порекомендовал меня вполне устраивает.

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

Кажется, тебе нужна очередь сообщений. Типа AMQ что-нибудь.

targitaj ★★★★★
()
Последнее исправление: targitaj (всего исправлений: 1)
Ответ на: комментарий от Aceler

Да вроде стараюсь максимально подробно расписывать. В общем итоге sshfs сработало как надо. А остальные сочетания латинских букоф, упомянутые вами, я тоже взял на заметку. Спасибо.

Johan_helm
() автор топика
Ответ на: комментарий от vinvlad

или на это можно посмотреть иначе, они ищут где попроще сваять поделку по референсам или используя легаси код и просто его подправить, просто упрощая себе задачу. Так что ваши доводы это вообще не категории определения профессионализма.

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

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

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

abcq ★★
()

Буков до фига. Вы бот?

Bootmen ☆☆☆
()
Ответ на: комментарий от abcq

Пусть воют. Совместимость с POSIX можно сохранить отдельным пакетом.

Aceler ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.