URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9455
[ Назад ]

Исходное сообщение
"sed печать строк перед regexp и совпадающих с regexp"

Отправлено nastr , 10-Май-12 15:11 
Возможно ли скомбинировать эти две команды:
sed -n '/regexp/{g;1!p;};h' #печать строки непосредственно перед regexp, но не строки содержащей regexp
sed -n '/regexp/p' #печать только строк ,которые совпадают с regexp

так, чтобы результатом вывода были 2 строки - строка содержащая regexp и строка непосредственно перед ней.


Содержание

Сообщения в этом обсуждении
"sed печать строк перед regexp и совпадающих с regexp"
Отправлено nastr , 10-Май-12 15:16 
grep -B1 regexp

"sed печать строк перед regexp и совпадающих с regexp"
Отправлено nastr , 10-Май-12 16:05 
Задача немного изменилась, теперь ТЗ:) следующее:
вывод секции файла между
egrep '^Mon|^Thu|^Wen|^Tue|^Fri|^Sat|^Sun'
и
egrep -i 'abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn'
в любой комбинации

пока не представля как это возможно сделать и можно ли вообще, я так понимаю это лолжна быть кака-то комбинация комманд:
sed -n '/Iowa/,/Montana/p' #печать части файла между двумя регулярными выражениями, чувствительно к регистру
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d #grep для AAA или BBB или CCC (как в "egrep")


"sed печать строк перед regexp и совпадающих с regexp"
Отправлено Andrey Mitrofanov , 10-Май-12 16:10 
> Задача немного изменилась, теперь ТЗ:) следующее:

Препод лютует, малацца.

> вывод секции файла между
> egrep '^Mon|^Thu|^Wen|^Tue|^Fri|^Sat|^Sun'
> и
> egrep -i 'abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn'
> в любой комбинации

sed '/^Mon\|^Thu\|^Wen\|^Tue\|^Fri\|^Sat\|^Sun/,/abnormal\|alarm\|crit\|disconnect\|error\|except\|fail\|fatal\|killing\|panic\|reject\|restart\|warn/'

awk '/^Mon|^[.....]/{x=1}x{print}/abnormal|alarm|crit|disconnect|[.....]/{x=0}'

> пока не представля как это возможно сделать и можно ли вообще, я


"sed печать строк перед regexp и совпадающих с regexp"
Отправлено nastr , 10-Май-12 16:47 
> sed '/^Mon\|^Thu\|^Wen\|^Tue\|^Fri\|^Sat\|^Sun/,/abnormal\|alarm\|crit\|disconnect\|error\|except\|fail\|fatal\|killing\|panic\|reject\|restart\|warn/'
> awk '/^Mon|^Thu|^Wen|^Tue|^Fri|^Sat|^Sun/{x=1}x{print}/abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn/{x=0}'

Огромное спасибо за помощь, только данные конструкции аналогичны простому cat :-)
а в идеале мне нужно:
1. находится строка содержащая 'abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn' например № n;
2. перед строкой n находится строка содержащая '^Mon\|^Thu\|^Wen\|^Tue\|^Fri\|^Sat\|^Sun' например № m1;
3. после строки n находится строка содержащая '^Mon\|^Thu\|^Wen\|^Tue\|^Fri\|^Sat\|^Sun' например № m2;
4. выводятся все строка содержащие 'abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn'между строками m1 и m2.
5. продолжать обработку со строки m2

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



"sed печать строк перед regexp и совпадающих с regexp"
Отправлено nastr , 22-Май-12 19:04 
strcount=`rsh $host "awk 'END{print NR}' ${list[$i]}"`
s1=1
while [ $s1 -le $strcount ]
do
    let s2=s1+1
    while true
    do
        str=`rsh $host "sed ''$s2'q;d' ${list[$i]}"|awk '{print $1}'`
        if [ $str == "Mon" -o $str == "Thu" -o $str == "Wed" -o $str == "Tue" -o $str == "Fri" -o $str == "Sat" -o $str == "Sun" ]
        then
            break
        fi
        let s2++
    done
    if [ `rsh $host "sed ''$s1','$s2'!d' ${list[$i]}"|egrep -i 'abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn'|wc -l` -gt 0 ]
    then
        rsh $host "sed ''$s1'q;d' ${list[$i]}"
        rsh $host "sed ''$s1','$s2'!d' ${list[$i]}"|egrep -i 'abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn'|uniq|tail -100
    fi
    s1=$s2
done

"sed печать строк перед regexp и совпадающих с regexp"
Отправлено pavlinux , 01-Июн-12 02:25 
> Если у кого есть какие-то предложения, с радостью выслушаю

Полностью задачу расскажи. Тут какие-то огромные конструкции, c rsh,
это явно не для sed/awk.

if [ $str == "Mon" -o $str == "Thu" -o $str == "Wed" -o $str == "Tue" -o $str == "Fri" -o $str == "Sat" -o $str == "Sun" ]

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


"печать части файла между regex"
Отправлено nastr , 10-Май-12 16:22 
тоесть алгоритм следующий:
если строка содержит 'abnormal|alarm|crit|disconnect|error|except|fail|fatal|killing|panic|reject|restart|warn' пускай это будет строка № n
тогда найти строку которая находится перед строкой n и содержит '^Mon|^Thu|^Wen|^Tue|^Fri|^Sat|^Sun' пускай это будет строка № n
потом вывести часть файла между строками n и m