Вывод команды 'watch' в виде списка


27

Я хочу сделать несколько простых вычислений количества строк в минуту, добавленных в файл журнала.

Я хочу также хранить счет за каждую секунду.

Что мне нужно, так это вывод следующей команды в виде списка, который будет обновляться каждую секунду:

watch -n1 'wc -l my.log'

Как вывести «update» команды «watch» в виде списка?

Ответы:


24

Вы можете использовать -tпереключатель, watchкоторый заставляет его не печатать заголовок. Тем не менее, это все равно очистит экран, так что вам может быть лучше с простым циклом оболочки:

while sleep 1; do
    wc -l my.log
done

Одним из преимуществ является то, что вы можете легко добавлять другие команды (например date) и / или sedнаправлять вывод, чтобы переформатировать его. Кстати, если вы поменяться sleep 1с wcв цикле, он будет автоматически прекращается на наличие ошибок.


Однако обратите внимание, что он не будет делать это точно каждую секунду (с помощью zsh или ksh93 вы можете настроить время сна, чтобы учесть дрейф, возникающий при выполнении команд в цикле)
Стефан Шазелас,

2
@StephaneChazelas также не будет с wait- просто попробуйте watch -n 1 "sleep 5".
Петер

Действительно (я проверил как procps, так и реализации busybox). Я думал, что это было единственное, для чего watchбыло полезно, но оно не дает вам даже этого, поэтому ваше решение столь же хорошо, как и решение на основе часов, но ни одно из них не отвечает на вопрос « насколько быстро растет файл журнала» с большой точностью.
Стефан Шазелас

Что ж, если конечной целью является количество строк в минуту , то выборка раз в 10 секунд более чем достаточна, так что накладные расходы не так уж страшны (если, конечно, файл не станет действительно большим). И фактически из цикла можно распечатать информацию о времени (даже до и после завершения команды, если это необходимо), и тогда точность может стать лучше (на порядки) даже для больших файлов.
Петер

1
У @peterph watchесть -pопция, которая сделает это правильно, если это вообще возможно (очевидно, вы не можете выполнить команду, которая занимает 5 секунд каждую 1 секунду, если вам не разрешено многократное одновременное выполнение). Я знаю, я написал это :-P
Дероберт

8

Старый вопрос, но я нашел очень простой ответ:

watch -n1 'wc -l my.log | tee -a statistics.log'

Это будет выполнять wcкаждую секунду, добавлять свои выходные данные в файл statistics.log, а также отображать его на экране.
Итак, вы получите файл, заполненный числами, представляющими последовательное количество строк my.log.


Обратите внимание, что эта команда watch "($MYCMD | tee -a $MYLOG)", нет watch "($MYCMD)" | tee -a $MYLOG. Если вы ошиблись, как я, результат будет очень запутанным. Еще одна вещь, на которую следует обратить внимание, это то, что эта команда не добавляет метку времени выполнения каждой команды по умолчанию, поэтому ответ с циклом может все же работать лучше для вас.
неопытный



1

Я столкнулся с этим вопросом, когда пытался получить лучший / зарегистрированный вывод du -sh $data_path. Я использовал шаблон "while command, do sleep", найденный здесь, но использовал какой-то сложный AWK, чтобы получить желаемый результат.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

На самом деле я сделал это как вкладыш, поэтому есть точки с запятой. Но чтобы сделать его читабельным, я разбил его. Вывод выглядит так:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

Вы можете создать скрипт, который сделает это за вас. Я назвал мой keep(как, продолжай делать это) и положил его на binпуть.

Это мой сценарий:

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
Вы должны использовать "$@"для выполнения команды (аргументы), а не без кавычек $*. Таким образом, оболочка будет хранить аргументы в кавычках и т. Д., Как и ожидал пользователь. FTFY.
Ройма
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.