Передать вывод из программы в динамический именованный файл (содержит дату)

382
poor_red_neck

Я все еще новичок в кормлении из бутылочки, так что полегче. Я гуглил себя так далеко, но не могу найти ответ.

Я запускаю программу, которая выводит данные CSV, и передает его в log.csv

Я ищу способ, чтобы вывод по конвейеру содержал дату / время, когда он был создан.

Прямо сейчас команда выглядит так (hand key'd каждое утро, пока нет crontab, пока я не получу эту работу)

rtlamr -format=csv -msgtype=scm | tee /home/jonboy545/energy/logs/3-16-18_7_30.csv 

Я использую | teeтак, я все еще могу увидеть вывод на терминале, а также войти в файл.

Итак, как я могу направить вывод в динамическое имя файла? У меня есть простой скрипт bash, который будет выводить текст, но как мне сказать rtlamr | скрипт bash для генерации имени файла?

Вот скрипт под названием «log_energy.sh» для создания имени текстового файла:

#!/bin/bash today=`date '+%m_%d__%H_%M_%S'`; filename="/home/jonboy545/energy/logs/$today.csv" echo $filename; 

Если вы запустите, ./log_energy.shон просто выведет текст, как вы ожидаете:

/home/jonboy545/energy/logs/03_16__17_30_39.csv 

Так что мое глупое мышление что-то вроде этого (что, очевидно, не работает)

rtlamr -format=csv -msgtype=scm | tee /home/jonboy545/./log_energy.sh 

Теперь, когда я думаю об этом, может быть проще создать скрипт, который делает все это. Так как то так?

#!/bin/bash today=`date '+%m_%d__%H_%M_%S'`; filename="/home/jonboy545/energy/logs/$today.txt" /usr/bin/rtlamr -format=csv -msgtype=scm | tee $filename; 

Думая, что я, возможно, только что ответил на свой собственный пост, но я уверен, что скрипт выше что-то не так с ним.

1
Вы могли бы сделать свой вопрос намного проще, если бы использовали более простую команду, чем rtlamr. Как использовать команду, люди знакомы с тем, что установлено изначально, по вашему вопросу. barlop 6 лет назад 0
попробуйте $ (\ `./script \`) Или, что вы можете сделать, это запустить команду и получить вывод этой команды в переменной, десять используют эту переменную, поэтому a = $ (\ `./ abc.sh \ `) Тогда используйте $ a barlop 6 лет назад 0
Так что не ясно, как обстоят дела и каков ваш вопрос в данный момент. Если вы не уверены, работает ли ваше решение, протестируйте его. Если это не сработает, сфокусируйтесь на этой проблеме. Если это сработает, перенесите свое решение на ответ. fixer1234 6 лет назад 0
@ fixer1234 его вопрос мне понятен. Если вам не ясно, спросите его, что вы не понимаете, иначе это абсурд. barlop 6 лет назад 0
`| tee / home / jonboy545 / $ a` И затем убедитесь, что у $ a есть нужное имя файла. Делая $ a = $ (\ `abc.sh \`) barlop 6 лет назад 0
@ barlop Я не думаю, что рассматриваемая программа имеет значение. Это трубопроводный вывод. Это может быть LS | tee directory.txt, если вы хотите думать об этом таким образом. Единственное, что важно, это то, что происходит после трубы. Это то, что я не понимаю. poor_red_neck 6 лет назад 0
@ barlop, вопрос начинается с вопроса, как выполнить задачу. Затем в нем говорится о том, что якобы является решением, и ставится своего рода новый вопрос - сомнение в том, что решение будет работать, которое можно протестировать. Если решение не удается, это просто «это то, что я пытался безуспешно». Если это работает, его следует переместить в ответ. Недавний комментарий от ФП добавляет дополнительные пояснения, но не в вопросе, где должно быть содержание вопроса. Мой предыдущий комментарий разъяснил это и описал то, что было необходимо. Непонятно, что по этому поводу вы не понимаете. fixer1234 6 лет назад 0
Я думаю, что я не в курсе того, насколько конкретные, конкретные, привередливые, как бы вы это ни называли, люди на этом сайте. Чрезвычайно строг в структурировании каждого вопроса, описания и т. Д. Я понимаю ... Вы хотите последовательности или чего-то еще, но я не думаю, что я слишком далеко от основы. Может быть, немного TL; DR продолжается ... Так как linux настолько полон аббревиатур и чрезвычайно сокращенных команд и т. Д., Я просто хочу, чтобы все было прямо и точно. Не тот навык, в котором хорош этот южанин ;-) poor_red_neck 6 лет назад 0
@poor_red_neck, сайт представляет собой базу знаний о решениях, которыми могут поделиться другие люди с похожей проблемой. Надеемся, что в процессе вы получите ответ на свою проблему, но вы также отправляете вопрос в библиотеку, который другие люди могут найти при поиске. Это основывается на формате вопросов и ответов, где вся информация о вопросе находится в посте с вопросом, а решения - в постах с ответами. Информацию легче найти, когда все сосредоточено и достигает цели, без вещей, которые не будут иметь отношения к следующему человеку с подобной проблемой. (Продолжение) fixer1234 6 лет назад 0
В разделе справки можно найти множество советов, нажав на знак вопроса в верхней панели. Кстати, добро пожаловать на сайт. fixer1234 6 лет назад 0

2 ответа на вопрос

0
poor_red_neck

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

log_energy.sh:

#!/bin/bash today=`date '+%m_%d__%H_%M_%S'`; filename="/home/jonboy545/energy/logs/$today.txt" /home/jonboy545/GoCode/bin/rtlamr -format=plain -msgtype=scm | tee $filename; 

Это дает ожидаемые результаты. Если я запускаю ./log_energy.sh, я получаю вывод терминала на экране, и имя файла создается с датой.

Прочь, чтобы узнать о crontabs сейчас! В частности, как сделать так, чтобы срок действия скрипта истек в определенное время, а затем снова начался. Больше гуглить !!!!

В любом случае, спасибо за помощь, МОЖЕТ кто-то столкнется с этим, так как я клянусь, что я погуглил все это и не смог найти ответ, но теперь я вижу, что я все об этом думал неправильно.

Теперь у меня есть проблема с этим «решением». Когда я захожу, чтобы просмотреть файлы csv, они все «защищены от чтения / записи» и говорят, что они принадлежат пользователю root. Сценарии, запускаемые в crontab, выполняются от имени пользователя root? poor_red_neck 6 лет назад 0
ну, вы всегда можете изменить эти вещи, например, сделать csvs chmod 666 (чтобы каждый мог читать / писать), но помогает ли это? https://askubuntu.com/questions/419548/how-to-set-up-a-root-cron-job-properly barlop 6 лет назад 0
Да, но в основном потому, что это заставило меня понять, насколько я невежественен на самом деле. Примечание для себя: если вы запускаете crontab как sudo ... он будет редактировать crontab root. Duh. Просто отредактируйте crontab как пользователь ... проблема решена. Сделал crontab -u jonboy545 -e и, конечно, это был правильный crontab для редактирования в первую очередь ... poor_red_neck 6 лет назад 0
Разве systemd не копирует многое из того, что может сделать cron? Xen2050 6 лет назад 0
Возможно, но понятия не имел, что это было, пока я не увидел ваш комментарий. Я просто запускаю crontab каждый день в полночь, и он выполняет скрипт. Сценарий выполняет pkill текущей запущенной программы, если она была выполнена позже в тот же день из-за сбоя или чего-то еще, а затем выполняет программу rtlamr в течение 23h59m55s. К тому времени, когда crontab снова запустится, не должно быть ни одного экземпляра pkill, который нужно завершить, но он просто завершился. Тогда он делает это снова и снова. Все идет нормально! poor_red_neck 6 лет назад 0
0
Xen2050

Вы используете bash, так что вы можете использовать процесс и подстановку команд .

Из заголовка я подумал, что вы можете добавить дату в начало вывода файла журнала, который будет использовать что-то вроде этого:

$ program |while read pong; do echo $pong; echo $(date):\ $pong >> logfile; done 

Или добавление даты к имени файла будет перенаправлять на >> "$(date)-logfile"

Но похоже, что вы просто хотите использовать имя файла с tee:

rtlamr -format=csv -msgtype=scm | tee "$(date '+%m_%d__%H_%M_%S')" 

Если вы работаете как пользователь, тогда этот файл должен быть таким же, как и любой другой файл, созданный вашим пользователем.

Ах, мне нравится второй вариант, но, в конечном счете, наличие bash-скрипта сработало лучше, так как bash-скрипт позволяет мне добавить туда пару дополнительных функций. Спасибо, хотя я не знал, что вы можете поместить «динамические» данные в | ти выходной! Я выберу это как лучший ответ, потому что он прямо отвечает на вопрос. poor_red_neck 6 лет назад 0
Добро пожаловать и спасибо :) Большая справочная страница Bash кратко рассказывает о многих ее функциях, но поиск конкретной проблемы также хорош. Цитирование и порядок вещей могут стать немного странными, особенно с такими забавными персонажами, как пробелы, переводы строк, нули ... Xen2050 6 лет назад 0

Похожие вопросы