удар - извлекает имена файлов из файла HTML, содержащего несколько ссылок

awk -F, '{if ($1 == "Blank") ip=repltext; else {ip=$1; repltext=$1;};
  print ip "," $2}' inputfile

предполагая, что "Исходный IP, URL" не является частью входа. Если это - изменение в

awk -F, 'NR == 1 {next;}; {if ($1 == "Blank") ...

Также предполагая, что первая строка данных не содержит "Пробел", но всегда IP-адрес.

4
15.04.2016, 17:25
3 ответа

Ваше регулярное выражение равно

target="_blank">([[:graph:]]*)\.(jpg|png|gif|webm)

Это соответствует буквальному тексту target="_blank">, за которым следует любое количество небелого пробела, с одной из четырех строк .jpg, .png, .gif или .webm в конце. Например, команда grep выводит жирные части следующих строк:

<a … target="_blank">something.jpg</a>
<a … target="_blank">a.gifted.child.txt</a>
<a … target="_blank">something else.jpg</a>
<a … target="_blank">something.jpg</a>+more.jpg

И если вы используете [[:print:]] вместо [[:graph:]], то это будет соответствовать чему-то вроде

<a … target="_blank">something.jpg</a> wibble wobble <a … target="_blank">something else.jpg</a>

Все между первым совпадающим целевым битом ... и последним совпадающим расширением на строке является совпадением.

Все, что вам нужно, это исключить HTML-символы разметки из совпадения.

target="_blank">[^<>]*\.(jpg|png|gif|webm)</a>

С помощью GNU grep вы можете использовать опцию -P для получения конструкций из Perl регулярных выражений , и в частности утверждения нулевой ширины , которые позволяют указать, что чему-то предшествует или за чем следует некоторый константный текст без включения этого текста в совпадающую часть.

grep -o -P '(?<target="_blank">)[^<>]*\.(jpg|png|gif|webm)(?=</a>)'

Это все равно может не сработать, если появится неожиданный пробел (например, новая строка между тегом и закрывающим , или ). Вы бы лучше использовали правильный парсер HTML.

Например, на питонском языке с помощью BeautifulSoup (непроверенный):

import re, sys, BeautifulSoup
soup = BeautifulSoup(sys.stdin)
for hit in soup.find_all('a', target='_blank'):
    if re.match(r'.*\.(jpg|png|gif|webm)\Z', hit.string):
        print(hit.string)

Аналогичный код можно написать с помощью HTML::Parser на Perl, Nokogiri на Ruby и др.

2
27.01.2020, 20:49

Я закончил так:

w3m -dump -T text/html "$thread" | grep -i -E -o 'File\:+([[:print:]]*)\.(jpg|png|webm|gif)'

w3m очищает код, а затем я могу смазать имена файлов. (Мне нужна буквальная часть "File:", чтобы отличить связанный файл от его названия). Мне действительно нужен [[:print:]], потому что он ловит большинство пробельных символов, символов юникода и других печатных таблиц.

, которая работает, как я и предполагал (хотя я все еще должен придумать, как предотвратить перезапись файлов с тем же именем, но это битва на другой день)

.
0
27.01.2020, 20:49

Теги

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