LINUX.ORG.RU

grep обнаружить несколько паттернов на разных строках.

 ,


0

4

Есть логфайл. в нем должно быть несколько строк об успешной отработке:
pattern1 is complete
pattern2 is complete
pattern3 is complete

каким образом одной командой греп или несильно сложной конструкцией из них, отловить что есть все три паттерна, чтобы продолжить работу кодом:
if [[ $? -eq 0 ]] ;
then

★★★

Ответ на: комментарий от shell-script

да-да, знаю, но это не оно
я получу успешный (0) код при обнаружении одной/двух из трех паттернов.
а мне надо все 3.

bl ★★★
() автор топика
Ответ на: комментарий от shell-script

Невнимательно прочитал. Мой пример скажет, что всё хорошо при наличии хотя бы одного паттерна.

shell-script ★★★★★
()

туплю. оказывается благодаря grep -q и && можно делать всё.
grep -q «pattern1 is complete» file.log && grep -q «pattern2 is complete» file.log && grep -q «pattern3 is complete» file.log
if [[ &? -eq 0 ]];
then
echo все патерны найдены
fi

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

да, у меня там в логе еще есть
pattern4 is complete
pattern5 is complete
которые не нужны для данной задачи.

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

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

Вот, что-то такое поидее должно обойти эту проблему.

#!/bin/bash

LOGFILE=$1
PATTERNS=(123 234 345)
PCOUNT=${#PATTERNS}

# construct grep
GREP="grep -oE ("
for (( i=1; i<=${PCOUNT}; i++ ))
do
	if [[ $i < ${PCOUNT} ]]
	then
		GREP="${GREP}${PATTERNS[${i}-1]}|"
	else
		GREP="${GREP}${PATTERNS[${i}-1]})"
	fi
done

RARRAY=($($GREP $LOGFILE))

if [[ ${#RARRAY} = ${PCOUNT} ]]
then
	echo 'True'
else
	echo 'False'
fi

shell-script ★★★★★
()

Ещё вариантик:


if [ `grep -e pattern1 -e pattern2 -e pattern3 <LOGFILE> | grep 'is complete' | sort | uniq | wc -l` -eq 3 ];
then
   echo OK
else
   echo ERROR
fi

x-signal ★★
()
Ответ на: комментарий от bl

Ты три раза читаешь файл.

grep "pattern1 is complete" filename | \
 grep "pattern2 is complete" | \
 grep "pattern3 is complete" && echo "success"
sin_a ★★★★★
()
Ответ на: комментарий от qulinxao

Да собственно можно и без АВКа.

while read; do
    [[ $REPLY == *'pattern1 is complete'* \
             || $REPLY == *'pattern2 is complete'* \
             || $REPLY == *'pattern3 is complete'* ]] \
        && (( i++ ))
done \
    < file

if (( i >= 3 )); then
    ...
fi
Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

возможно. ранее был 1 греп на 1 паттерн.

теперь мне надо для 3х паттернов обнаруживать ситуацию когда они все выполнены. qulinxao подсказал решение на awk, хороший но механизм выхода {exit!(p1&&p2&&p3) плохо читаемый, впрочем END {exitcode=1; if (p1&&p2&&p3) {exitcode=0} ; exit exitcode} не усложняет.

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

Я не знаю, что здесь является верным вводом и результатом, а что нет, да и какая разница — пример же гипотетический. Очевидно, что столь же просто использовать и три флага через И или битовый флаг.

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

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

вообще авк «не имеет смысле» для не_одностроков - такова вот загогулина =

перлина отсюда полезла в дальнейшем.

возможно если ограничиваться понятными одностроками - это критерий эволюции прикладного языка

ed -> grep
   -> sed -> awk -> perl



pps. snobol4 icon - а вообще алгорифмы маркова - и будем помнить Unix взлетел на обработке текста среди любителей и отчётах и прочей комуникации где erlang вдальнейшем внишился.
qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от Zmicier

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

conformist ★★★
()
Последнее исправление: conformist (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.