Есть ли команда Unix для записи изменений в вывод другой команды?

251
Ilya Bobyr

У меня длительная операция, которая влияет на состояние. Это состояние показывается, скажем, выполнением определенной команды showst.

Я хочу, чтобы журнал всех возможных выходов showstотображался во время этой длительной операции.

Для короткой операции я бы использовал

watch -n0.1 showst 

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

Есть ли команда, которая может мне помочь?


Изменить, чтобы добавить немного разъяснений.

Вот конкретный пример того, что я хотел бы увидеть. Допустим, операция длится час. showstвыводится Aна первые полчаса, затем Bна 10 минут, затем Aснова переключается на .

Я хочу увидеть журнал, похожий на этот:

2016-08-19 12:00: A 2016-08-19 12:30: B 2016-08-19 12:40: A 

Было бы здорово, если бы Aи Bмог быть многострочным.

Это похоже на то, что watch --differencesможно делать на терминале, если вы сидите и смотрите, но я хочу это в журнале.

1
это выводит на STDOUT? Вы можете попробовать showst> log.txt & на следующей строке вы можете указать -f log.txt или grep файл или что-нибудь еще. cybernard 7 лет назад 0
Вывод в stdout, но команда выводит текущее состояние и завершает работу. Если бы я запустил 'showst> log.txt', я бы получил только текущее состояние. Я хочу увидеть все возможные состояния за определенный период времени. Я хочу, чтобы идентичные выходные данные были «свернуты», и только когда что-то в выходных данных изменяется, я хочу видеть новую запись в журнале. Ilya Bobyr 7 лет назад 0
showst >> log.txt добавляется. cat log.txt | sort - unique скрывает и сортирует. cybernard 7 лет назад 0
Добавление само по себе бесполезно, если после вывода текущего состояния «showst» существует. И если бы я запустил его в цикле, в течение периода времени журнала у меня было бы несколько идентичных записей. Я бы не хотел этого. Я хочу видеть, когда выход изменился. Похоже на «watch --differences», но в журнале, а не на терминале. Ilya Bobyr 7 лет назад 0

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

1
A. Loiseau

Я не знаю о выделенной команде, но я бы написал что-то вроде этого:

(while true; do sleep 0.1; showst; done) | uniq 

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

Смотрите также справочные страницы сна и уникальности .

Это работает только в том случае, если вывод 'showst' занимает одну строку. И это не говорит мне, когда произошли изменения. Я бы не увидел последовательность изменений. Если состояние изменится с A на B, а затем снова на A, у меня будут только «A» и «B» на выходе. Ilya Bobyr 7 лет назад 0
@IlyaBobyr в вашем последнем предложении: A-> B-> A покажет вам все 3, потому что `uniq` предполагает, что ему дан отсортированный список: он удаляет только последовательные дубликаты. drewbenn 7 лет назад 0
Как сказали @drewbenn и справочная страница, `uniq` печатает первое появление любой новой серии, как только она появляется, и игнорирует последовательные дубликаты. Вы можете `| grep` вызов showst для извлечения искомой строки или слов, и вы можете добавить` | пока read NEW_STATE; сделать эхо "$ (дата) - $ "; done`, чтобы заранее указать даты обнаруженных изменений на результате. A. Loiseau 7 лет назад 1

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