2015-05-22 5 views
2

мне нужна помощь с Баш скрипт я запускаю так:Как отобразить ход другой команды

do_something > file.txt (я использую третью строчку этого file.txt в другой эхо-выход)

сейчас Мне нужно получить несколько символов во второй строке файла .txt. (Есть только точки - «»)

я могу получить количество символов с помощью этой команды:

progress=$(awk 'NR==2' file.txt | grep -o \. | wc -w)

Но проблема в том, что file.txt и количество символов на второй строке находится «индикатор выполнения», поэтому он изменяется во времени от 0 - XY (т.е. 100) символов. Я хочу использовать его, чтобы увидеть прогресс в процентах: echo -ne "$progress % \\r"

Как я могу это сделать в цикле? do_something > file.txt должен начинаться только один раз. В ближайшие ~ 5-20 секунд он печатает точки во второй строке, и я должен каждый раз обновлять это число до моего выходного эха «XY%».

Как я могу читать из file.txt каждый второй и найти там «новый/обновленный» количество символов * < редактировать

редактировать: * это процесс в режиме реального времени. My do_something> file.txt - это «печать» точек в этом файле, и я хочу, чтобы результат печати сохранялся в $ progress в режиме реального времени. Таким образом, первая команда печати точек в файл, и я их подсчета в режиме реального времени, каждый второй и распечатать сколько процентов сделано от 0-100%

+0

Когда вы хотите остановить печать? – geckon

+0

Я бы прекратил печатать, когда вторая строка file.txt достигает 100 символов. – pEpe

+0

См. Мой обновленный ответ (http://stackoverflow.com/a/30396366/4408382) и дайте мне знать, если он сработает для вас. – geckon

ответ

1

то, что вы хотите сделать, это запустить do_something > file.txt в фоновом режиме, а затем следить за ним. Для этого вы можете использовать специальный сигнал kill0.

do_something > file.txt & 
PID=$! 
while kill -0 $PID 2> /dev/null 
do 
    [calculate percent complete] 
    [display percent complete] 
    sleep 5 
done 
+0

Спасибо, это решение тоже работает и выглядит эффектно в коде. Теперь я понимаю, что мне нужно начать do_something> file.txt в фоновом режиме :-), как просто, спасибо[email protected] – pEpe

+0

@pEpe Я думал, что это было достаточно ясно :) Я обязательно добавлю его к своему ответу. – geckon

1

Во-первых, вы должны запустить команду в фоновом режиме:

do_something > file.txt & 

Затем вы можете просматривать изменения в выходном файле. Это будет бесконечно печатать вторую строку file.txt каждую секунду.

while true; do sed -n '2p' < file.txt; sleep 1; done 

Если вы хотите напечатать только сколько символов на второй линии, вы можете сделать это:

while true; do sed -n '2p' < file.txt | wc -m; sleep 1; done 

Если вы хотите остановиться, когда есть 100 символов, на второй строке, может это сделать:

MAX="100" 
CUR="0" 
while [ $CUR -lt $MAX ]; do CUR=`sed -n '2p' < sprint | wc -m`; echo $CUR; sleep 1; done 
+1

Спасибо! Я использовал его в этой форме, и он работает! ssh do_something> file.txt | while [$ CUR -lt $ MAX]; do CUR = 'sed -n '2p' pEpe

Смежные вопросы