Как и чем парсить фалы ? (Нужно разобрать файл...)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Как и чем парсить фалы ?

Сообщение crashc »

Доброго времени господа!
Нужно пропарсить файл с содержимым вида:

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

<tr><td class="data">12</td><td class="data2"><a href='10_132_33_1/graph_day.png'><img src="../images/graph.png" border="0" title="Graphic Report"></a>&nbsp;<a href='10_132_33_1/d10_132_33_1.html'><img src="../images/datetime.png" border="0" title="date/time Report">
</td><td class="data2"><a href='10_132_33_1/10_132_33_1.html'>10.132.33.1</td><td class="data">136</td><td class="data"> [color="#FF0000"] 5M[/color]</td><td class="data">0.15%</td><td class="data">0.37%</td><td class="data">99.63%</td><td class="data">02:12:07</td><td class="data">  8M<td class="data">1.04%</td></tr>

И выделить эту цифру. Весь файл имеет такую структуры...
Не подскажите как? Чем ? Куда ?
З.Ы. Вернее должно быть красным, обрамлено тэгом [color="#FF0000"]
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Аватара пользователя
Encore
Сообщения: 656
Статус: loading..............
ОС: Debian

Re: Как и чем парсить фалы ?

Сообщение Encore »

Честно говоря, не до конца вкурил суть вопроса, но если я правильно понял, то можно открыть файл стандартной гномовской прогой

и через Ctrl+F или меню/поиск найти нужную фразу, символ...
Кстати gedit может открывать html с сайта сразу в виде кода.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Как и чем парсить фалы ?

Сообщение diesel »

ничего не понял :)
можно два примера: текст до, и текст после обработки. :)
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Как и чем парсить фалы ?

Сообщение Voice »

[user@host116 ~] $ echo 'aaaaaaa<td class="data">5M</td>sss' | perl -e '$_=<>; /<td class="data">(.*)<\/td>/ ; print $1, "\n";'
5M
[user@host116 ~] $
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Re: Как и чем парсить фалы ?

Сообщение crashc »

Есть так:

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

<tr><td class="data">12</td><td class="data2"><a href='10_132_33_1/graph_day.png'><img src="../images/graph.png" border="0" title="Graphic Report"></a>&nbsp;<a href='10_132_33_1/d10_132_33_1.html'><img src="../images/datetime.png" border="0" title="date/time Report">
</td><td class="data2"><a href='10_132_33_1/10_132_33_1.html'>10.132.33.1</td><td class="data">136</td><td class="data"> 5M</td><td class="data">0.15%</td><td class="data">0.37%</td><td class="data">99.63%</td><td class="data">02:12:07</td><td class="data">  8M<td class="data">1.04%</td></tr>


Нужно:


Т.е. одну html-ную ячейку, точнее текст из нее...
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Как и чем парсить фалы ?

Сообщение diesel »

если нормально отформатировать тот текст что ты привел:

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

diesel@beezir:~$ cat  3|sed -r -e 's/<\/td>/<\/td>\n/g'
<tr><td class="data">12</td>
<td class="data2"><a href='10_132_33_1/graph_day.png'><img src="../images/graph.png" border="0" title="Graphic Report"></a> <a href='10_132_33_1/d10_132_33_1.html'><img src="../images/datetime.png" border="0" title="date/time Report">
</td>
<td class="data2"><a href='10_132_33_1/10_132_33_1.html'>10.132.33.1</td>
<td class="data">136</td>
<td class="data"> 5M</td>
<td class="data">0.15%</td>
<td class="data">0.37%</td>
<td class="data">99.63%</td>
<td class="data">02:12:07</td>
<td class="data">  8M<td class="data">1.04%</td>
</tr>

получаем <td class="data"> 5M</td> на шестой строке, оно всегда будет на шестой? если да то мы можем напечатать шестую строку:

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

diesel@beezir:~$ cat  3|sed -r -e 's/<\/td>/<\/td>\n/g'|sed -n '6p'
<td class="data"> 5M</td>


и убрать из нее лишнее:

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

diesel@beezir:~$ cat  3|sed -r -e 's/<\/td>/<\/td>\n/g'|sed -n '6p'|sed -e 's!<td class="data">!!; s!</td>!!g'
 5M


если нет. непонятен способ выбора именно этой ячейки.
Спасибо сказали:
Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Re: Как и чем парсить фалы ?

Сообщение crashc »

2diese: Т.е. все таки SED мануалить ;)
Спасибо, т.е. сначало нужно на строчки его отфарматировать (первой строчкой), а там уж и разбор устраивать! Попробую! Отпишусь что вышло!
Спасибо!
Буду мануал искать!
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Аватара пользователя
gaux
Сообщения: 185
ОС: FreeBSD

Re: Как и чем парсить фалы ?

Сообщение gaux »

crashc писал(а):
12.12.2007 10:20
2diese: Т.е. все таки SED мануалить ;)
Спасибо, т.е. сначало нужно на строчки его отфарматировать (первой строчкой), а там уж и разбор устраивать! Попробую! Отпишусь что вышло!
Спасибо!
Буду мануал искать!


Можно и наверное даже лучше на том же perl написать такую вещь (как у Voice). По сути тэги такого вида </...> можно описать как регулярное выражение и дополнить в конце символом перевода строки - \n. Это форматирование.

Выделить столбец в куче строчек то уже универсально - цикл. Тэги <table>,<tr>,<td> - это последовательность. У таблицы скажем может быть идентификатор. Отсчитать нужную колонку. Небольшой по размеру скрипт получится. Этот кусок разбирается элементарно: <td class="data"> 5M</td>. [<td class="data">][....][</td>] - регулярное выражение.

Так понимаю таких строчек в файле много?
Спасибо сказали:
Аватара пользователя
crashc
Сообщения: 52
ОС: Debian 40r1-i586, etch

Re: Как и чем парсить фалы ?

Сообщение crashc »

Порядка ~600 вышло, но это в этом месяце...
Вот...
*nix-way, guitar, freedom & добро и свет ;)
[ cc ] Net
Спасибо сказали:
Аватара пользователя
Voice
Сообщения: 1073
Статус: столлманист
ОС: Debian GNU/Linux

Re: Как и чем парсить фалы ?

Сообщение Voice »

А что если сделать что-то в духе:
'<tr><td class="data2">.*<\/td>\s<td class="data2">.*<\/td>\s<td class="data2">.*<\/td>\s<td class="data2">(.*)<\/td>\s<td class="data2">.*<\/td>\s<\/tr>'

Это если нужно содержимое 4-й ячейки из 5-ти. И если использовать Perl то какая разница где там переводы строк стоят?
"И может собственных Платонов и быстрых разумом Невтонов российская земля рождать."
М. В. Ломоносов
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Как и чем парсить фалы ?

Сообщение diesel »

crashc писал(а):
12.12.2007 10:20
Спасибо, т.е. сначало нужно на строчки его отфарматировать (первой строчкой), а там уж и разбор устраивать!


да нет. я просто показал как можно прийти к решению step-by-step. если в файл 3 (в моем примере, последняя строчка) поместить все что тебе надо так отфильтровать, то как раз и получится список из значений этой ячейки.

можно конечно и регексп замутить как товарищи говорят...но я бы так не делал из лентяйских соображений - pipe из sed'ов мну писал не думая почти, вот регексп для этого всего глубокие раздумья наводит. :)
Спасибо сказали: