Фільтруйте команду tail за допомогою декількох команд grep для розділення файлів


5

Те, що я намагаюся зробити, це фільтрувати вихід одного файлу журналу в окремі файли журналів на основі фільтра grep.

хвіст -f test.log | & gt; (grep "Помилка" & gt; error.log) & gt; (grep "Попередження" "& gt;   warning.log)

Таким чином, всі записи "Error" знаходяться в одному файлі, а всі записи "Warning" знаходяться в окремому файлі.

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

Також, якщо видалити "& gt;" файли ре-директорів з grep команди виводить індивідуальні виходи grep на консоль правильно; однак, я також хочу записати файл.

Відповідь:

При записі в файл виводиться grep буферизувався. Використання egrep з --line-buffer Варіант виправлено поведінку.

Нова команда виглядає так:

хвіст -f test.log | & gt; (egrep - лінійний буфер "ERROR" & gt; error.log) & gt; (egrep - лінійний буфер "WARNING" & gt; warning.log)


1
Може бути проблемою lineBuffer у tailf. Будь ласка, перевірте: superuser.com/questions/59497/…
cfreire

Це вирішило мою проблему, спасибі!
Ryan

Відповіді:


0

Це може бути простіше, якщо для цього використовується кілька рядків. Ви можете написати сценарій bash:

#!/bin/bash

tail -f test.log | while read line; do
    if echo "$line" | grep -q "Error"; then
        echo "$line" >> error.log
    elif echo "$line" | grep -q "Warning"; then
        echo "$line" >> warning.log
    # The following is in case you want to print out lines that do not match 
    else
        echo "$line"
    fi
done

Моїм наступним кроком було створення програми Python для того, щоб робити те, що я хочу, так як я мав би набагато більшу гнучкість. Я хотів зрозуміти, чому команда, яка виглядала так слід робота, не була. Виявляється, це було буферизація.
Ryan

0

@Ryan, спасибі за розміщення відповіді на ваше запитання.
іншим (універсальним) способом встановлення буферизації за лінію stdbuf команда:

tail -f test.log | tee >(stdbuf -oL grep "ERROR" > error.log) >(stdbuf -oL grep "WARNING" > warning.log)

ось витяг з man stdbuf:

SYNOPSIS
   stdbuf OPTION... COMMAND
...
   -o, --output=MODE
          adjust standard output stream buffering
...
   If MODE is 'L' the corresponding stream will be line buffered.
....
EXAMPLES
   tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
   This will immedidately display unique entries from access.log
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.