Заменить файл журнала, не затрагивая «Перенаправление stdin и stdout», используя nohup

Команда wc подсчитывает слова в выводе grep, который включает "for":

> grep shell test.txt
for shell_A
shell_B
shell_C

Так что действительно есть 4 слова.

Если вы хотите подсчитать только количество строк, содержащих определенное слово в файле, вы можете использовать параметр -c команды grep, например,

grep -c shell test.txt

Ни один из них не считается words , но может соответствовать другим вещам, которые включают эту строку . Большинство реализаций grep (GNU grep, современные BSD, а также AIX, HPUX, Solaris) предоставляют параметр -w для слов, однако , который отсутствует в POSIX. Они также распознают регулярное выражение, например,

grep -e '\' test.txt

, которое соответствует параметру -w .Опять же, , что не входит в POSIX. Solaris документирует это, в то время как AIX и HPUX описывают -w без упоминания регулярного выражения. Все они кажутся последовательными, трактуя «слово» как последовательность букв, цифр и подчеркивания.

Вы можете использовать регулярное выражение POSIX с grep для сопоставления слов (разделенных пробелами и т. Д.), Но в вашем примере нет ни одного, которое является просто «оболочкой»: все они имеют какой-то другой символ, касающийся совпадений. В качестве альтернативы, если вас интересуют только буквенно-цифровые символы (и нет подчеркивания) и вы не против сопоставления подстрок, вы можете использовать

tr -c '[[:alnum:]]' '\n' test.txt |grep -c shell

Предлагаемый вариант -o не относится к POSIX, и поскольку OP не ограничивал вопрос Linux или BSD, это не то, что я бы рекомендовал. В любом случае он соответствует не слов , а строкам (что было ожиданием OP).

Для справки:

0
12.03.2019, 12:01
2 ответа

Обязательно добавьте вывод в файл, т. е. используйте >>, а не >.

Затем вы можете использовать «копировать и обрезать», чтобы сохранить журнал:

cp production.log production.log.1 && cp /dev/null production.log

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

Обратите внимание, что утилита logrotateимеет специальную директиву для выполнения именно этого:copytruncate.

Смысл использования добавления, а не простого перенаправления, заключается в том, что в противном случае программа, записывающая в файл журнала, может запомнить свое смещение записи, так что, если файл журнала был, например. 2 МБ, и вы усекаете файл, и программа снова записывает, вы можете получить разреженный файл журнала с 2 МБ нулевых блоков, а затем снова журналы.

3
28.01.2020, 02:18

Убедитесь, что он записывает стандартную ошибку или, по крайней мере, стандартный вывод, и что его стандартный вывод/ошибка является концом записи канала, на конце чтения которого вы запускаете инструмент, который поддерживает строго ограниченный размер -., автоматически ротируется, ротируется -по запросу -, файлы журнала устанавливаются в указанном каталоге::

./thing-to-be-logged 2>&1 | cyclog logs/

У вас не будет потерянных записей журнала, которые может дать вам logrotate. И вам вообще не придется трогать сервер, чтобы программа записи журнала переключилась на новый выходной файл.

К таким инструментам относятся:

Дополнительная литература

1
28.01.2020, 02:18

Теги

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