Рег. выражения в sed редакторе

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Рег. выражения в sed редакторе

Сообщение newsrc »

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

Код: Выделить всё

Logfile /var/log/ipfm/eth1-10.04.strip
Path to log /var/log/ipfm/
Thu Apr 29 12:00 MSD 2010

Host address    In      Out
bookdel         403117744       107057929
bookdir         823526206       122162925
boss            823110894       96124240
c3128           852378483       131782815
c3383           532708319       148684925
c3988           81695   629176
r510            548928736       154054972
regional                137607581       61929180
Total
In : 4121459658 Bytes = 3930.530 MBytes
Out: 822426162 Bytes = 784.326 MBytes

Т. е. нужны строчки 6 -- 13.

Пробую что-то вроде:

Код: Выделить всё

sed -n '/^[0-9a-zA-Z]*[ \t]*[0-9]*[ \t]*[0-9]*/p' rpt.txt

Т. е. начало строки, любое количество символов [0-9a-zA-Z], любое количество пробелов или табуляций, любое количество цифр, любое количество пробелов или табуляций, любое количество цифр.
Не работает. Ткните в ошибку и как это реализовать.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Рег. выражения в sed редакторе

Сообщение watashiwa_daredeska »

newsrc писал(а):
29.04.2010 12:46
Ткните в ошибку и как это реализовать.

(man sed) писал(а):POSIX.2 BREs should be supported, but they aren't completely because of performance problems.
(man 7 regex) писал(а):Obsolete ("basic") regular expressions differ in several respects. '|', '+', and '?' are ordinary charac‐
ters and there is no equivalent for their functionality. The delimiters for bounds are "\{" and "\}", with
'{' and '}' by themselves ordinary characters. The parentheses for nested subexpressions are "\(" and "\)",
with '(' and ')' by themselves ordinary characters. '^' is an ordinary character except at the beginning of
the RE or(!) the beginning of a parenthesized subexpression, '$' is an ordinary character except at the end
of the RE or(!) the end of a parenthesized subexpression, and '*' is an ordinary character if it appears at
the beginning of the RE or the beginning of a parenthesized subexpression (after a possible leading '^').


А ещё у GNU sed есть ключик -r.

хм... а в регекспе-то, вроде, и нет ничего за пределами BRE...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Рег. выражения в sed редакторе

Сообщение watashiwa_daredeska »

newsrc писал(а):
29.04.2010 12:46
Не работает.
Хоть написали бы, как не работает... Гадать и копипастить лишний раз лениво. Могу только предположить, что т.к. в Вашем регекспе всё с квантификатором «*», то пустая строка в начале строки вполне удовлетворяет этому условию, а т.к. такая (пустая) строка есть абсолютно в каждой строке (даже в пустой), то любая строка удовлетворяет этому регекспу.

Код: Выделить всё

sed -n '/^[0-9a-zA-Z]\{1,\}[ \t]\{1,\}[0-9]\{1,\}[ \t]\{1,\}[0-9]\{1,\}/p'
или

Код: Выделить всё

sed -rn '/^[0-9a-zA-Z]+[ \t]+[0-9]+[ \t]+[0-9]+/p'
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Рег. выражения в sed редакторе

Сообщение newsrc »

«*» говорит о том, что предыдущий шаблон встречается ноль или более раз. Вот в этом моя ошибка.
«+» шаблон встречается один или более раз. Вот то, что нужно.

Спасибо вам.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Рег. выражения в sed редакторе

Сообщение sash-kan »

а так не проще?

Код: Выделить всё

sed -n '/^Host/,/^Total/p' | sed '1d;$d'
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Рег. выражения в sed редакторе

Сообщение newsrc »

sash-kan писал(а):
29.04.2010 14:09
а так не проще?

Код: Выделить всё

sed -n '/^Host/,/^Total/p' | sed '1d;$d'

Нет, это только один пример файла. Он, как правило, не так заканчивается.

Хотя, это подходит. Спасибо.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Рег. выражения в sed редакторе

Сообщение drBatty »

Shell

$ sed -rn '/^\w+\s+[0-9]+/p' h.txt bookdel 403117744 107057929 bookdir 823526206 122162925 boss 823110894 96124240 c3128 852378483 131782815 c3383 532708319 148684925 c3988 81695 629176 r510 548928736 154054972 regional 137607581 61929180
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Рег. выражения в sed редакторе

Сообщение sash-kan »

drBatty писал(а):
29.04.2010 23:14
$ sed -rn '/^\w+\s+[0-9]+/p' h.txt
тогда уж:

Код: Выделить всё

$ sed -rn '/^\w+(\s+[0-9]+){2}$/p' h.txt
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: