LINUX.ORG.RU

[shell] регэкспы с блоками


0

1

например

RX bytes:(\d*) \(.*?\)  TX bytes:(\d*) \(.*?\)

привык к тому, что получу массив

a[0]="RX bytes:138306921 (131.8 MiB)  TX bytes:8219760 (7.8 MiB)"
a[1]="138306921"
a[2]="8219760"

Чем можно получить a[1] и a[2]?

awk/sed/grep ведь не умеют? perl?

★★★★★

нифига не понял… что ты сними дальше делать будешь? и да, man grep на предмет -Р.

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

[code]echo 23234 | sed -rn '/(.)(.)/{s//\2\1/p}'
32234[/code]

Зачем у тебя ';'?
Можно ли добавить какую-то опцию, чтобы выводилось просто 32?

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

>Зачем у тебя ';'?
Спешил ;)

>чтобы выводилось просто 32?
Просто написать правильный регэксп:

echo 23234 | sed -rn '/(.)(.).+/{s//\2\1/p}'
32

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

А если у меня шаблон на несколько строк?

$ echo "
2
3
" | sed -rn "/([0-9]+).*^[0-9]/{s//\1/p}"
$ 

Tanger ★★★★★ ()

наверно проще через ip

%>ip -s l show eth1
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1f:e1:3d:03:97 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
668449791 561584 0 0 0 0
TX: bytes packets errors dropped carrier collsns
52851449 438283 32 0 0 0

но по переменным сами раскидывайте
%>ip -s l show eth1 | awk '(NR==4)||(NR==6){print $1}'
671989105
53066860

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

мне в общем не это нужно. Я привел пример, чтобы понятно было.

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

Да. перл умеет.

#!/usr/bin/perl
$s = "1
2";
if ($s =~ /(\d)\n\d/mg)
{
        print "$1\n";
}

Tanger ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.