У меня есть файл журнала с записями, подобными следующим:

вход

php notice bob
php notice winner
php notice blah winner
php notice asfsdf test
php erro)r bob                                                                                                
php error winner
php error trash winner
php error junk test
print this line

Выход

php notice winner
php notice blah winner                                                                                        
php error winner
php error trash winner
print this line

То, что я пытаюсь сделать, это сопоставить все строки из файла журнала, если - он не содержит php за которым следует error или notice . Если он содержит php за которым следует error или notice , то он должен совпадать только в том случае, если в строке также указан winner . Мой регулярное выражение слабое. Благодарю.

2 ответа2

1

Используйте это: grep 'php\s\+\(error\|notice\).*winner' mylogfile

0

Возможно, есть способ заставить grep выполнить это в одной строке, но я думаю, что лично я бы сделал скрипт для обработки этого либо в perl, либо в bash. В bash это было бы что-то вроде

while read line
do
# If line contains "php error" or "php notice" and "winner", print it, else skip it
   if echo $line | grep "php error" >/dev/null  || echo $line | grep -q "php notice" >/dev/nulll; then
       if echo $line | grep "winner" > /dev/null; then
           echo $line
       fi
   else 
   # If line does not contain "php error" or "php notice", print it.
       echo $line
   fi
done

У меня нет удобной системы для тестирования / отладки, поэтому вам, возможно, придется немного ее настроить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .