Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
VeL
Зарегистрирован: 18.01.2006 Сообщения: 521 Откуда: Харьков
|
Добавлено: Чт Мар 12 2009 22:09 Заголовок сообщения: Bash+как выкусить значение со строки |
|
|
Доброго времени суток!
Ув. специ, подскажите плиз один такой нюанс:
OS Linux
Интерпретатор скриптов bash или sh
Есть файл index.html вида
Код: |
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>Index of /distfiles on gentoo.kiev.ua:21</title>
</head>
<body>
<h1>Index of /distfiles on gentoo.kiev.ua:21</h1>
<hr>
<pre>
2007 Nov 03 File <a href="ftp://gentoo.kiev.ua:21/distfiles/0.11.0.tgz">0.11.0.tgz</a> (1,710,864 bytes)
2004 Jun 23 File <a href="ftp://gentoo.kiev.ua:21/distfiles/0.6.2-debug.diff">0.6.2-debug.diff</a> (5,127 bytes)
2001 Dec 16 File <a href="ftp://gentoo.kiev.ua:21/distfiles/0verkill-0.16.tgz">0verkill-0.16.tgz</a> (276,579 bytes)
2005 Jun 20 File <a href="ftp://gentoo.kiev.ua:21/distfiles/100498D_RM_HxF_Released.pdf">100498D_RM_HxF_Released.pdf</a> (718,949 bytes)
2004 Jul 01 File <a href="ftp://gentoo.kiev.ua:21/distfiles/10429-ridge-0.3.2.tar.bz2">10429-ridge-0.3.2.tar.bz2</a> (424,979 bytes)
2004 Jul 28 File <a href="ftp://gentoo.kiev.ua:21/distfiles/10605-alloy-0.5.2.tar.bz2">10605-alloy-0.5.2.tar.bz2</a> (407,439 bytes)
2007 Mar 22 File <a href="ftp://gentoo.kiev.ua:21/distfiles/10605-alloy-0.5.3.tar.bz2">10605-alloy-0.5.3.tar.bz2</a> (407,920 bytes)
2004 Apr 28 File <a href="ftp://gentoo.kiev.ua:21/distfiles/11384-activeheart-1.2.1.tar.bz2">11384-activeheart-1.2.1.tar.bz2</a> (483,568 bytes)
2004 Apr 24 File <a href="ftp://gentoo.kiev.ua:21/distfiles/11460-kwin-activeheart-1.1.tar.bz2">11460-kwin-activeheart-1.1.tar.bz2</a> (438,338 bytes)
2007 Apr 01 File <a href="ftp://gentoo.kiev.ua:21/distfiles/12956-knemo-0.4.7.tar.bz2">12956-knemo-0.4.7.tar.bz2</a> (611,475 bytes)
2007 May 28 File <a href="ftp://gentoo.kiev.ua:21/distfiles/12956-knemo-0.4.8.tar.bz2">12956-knemo-0.4.8.tar.bz2</a> (628,707 bytes)
2006 Oct 07 File <a href="ftp://gentoo.kiev.ua:21/distfiles/13969-crystal-1.0.2.tar.bz2">13969-crystal-1.0.2.tar.bz2</a> (656,308 bytes)
2000 Dec 18 File <a href="ftp://gentoo.kiev.ua:21/distfiles/14-20pt.zip">14-20pt.zip</a> (33,170 bytes)
2004 Aug 02 File <a href="ftp://gentoo.kiev.ua:21/distfiles/14870-Winamp5-XMMS.tar.bz2">14870-Winamp5-XMMS.tar.bz2</a> (88,424 bytes)
2005 Jul 04 File <a href="ftp://gentoo.kiev.ua:21/distfiles/16028-comix-1.3.4.tar.bz2">16028-comix-1.3.4.tar.bz2</a> (435,083 bytes)
2006 Apr 28 File <a href="ftp://gentoo.kiev.ua:21/distfiles/16028-comix-1.3.8.tar.bz2">16028-comix-1.3.8.tar.bz2</a> (434,962 bytes)
2006 May 08 File <a href="ftp://gentoo.kiev.ua:21/distfiles/16751-abakus-0.91.tar.bz2">16751-abakus-0.91.tar.bz2</a> (380,025 bytes)
2008 Jul 20 File <a href="ftp://gentoo.kiev.ua:21/distfiles/18223-lipstik-2.2.3.tar.gz">18223-lipstik-2.2.3.tar.gz</a> (527,041 bytes)
2008 Mar 16 File <a href="ftp://gentoo.kiev.ua:21/distfiles/19602-cppsymbolviewer-1.11.0.tar.bz2">19602-cppsymbolviewer-1.11.0.tar.bz2</a> (419,038 bytes)
2007 May 10 File <a href="ftp://gentoo.kiev.ua:21/distfiles/19602-symbolviewer-1.10.0.tar.bz2">19602-symbolviewer-1.10.0.tar.bz2</a> (415,293 bytes)
|
мне нужно из каждой строки в переменную $VAR1 присвоить значение, например:
из строки:
Код: | 2007 Nov 03 File <a href="ftp://gentoo.kiev.ua:21/distfiles/0.11.0.tgz">0.11.0.tgz</a> (1,710,864 bytes) |
$VAR1 нужно присвоить значение 1,710,864 (в результате должно быть равно $VAR1=1,710,864)
Ну а потом значение из переменной $VAR1 сложить с переменной $SUM,
Потом со следующей строки получить значение $VAR1=5,127 ну и так далее для остальных строк, и таким образом получить объем всех файлов.
Чтобы обрабатывать все строки, делал так:
Код: |
for I in `cat ./index.html`;
do
echo $I
done |
в результате получаю распечатанный список строк на экране.
Пытался сделать с помощью sed, как делать замену с помощью регулярных выражений в sed разобрался, но вот как присфоить найденный шаблон в sed переменной, так и не догнал.
Подскажите плиз, как решить задачку? _________________ Best regards |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пт Мар 13 2009 18:44 Заголовок сообщения: 'man sh' 97 вопросов из 100 -- 'man awk' остальное |
|
|
--- текстовый файл SUM.awk ---BEGIN {
FS = "[()]" # делаем круглые скобки разделителями полей
}
NF > 1 { # обрабатываем только строки, где есть не менее двух скобок
gsub (/[^0-9]/, "", $(NF - 1)) # из предпоследнего поля выбрасываем все нецифры
sum += $(NF - 1) # увеличиваем переменную sum на значение предпоследнего поля
}
END {
print "Итого: " sum # выводим результат
} --- конец текстового файла SUM.awk ---
даём команду Код: | awk -f SUM.awk < хтмл-файл | или, что для данного случая то же самое Код: | awk -f SUM.awk хтмл-файл |
---------------------------------------------------
'man sh' решает 97 вопросов из 100, оставшиеся 3 вопроса решает 'man awk'. а начинающие программисты пишут программы на Си++ и Дельфи |
|
Вернуться к началу |
|
|
VeL
Зарегистрирован: 18.01.2006 Сообщения: 521 Откуда: Харьков
|
Добавлено: Вс Мар 15 2009 21:37 Заголовок сообщения: |
|
|
Скажите, ну а все же с помощью sed-a это реально сделать?
Просто я это дело планирую использовать в скрипте и получение значения из строки это самая что ни есть малая подзадачка _________________ Best regards |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пн Мар 16 2009 20:08 Заголовок сообщения: сила-юникс, терпение-не винда, мудрость-разница |
|
|
VeL писал(а): | Скажите, ну а все же с помощью sed-a это реально сделать?
Просто я это дело планирую использовать в скрипте и получение значения из строки это самая что ни есть малая подзадачка | вообще-то, sed -- это потоковый редактор текста, то есть его назначение -- это изменение текста из командной строки. в твоём случае задача подсчёта суммы заданных чисел -- это не совсем изменение текста, а наоборот -- совсем не изменение текста. поэтому больше подходят awk, perl, php. они предназначены именно для обработки текста в более общем смысле. в них нет готовых функций позиционирования текущих координат изменяемого фрагмента как в sed'е, а в sed'е это фактически главное достоинство.
вообще, юникс -- это среда, в которой следует использовать просто доступные средства -- какие окажутся в имеющейся среде, -- а вовсе не стремиться абсолютно всё сделать каким-то одним инструментом.
PS только что посмотрел man по sed'у. и не обнаружил встроенных арифметических функций для работы с текстовыми фрагментами как числами. если это так, то суммировать всё равно придётся внешними командами.
------------------------------------------------
господи, дай мне силы, чтобы работать в юниксе, терпения, чтобы не работать в винде, и мудрости, чтобы отличить современный юникс от современной винды |
|
Вернуться к началу |
|
|
|