Отправляет email-рассылки с помощью сервиса Sendsay

bash

Привет всем!

Подскажите, пожалуйста, как в скрипте на bash выбрать из строки только
цифры.

Полями в awk не получается, тк есть поле '1ms', а число, которое будет
перед единичкой как раз и нужно.
При этом там может быть любое количество цифр.

Лобанов Валерий,
valery_loban***@m*****.ru

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 10924; Возраст листа: 390; Участников: 1247
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/214650



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Thu, 19 Aug 2004 17:31:38 +0400 (#214650)

 

Ответы:

On 19.08.2004 17:31, Валерий Лобанов wrote:

Перед единичкой? А какое там число? Можно примерный формат строки?
Предполагаю, что имелось в виду число перед ms.

Самое примитивное - разобрать саму строку отдельным вызовом awk:
awk -F "ms" '{ print $1 }'

Если строку "ms" нельзя использовать в качестве привязки и цифры всегда
находятся в начале полей, можно сделать так:

awk -F 'по кому там надо' '{ printf "%d\n",$'какое надо' }'

А вообще настоятельно рекомендую читать маны, они рулез. Awk - очень мощный
язык. Пользуясь случаем, позволю себе напомнить, что с простым разрезанием на

поля также замечательно справляется cut.

Ответить   Thu, 19 Aug 2004 18:08:34 +0400 (#214668)

 

C awk не совсем понятно, могут ли у нее вход и выход быть переменными ...

А точнее задача выглядит так.

Есть вывод команды ping.
/***********************************/
PING 10.11.3.1 (10.11.3.1) 64(92) bytes of data.

10.11.3.1 ping statistics 128 packets transmitted, 128 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.005/0.005/0.024/0.003 ms, ipg/ewma 0.014/0.006 ms
/***********************************/

Из него надо достать время ( циферку между "time" и "ms")

Пробовал комбинации grep & awk. Ерунда какая-то получается.

С встроенными функциями работы со строками - еще хуже.

А с tr непонятно - чего ему на вход надо дать? Строку - ругается, файл -
ругается ...

Если это возможно, напишите, пожалуйста кусочек кода сразу.

Заранее благодарю.

Лобанов Валерий,
valery_loban***@m*****.ru

Alexey Rusakov wrote:

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 10944; Возраст листа: 391; Участников: 1246
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/215186



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   Fri, 20 Aug 2004 11:37:23 +0400 (#215186)

 

On Пятница 20 Август 2004 11:37, Валерий Лобанов wrote:

Для таких задач был придуман специальный язык - perl. Пользуйтесь
им (вместо bash). Я понимаю, что его придётся изучать, но он
этого стоит.

Вот пример его использования из bash:

time=`ping -f -c 128 10.11.3.1 | perl -ne 'm{time\s*(\d+)\s*ms}
&& print $1'`

Ответить   "Sergey B. Khvatov" Fri, 20 Aug 2004 12:26:21 +0400 (#215209)

 

Здравствуйте Sergey,

Friday, August 20, 2004, 12:26:21 PM, you wrote:
<skip>

Я бы вместо m{time\s*(\d+)\s*ms} написал m{time\s*(\d+)\s*?ms}
а ТО НИ ХРЕНА НЕ ЗАРАБОТАЕТ :)

Ответить   zerokool Sun, 22 Aug 2004 14:02:39 +0400 (#216348)

 

Hello, zerokool!
On Воскресенье 22 Август 2004 14:02, you wrote:

Я прежде чем посылать совет, его проверил (чего и вам рекомендую -
*? вместе - это, как говорил Матроскин - перебор :-)

Ответить   "Sergey B. Khvatov" Mon, 23 Aug 2004 09:36:33 +0400 (#216713)

 

Здравствуйте Sergey,

Monday, August 23, 2004, 9:36:33 AM, you wrote:

Извините, возможно я не прав. А чтобы окончательно убедиться в этом
хочу спросить. Ведь если между 1 и ms нет пробела как там может быть
\s, ась?

Ответить   zerokool Tue, 24 Aug 2004 04:06:43 +0400 (#217534)

 

zerokool <zeroko***@v*****.ru> writes:

AFAIK \s* означает 0 или более \s.

Ответить   Max Vasin 24 Aug 2004 16:28:43 +0400 (#217572)

 

On Вторник 24 Август 2004 04:06, zerokool wrote:

Не \s, а \s*

Элементы-повторители:
* - 0 или более,
+ - 1 или более (отсутствует в "базовом" варианте),
? - 0 или 1

а \s*?, вероятно, просто не скомпилируется (но я это не проверял)

Ответить   "Sergey B. Khvatov" Tue, 24 Aug 2004 16:32:43 +0400 (#217591)

 

Здравствуйте Sergey,

Tuesday, August 24, 2004, 4:32:43 PM, you wrote:

Я понял усё. У мине в книге очепятка. Там + и * перепутали редиски :(
З.Ы. Долго смеялся. Теперь вот стыдно стало, что с пеной у рта
доказывал своё. Приношу извинения товарищи.

Ответить   zerokool Tue, 24 Aug 2004 19:19:35 +0400 (#217739)

 

20 Август 2004 11:37, Валерий Лобанов написал:

Можно так, например:

ping -c 2 mail.ru | grep packets | tr "[:alpha:],%" " " | awk '{print $4}'

grep packets отфильтровывает строку со статистикой, а tr выкидывает лишние
символы.

Ответить   Vladimir Efremov Fri, 20 Aug 2004 12:39:03 +0400 (#215210)

 

ping 10.44.1.5|awk '{if($2="octets")split($7,a,"=");print a[2]}'

2.0
2.8

--
Best Regards,
Victor Karpovich

--
This message was scanned for viruses and it's not infected.
Kyivstar GSM.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 10950; Возраст листа: 391; Участников: 1246
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/215217



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ http://subscribe.ru/feedback

Ответить   "Victor Karpovich" Fri, 20 Aug 2004 11:39:41 +0300 (#215217)

 

20 Август 2004 12:39, Victor Karpovich написал:

Неправильно! Обратите внимание на первую пустую строку - if действует только

на следующий оператор. Так что print a[2] вызывается всегда, только в первый

раз печатает пустую строку. Лучше было бы написать что-то вроде

awk '/octets/ {split($7,a,"=");print a[2]}'

Ответить   Vladimir Efremov Fri, 20 Aug 2004 14:20:19 +0400 (#215360)

 

19 Август 2004 17:31, Валерий Лобанов написал:

Можно перед awk пропустить строку через tr:

tr -d [:alpha:]

При этом останутся только цифры. Ну, или заменить цифры на пробелы:

tr [:alpha:] " "

Ответить   Vladimir Efremov Thu, 19 Aug 2004 21:10:13 +0400 (#214781)