Виведення команди "watch" як список


27

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

Я також хочу зберігати кількість за кожну секунду.

Що мені потрібно - це результат наступної команди у вигляді списку, який оновлюватиметься щосекунди:

watch -n1 'wc -l my.log'

Як вивести "оновлення" команди "watch" у вигляді списку?

Відповіді:


24

Ви можете використовувати -tперемикач, через watchякий він не друкує заголовка. Однак це все одно очистить екран, тому вам може бути краще простого циклу оболонки:

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

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


Однак зауважте, що це робити не буде рівно щосекунди (за допомогою zsh або ksh93, ви можете налаштувати час сну, щоб врахувати дрейф, що виникає при виконанні команд у циклі).
Stéphane Chazelas

2
@StephaneChazelas не буде з цим wait- просто спробуйте watch -n 1 "sleep 5".
петерф

Дійсно (я перевірив реалізацію програмного забезпечення і програм для завантаження) Я вважав, що це watchкорисне для єдиного , але це не дає вам навіть цього, тому ваше рішення є таким же хорошим, як і на основі годинника, але не відповідає на питання "швидкість, з якою росте файл журналу" з великою точністю.
Стефан Шазелас

Що ж, якщо кінцева мета - рядки в хвилину , то вибірка її раз на 10 секунд - це більш ніж достатньо імхо - тому накладні витрати не такі вже й страшні (якщо, звичайно, файл зростає дуже великим, звичайно). І насправді зсередини циклу можна надрукувати інформацію про синхронізацію (навіть як до, так і після закінчення команди, якщо це необхідно), і тоді точність може покращитися (порядки величини) навіть для великих файлів.
петерф

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

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.
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.