Re[4]: Как бы grep победить
От: butcher Россия http://bu7cher.blogspot.com
Дата: 29.11.04 07:51
Оценка: 6 (1)
Здравствуйте, postmaster, Вы писали:

P>Это облегчит последующую визуальную фильтрацию, но, к сожалению, не заменит саму фильтрацию.

# cat file | grep -A 1 -E '^:1234:1$' | grep -B 1 -E '^:23'

Нет ничего невозможного..
Re: Как бы grep победить
От: aka50 Россия  
Дата: 29.11.04 10:42
Оценка: 6 (1)
Здравствуйте, Аноним, Вы писали:

А>Hi, all


А>Есть лог файлы, в которых встречаются такие блоки:


А>:1234:1

А>:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
А>:34532:

А>grep — гнутый.

А>ось — Solaris Sparc 8.

А>Как бы вытащить такие блоки?


А>Пробовал: grep -a ':1234:1:\s*:23' не берет.



Есть еще одна замечательная вещица: sed

Деалем такой фильтр
filter.sed

/\:1234\:1$/,/\:23/{
w output
d
}


Это наш входной файл c секциями встречающимися несколько раз и
содержащими неизвестное кол-во других строчек внутри
input.txt

:1234:1
:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
:34532:
:1234:1
:somestuff
:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао


Натравливаем sed на это дело

$ sed -f filter.sed input.txt
:34532:


На выходе в файле output (в фильтре указан) получаем
только то, что нужно... остальное уходит в stdout.

$ cat output
:1234:1
:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
:1234:1
:somestuff
:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао

Как бы grep победить
От: Аноним  
Дата: 29.11.04 06:00
Оценка:
Hi, all

Есть лог файлы, в которых встречаются такие блоки:

:1234:1
:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
:34532:

grep — гнутый.
ось — Solaris Sparc 8.

Как бы вытащить такие блоки?

Пробовал: grep -a ':1234:1:\s*:23' не берет.
Re: Как бы grep победить
От: butcher Россия http://bu7cher.blogspot.com
Дата: 29.11.04 06:13
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>:1234:1

А>:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
А>:34532:

А>grep — гнутый.

А>ось — Solaris Sparc 8.

А>Как бы вытащить такие блоки?

А>Пробовал: grep -a ':1234:1:\s*:23' не берет.
Какие именно блоки надо, и что там есть кроме этого?

Нет ничего невозможного..
Re: Как бы grep победить
От: postmaster  
Дата: 29.11.04 07:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Hi, all


А>Есть лог файлы, в которых встречаются такие блоки:


А>:1234:1

А>:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
А>:34532:

А>grep — гнутый.

А>ось — Solaris Sparc 8.

А>Как бы вытащить такие блоки?


А>Пробовал: grep -a ':1234:1:\s*:23' не берет.


grep работает только с отдельными строками. Нельзя сопоставить шаблону сразу несколько строк.
Поэтому есть 2 выхода:
1. Превращать разрывы строк во что-то ещё перед обработкой grep'ом и возвращать назад после обработки.
2. Использовать другие инструменты.
Re[2]: Как бы grep победить
От: butcher Россия http://bu7cher.blogspot.com
Дата: 29.11.04 07:32
Оценка:
Здравствуйте, postmaster, Вы писали:

P>grep работает только с отдельными строками. Нельзя сопоставить шаблону сразу несколько строк.

P>Поэтому есть 2 выхода:
P>1. Превращать разрывы строк во что-то ещё перед обработкой grep'ом и возвращать назад после обработки.
P>2. Использовать другие инструменты.
Можно ещё воспользоваться ключиками -B или -A, выводить дополнительное количество строк до или после совпадения.

Нет ничего невозможного..
Re[3]: Как бы grep победить
От: postmaster  
Дата: 29.11.04 07:38
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, postmaster, Вы писали:


P>>grep работает только с отдельными строками. Нельзя сопоставить шаблону сразу несколько строк.

P>>Поэтому есть 2 выхода:
P>>1. Превращать разрывы строк во что-то ещё перед обработкой grep'ом и возвращать назад после обработки.
P>>2. Использовать другие инструменты.
B>Можно ещё воспользоваться ключиками -B или -A, выводить дополнительное количество строк до или после совпадения.

Это облегчит последующую визуальную фильтрацию, но, к сожалению, не заменит саму фильтрацию.
Re[5]: Как бы grep победить
От: postmaster  
Дата: 29.11.04 08:02
Оценка:
Здравствуйте, butcher, Вы писали:

B>Здравствуйте, postmaster, Вы писали:


P>>Это облегчит последующую визуальную фильтрацию, но, к сожалению, не заменит саму фильтрацию.

B>
B># cat file | grep -A 1 -E '^:1234:1$' | grep -B 1 -E '^:23'
B>


:1234:1
:99:catch me
:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
:34532:

Хотя если кол-во строк в таких фрагментах фиксированное (или хотя бы ограниченное), то твой способ будет работать.
Re[6]: Как бы grep победить
От: Аноним  
Дата: 29.11.04 09:05
Оценка:
Попробую описать задачу более подробно.

В таких скобках <> это мои примечания, этого нет в файле
Имеем файл:

разный текст до
<Следующие 3 строки — шапка документа которую надо найти>
:1234:1
:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
:34532:
<Не важные строки>
:32:13432143214 <типа сумма>
:52:12345678901234567890 <тут счет>
<весь документ 15 строк>
другой текст

<А дальше может быть такое>
:1234:1
:56:
adsfdsafdsaf

<Или такое>
:1234:1
:23:lkjdflk
:4543543:

Поэтому документ однозначно идентифицируется по первым трем строкам.
То есть надо найти совпадение первых 3 строк (то что идет после :23:
может быть разным) + A 12 — будет весь документ.

Кстати по cygwin работает такой фильтр:
grep -a -h -A 12 -P ':1234:1\s*:23.)+\s*:34532:'
Re[7]: Как бы grep победить
От: Аноним  
Дата: 29.11.04 09:08
Оценка:
Смайлы отключил

А>Попробую описать задачу более подробно.


А>В таких скобках <> это мои примечания, этого нет в файле

А>Имеем файл:

А>разный текст до

А><Следующие 3 строки — шапка документа которую надо найти>
А>:1234:1
А>:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао
А>:34532:
А><Не важные строки>
А>:32:13432143214 <типа сумма>
А>:52:12345678901234567890 <тут счет>
А><весь документ 15 строк>
А>другой текст

А><А дальше может быть такое>

А>:1234:1
А>:56:
А>adsfdsafdsaf

А><Или такое>

А>:1234:1
А>:23:lkjdflk
А>:4543543:

А>Поэтому документ однозначно идентифицируется по первым трем строкам.

А>То есть надо найти совпадение первых 3 строк (то что идет после :23:
А>может быть разным) + A 12 — будет весь документ.

А>Кстати по cygwin работает такой фильтр:

А>grep -a -h -A 12 -P ':1234:1\s*:23:(.)+\s*:34532:'
Re[7]: Как бы grep победить
От: butcher Россия http://bu7cher.blogspot.com
Дата: 29.11.04 10:30
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Кстати по cygwin работает такой фильтр:

А>grep -a -h -A 12 -P ':1234:1\s*:23.)+\s*:34532:'
А чем продиктовано обязательное использование grep? Мжет проще awk/sed или perl?..

Нет ничего невозможного..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.