LINUX.ORG.RU

Grep, обратный слэш и другие спецсимволы

 


0

1

Всем привет!

Есть задача искать в файле BigFile.log строки, в которых есть подстроки из файла TypicalErrors.txt. Если бы строки из файла TypicalErrors.txt состояли только из букв и цифр, то думаю, что можно было бы искать с помощью следующего скрипта Test.sh (направить на него TypicalErrors.txt):

while read line
do
    grep «$line» BigFile.log
done

Проблема в том, что строки файла TypicalErrors.txt могут содержать символы

.\[]

и возможно другие символы, которые Grep обрабатывает особым образом.

Пример вывода команд:

# cat TypicalErrors.txt
Error [\x22 12345 \x22]

# cat BigFile.log
Error [\x22 12345 \x22]
Error [\x22 12345 \x22]
Error [\x22 12345 \x22]

# cat ./Test.sh
while read line
do
    grep «$line» BigFile.log
done

# ls -l ./Test.sh
-rwxr--r-- 1 root root 53 Sep  7 02:18 ./Test.sh

# cat TypicalErrors.txt | ./Test.sh
(не выводится ничего)

Прошу помочь.

Заранее благодарен тем, кто ответит.

Ответ на: комментарий от zolden

Спасибо большущее!

Продвинусь по своей задаче. Возможно скоро еще связанные вопросы здесь буду спрашивать. Анализирую логи, было бы хорошо еще время ошибок выделять отдельно: если в файлах TypicalErrors.txt и BigFile.log было бы

Error [\x22 12345 \x22]
Error [\x22 6789 \x22]

и

[07-Sep-2012 04:19:31] Error [\x22 12345 \x22]
[07-Sep-2012 04:19:32] Error [\x22 6789 \x22]
[07-Sep-2012 04:19:33] Error [\x22 12345 \x22]
[07-Sep-2012 04:19:34] Error [\x22 12345 \x22]
[07-Sep-2012 04:19:35] Error [\x22 6789 \x22]
[07-Sep-2012 04:19:36] Error [\x22 12345 \x22]

соответственно, то я хотел бы получить что-нибудь типа

Error [\x22 12345 \x22]
    [07-Sep-2012 04:19:31]
    [07-Sep-2012 04:19:33]
    [07-Sep-2012 04:19:34]
    [07-Sep-2012 04:19:36]
Error [\x22 6789 \x22]
    [07-Sep-2012 04:19:32]
    [07-Sep-2012 04:19:35]
Alexander7
() автор топика
Ответ на: комментарий от Alexander7

http://books.cat-v.org/computer-science/unix-programming-environment/translations/russian/ch4

Редактор sed имеет возможность записывать в несколько выходных файлов. Например, команда

 
$ sed -n '/шабл/w файл1
>         /шабл/!w файл2' имена_файлов...
$
записывает строки, соответствующие «шабл», в файл1, а не соответствующие — в файл2

anonymous
()
Ответ на: комментарий от Alexander7

Я правильно понимаю, что в случае [07-Sep-2012 04:19:31] Error [\x22 12345 \x22] код ошибки 12345 и он всегда находится в одном месте?
\x22 это статичная подстрока или в этом месте может быть что-то другое?

zolden ★★★★★
()
Ответ на: комментарий от anonymous

У меня есть ощущение, что если «шабл» содержит обратные слэши, то возникают проблемы аналогичные возникающим у Grep'a и echo.

Alexander7
() автор топика
Ответ на: комментарий от zolden

После слова Error может быть почти любая строка из букв, цифр, пробелов, знаков препинания, любых скобок, прямых и обратных слэшей.

Alexander7
() автор топика
Ответ на: комментарий от Alexander7

ну как-то примерно так...

% cat test.log
[07-Sep-2012 04:19:31] Error [\x22 12345 \x22]
[07-Sep-2012 04:19:32] Error [\x22 6789 \x22]
[07-Sep-2012 04:19:31] Error [\x22 12345 \x22]
[07-Sep-2012 04:19:32] Error [\x22 6789 \x22]
[07-Sep-2012 04:19:33] Error [\x22 12345 \x22]
[07-Sep-2012 04:19:34] Error [\x22 12345 \x22]
[07-Sep-2012 04:19:35] Error [\x22 6789 \x22]
[07-Sep-2012 04:19:36] Error [\x22 12345 \x22]

% awk -FError '{m[$2]=m[$2]"\n"$1}END{for (var in m) print "\tError"var,"\n",m[var]"\n"}' test.log
        Error [\x22 12345 \x22] 
 
[07-Sep-2012 04:19:31] 
[07-Sep-2012 04:19:31] 
[07-Sep-2012 04:19:33] 
[07-Sep-2012 04:19:34] 
[07-Sep-2012 04:19:36] 

        Error [\x22 6789 \x22] 
 
[07-Sep-2012 04:19:32] 
[07-Sep-2012 04:19:32] 
[07-Sep-2012 04:19:35] 
zolden ★★★★★
()
Ответ на: комментарий от zolden

ну если файл TypicalErrors.txt маленький, то можно заюзать этот подход: http://drbatty.ru/sed/ch04s13.html

а вообще я не в курсе... Если преобразования сложные, а базы и словари большие, то почему не заюзать SQL СУБД? Они и считать умеют, и работают быстро, и ресурсов жрут относительно мало (всякие костыли вроде bash/sed могут и часами парсить). Ну и имеют множество встроенных полезных костылей типа MySQL::INET_ATON().

drBatty ★★
()
Ответ на: комментарий от anonymous

есть ещё команда W для _добавления_ к фалу, и команды r & R.

drBatty ★★
()
Ответ на: комментарий от Alexander7

У меня есть ощущение, что если «шабл» содержит обратные слэши, то возникают проблемы аналогичные возникающим у Grep'a и echo.

заэкспейтите слеш, а лучше используйте \X/etc/passwdX

drBatty ★★
()
Ответ на: комментарий от drBatty

А мне вот интересно, как это сделать на sed без множественного прогона для каждого Error, который надо помнить. Холдспейс-то один.

Deleted
()
Ответ на: комментарий от Deleted

А мне вот интересно, как это сделать на sed без множественного прогона для каждого Error, который надо помнить. Холдспейс-то один.

холдспэйс один, и прогон один. Ищем выражение .*(X).*\1

несмотря на обратную ссылку, sed находит его за один проход.

drBatty ★★
()
Ответ на: комментарий от Deleted

если с затратами дискового пространства, но в один проход BigFile.log, то примерно так:

sed -n "$(sed '=;s#\\#\\\\#g;s#\[#\\\[#g;s#\]#\\\]#g' TypicalErrors.txt | "\
"sed 'N;s#\([^\n]*\)\n\(.*\)#s/ \2//w \1.txt#')" BigFile.log
и сборка данных в один файл:
num=1
rm -f out.log
while read i; do
  echo -e "\t$i" >>out.log
  cat "$num.txt">>out.log
  echo "" >>out.log
  rm -f "$num.txt"
  num=$(($num+1))
done < TypicalErrors.txt

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.