Здравствуйте, Аноним, Вы писали:
А>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:
А>grep — гнутый. А>ось — Solaris Sparc 8.
А>Как бы вытащить такие блоки? А>Пробовал: grep -a ':1234:1:\s*:23' не берет.
Какие именно блоки надо, и что там есть кроме этого?
Здравствуйте, Аноним, Вы писали:
А>Hi, all
А>Есть лог файлы, в которых встречаются такие блоки:
А>:1234:1 А>:23:фывадловыфдла фывдаловыфдлао фывдалоывфдлао А>:34532:
А>grep — гнутый. А>ось — Solaris Sparc 8.
А>Как бы вытащить такие блоки?
А>Пробовал: grep -a ':1234:1:\s*:23' не берет.
grep работает только с отдельными строками. Нельзя сопоставить шаблону сразу несколько строк.
Поэтому есть 2 выхода:
1. Превращать разрывы строк во что-то ещё перед обработкой grep'ом и возвращать назад после обработки.
2. Использовать другие инструменты.
Здравствуйте, postmaster, Вы писали:
P>grep работает только с отдельными строками. Нельзя сопоставить шаблону сразу несколько строк. P>Поэтому есть 2 выхода: P>1. Превращать разрывы строк во что-то ещё перед обработкой grep'ом и возвращать назад после обработки. P>2. Использовать другие инструменты.
Можно ещё воспользоваться ключиками -B или -A, выводить дополнительное количество строк до или после совпадения.
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, postmaster, Вы писали:
P>>grep работает только с отдельными строками. Нельзя сопоставить шаблону сразу несколько строк. P>>Поэтому есть 2 выхода: P>>1. Превращать разрывы строк во что-то ещё перед обработкой grep'ом и возвращать назад после обработки. P>>2. Использовать другие инструменты. B>Можно ещё воспользоваться ключиками -B или -A, выводить дополнительное количество строк до или после совпадения.
Это облегчит последующую визуальную фильтрацию, но, к сожалению, не заменит саму фильтрацию.
Здравствуйте, butcher, Вы писали:
B>Здравствуйте, postmaster, Вы писали:
P>>Это облегчит последующую визуальную фильтрацию, но, к сожалению, не заменит саму фильтрацию. 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:'
Здравствуйте, <Аноним>, Вы писали:
А>Кстати по cygwin работает такой фильтр: А>grep -a -h -A 12 -P ':1234:1\s*:23.)+\s*:34532:'
А чем продиктовано обязательное использование grep? Мжет проще awk/sed или perl?..