2016-07-21 6 views
0

Есть ли способ записать в файл данные, полученные в бесконечном цикле? У меня есть сценарий, который отображает веб-контент в моем терминале, как он отображается на веб-странице. Но все мои попытки до tee привели к созданию пустого файла. Я полагаю, что это потому, что, не выходя из цикла, нет возможности писать что-либо в файл. Но я читал о бесконечных циклах, заполняющих жесткий диск с нежелательными данными. Таким образом, похоже, что запись вывода из конвейера команд также должна быть возможна.Как записать в файл данные, полученные в бесконечном цикле

get_page() { 

    osascript -e \ 
    'tell application "Google_Chrome" to tell window 1 to tell active tab to execute javascript "document.body.innerText"' 

} 

while get_page | grep -E '[:alnum:]' 
do 
    sleep 1 & 
done < <(get_page) | awk '!x[$0]++' 

Обратите внимание, что единственная причина, это работает на всех является awk !x[$0]++ команда, которая (поправьте меня, если мое объяснение не является точным) считывает входные данные он получает, а затем удаляет повторяющиеся строки в то же время сохраняя порядок строк как Что ж. Без этого на месте этот сценарий был бы сумасшедшим.

ответ

0

Несколько вещей:

  1. цикл не бесконечен. Он выполняет итерацию, пока функция getpage не возвращает ненулевое значение.

  2. Вы хотите, чтобы цикл выполнялся один раз в секунду? В этом случае удалите & после sleep 1 или он выполнит намного быстрее! & ставит процесс sleep в фоновом режиме и продолжается.

  3. Вы звоните getpage дважды. Это, вероятно, непреднамеренно. Я не уверен, что он возвращается, но вы, вероятно, хотите что-то вроде следующего вместо:

    while true; do 
        getpage 
        sleep 1 
    done | awk '!seen[$0]++' | tee output.log 
    

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

awk '!seen[$0]++ { print; fflush() }' 

Незначительная проблема с этим состоит в том, что процесс awk будет держать копию каждой уникальной строки ввода в память. Это будет расти, поскольку с выхода getpage будут считываться более уникальные строки.

+0

С man-страницы 'uniq' - * Повторяющиеся строки на входе не будут обнаружены, если они не смежны, поэтому может потребоваться сначала отсортировать файлы. * Команда' awk' в вопросе будет обнаруживать все дублирует и сохраняет заказ. Это то, что я использую много. Ваше решение выводит данные и также позволяет использовать команду 'tee', но' awk' необходим для вывода только поистине уникальных строк. Я не понимаю, когда я использую ваше решение и заменяю 'uniq' на' awk' никакие данные не выводятся на мой терминал или в выходной журнал. –

+0

@ user556068 Вы правы насчет 'uniq'. Было слишком рано утром. Сожалею. Получает ли 'getpage' сам по себе данные по стандартным выводам? – Kusalananda

+0

Да, он производит то, что в настоящее время отображается на экране браузера. И дальнейшее тестирование показывает, что 'awk' выводит данные только в том случае, если это последняя команда в конвейере. Поэтому я могу 'tee' в выходной журнал, а затем использовать' awk' после этого, но при этом получается выходный журнал размером 3 мб за 60 секунд. –