Как я grep содержимое файлов, возвращаемых grep? - PullRequest
4 голосов
/ 10 января 2011

Когда я ищу файлы журнала с сообщением об ошибке, используя grep error *log, он возвращает список файлов журнала

$grep error *log

Binary file out0080-2011.01.07-12.38.log matches
Binary file out0081-2011.01.07-12.38.log matches
Binary file out0082-2011.01.07-12.38.log matches
Binary file out0083-2011.01.07-12.38.log matches

Однако это текстовые, а не двоичные файлы.

Я не уверен, почему они считаются двоичными, первые несколько строк содержат следующие сообщения об ошибках:

out0134
-catch_rsh /opt/gridengine/default/spool/compute-0-17/active_jobs/327708.1/pe_hostfile
compute-0-17

Я хотел бы собрать в содержимое возвращенных файлов сообщение об ошибке и вернуть имена файлов вместе с сообщением.

Как я могу получить содержимое возвращенных файлов, а не этот список возвращаемых файлов, как это происходит с grep error *log | grep foo?

Ответы [ 4 ]

8 голосов
/ 10 января 2011

Вот ответ, который вы, возможно, ищете:

grep -l foo $(grep -l error *.log)

-l заставляет grep печатать только имена файлов;который выполняет первый grep, затем подставляет результат в команду следующего grep.В качестве альтернативы, если вам нравится xargs:

grep -l error *.log | xargs grep -l foo

, который делает то же самое, используя xargs для вызова второго grep с результатами первого grep в качестве аргументов.

6 голосов
/ 10 января 2011

-a, --text
Обрабатывать двоичный файл, как если бы он был текстовым; это эквивалентно опция --binary-files = text.

grep -a "some error message" *.log

Кстати, вот как grep определяет двоичные файлы из текстовых файлов

Если первые несколько байтов файла указать, что файл содержит двоичный файл данные, предположим, что файл имеет тип ТИП. По умолчанию ТИП двоичная ...

Обновление

Если вам нужен просто список имен файлов, которые содержат слово foo в строке, которая также содержит error , то вы можете сделать одно или другое из них:

grep -la "error.*foo" *.log <- предполагает <strong>foo после ошибка

2 голосов
/ 13 января 2011

Я делаю это.

$ найти.-тип f -name * .log |fgrep -v [ничего нежелательного] |xargs grep -i [поиск внутри файлов]

0 голосов
/ 10 января 2011

Комментарий, спрашиваемый о том, как использовать grep для foo в файлах, которые соответствуют ошибке, можно:

for i in *log ; do
    grep -a error $i >/dev/null 2>&1 && {
        echo -e "File $i:\n\t"
        grep -a foo $i
    }
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...