awk, sed, grep, жемчуг …, чтобы распечатать в этом случае?

Начальная загрузка с Живого CD. Перейдите к корневой подсказке.

#grub
grub> root (hd0,0) //for first hard disk, first partition
grub> find /boot/grub/stage1
grub> setup (hd0)
grub> quit

Необходимо начать работать снова. можно затем изменить menu.lst

Если Ваш /boot расположен на некотором другом диске или некотором другом разделе, который необходимо изменить (hdN,n) соответственно

2
25.03.2013, 11:38
3 ответа

Если Вы не очень уверены в формате HTML, Вы управляете им, это не очень важно с ошибками, и т.д. Вы могли использовать regex, - но, как упомянуто - не рекомендуемый.

Я часто использую его сам, но затем обычно для одного извлечения времени некоторых простых данных.


Вы могли использовать, например, Perl с HTML:: TokeParser:: Простой.

Очень упрощенный:

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TokeParser::Simple;
use HTML::Entities;
use utf8;

die "$0 [file | url]\n" unless defined $ARGV[0];

my $tp;
if ($ARGV[0] =~ /^http:\/\//) {
    $tp = HTML::TokeParser::Simple->new(url => $ARGV[0]);
} else {
    $tp = HTML::TokeParser::Simple->new(file => $ARGV[0]);
}

if (!$tp) {
    die "No HTML file found.\n";
}

# Array to store data.
my @val;
# Index
my $i = 0;

# A bit mixed code with some redundancy. 
# Could be done much simpler, - or much more safe. 
# E.g. Check for thead, tbody etc and call a sub to parse those.
# You could off course also print directly (not save to array),
# but you might want to use the data for something?
while (my $token = $tp->get_token) {
    if ($token->is_start_tag('th') && $token->get_attr('class') eq 'x') {
        $val[$i++] = $tp->get_token->as_is;
    } elsif ($token->is_start_tag('th') && $token->get_attr('class') eq 'R') {
        $val[$i++] = $tp->get_token->as_is;
    } elsif ($token->is_start_tag('td') && (
            ($token->get_attr('class') eq 'x') ||
            ($token->get_attr('class') eq 'R'))) {
        $val[$i++] = decode_entities($tp->get_token->as_is);
    }
}

my @width_col = (10, 8);

if ($i > 2 && !($i % 2)) {
    $i = 0;
    printf("%*s %*s\n",
        $width_col[0], "$val[$i++]",
        $width_col[1], "$val[$i++]"
    );
    while ($i < $#val) {
        printf("%*s %*d\n",
            $width_col[0], "$val[$i++]",
            $width_col[1], "$val[$i++]"
        );
    }
} else {
    die "ERR. Unable to extract data.\n"
}

Демонстрационный результат:

$ ./extract htmlsample 
   seconds     reqs
         0    10927
   <= 0.01  1026471
 0.01-0.02   535390
 0.02-0.05    93298
3
27.01.2020, 21:53

Как был упомянут, regex не хорош для парсинга HTML. Подобный другому синтаксическому анализу отвечают, что можно сделать остроту Ruby, такую как следующее, чтобы сделать это для Вас. Обратите внимание, что это требует Nokogiri, который можно установить как драгоценный камень (sudo gem install nokogiri).

ruby -rnokogiri -e 'h = Nokogiri::HTML(readlines.join); h.css("tr .x").zip(h.css("tr .R")).each { |d| puts "#{d[0].content} #{d[1].content}" }' sample.html

Это читает из sample.html и делает двумерную матрицу, которая содержит все с атрибутом class="x" внутри a tr элемент, соединенный со всем с атрибутом class="R" внутри a tr элемент. Затем это печатает одну такую пару на строку. Для Вашего примера вывод следующий:

seconds reqs
0 10927
<= 0.01 1026471
0.01-0.02 535390
0.02-0.05 93298
2
27.01.2020, 21:53

Это использует sed и затем можно использовать cut для получения полей, Вы хотите. Это - острота, но я записал как файл сценария с комментариями для ясности.

#!/bin/sed -f
s!</*thead!<tbody!g;      # to not get caught by 'th' below
s!<t[dh][^>]*>!%%%!g;     # replace start tag 'td' or 'th' with a delimitor
s!</t[dh]>!@@@!g;         # replace end tag 'td' or 'th' with a delimitor
s/<[^>]*>//g;             # delete any other tags
s/%%%\([^@]*\)@@@/\1 /g;  # get text between start and stop delimitors with a space
s/ $//                    # remove trailing space

Вызов этого как:

$ sed -f glean.sed test.html
seconds reqs %reqs Gbytes %bytes
0 10927  0.47% 0.01  0.18%
&lt;= 0.01 1026471 44.59% 0.11  1.81%
0.01-0.02 535390 23.26% 0.06  0.95%
0.02-0.05 93298  4.05% 0.27  4.29%

Затем можно использовать то, что Вам нравится получать первые два поля (как я предполагаю с cut).

2
27.01.2020, 21:53

Теги

Похожие вопросы