Я хочу извлечь URL-адрес из тегов привязки html-файла. Это нужно сделать в BASH, используя SED/AWK. Пожалуйста, без перла.
Как это сделать проще всего?
Я хочу извлечь URL-адрес из тегов привязки html-файла. Это нужно сделать в BASH, используя SED/AWK. Пожалуйста, без перла.
Как это сделать проще всего?
Вы также можете сделать что-то подобное (при условии, что у вас установлен lynx)...
Версии Lynx ‹ 2.8.8
lynx -dump -listonly my.html
Версии Lynx >= 2.8.8 (любезно предоставлено @condit)
lynx -dump -hiddenlinks=listonly my.html
lynx -dump -hiddenlinks=listonly my.html
- person condit; 08.05.2014
Ты просил об этом:
$ wget -O - http://stackoverflow.com | \
grep -io '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
sed -e 's/^<a href=["'"'"']//i' -e 's/["'"'"']$//i'
Это грубый инструмент, поэтому применимы все обычные предупреждения о попытках парсить HTML с помощью регулярных выражений.
code
cat index.html | grep -o '‹a .*href=.*›' | sed -e 's/‹a/\n‹a/g' | sed -e 's/‹a .*href=[''']//' -e 's/['''].*$//' -e '/^$/ d' code
- person Crisboot; 06.08.2012
С помощью Xidel — инструмента для извлечения данных HTML/XML это можно сделать с помощью:
$ xidel --extract "//a/@href" http://example.com/
С преобразованием в абсолютные URL:
$ xidel --extract "//a/resolve-uri(@href, base-uri())" http://example.com/
grep "<a href=" sourcepage.html
|sed "s/<a href/\\n<a href/g"
|sed 's/\"/\"><\/a>\n/2'
|grep href
|sort |uniq
Я внес несколько изменений в решение Грега Бэкона.
cat index.html | grep -o '<a .*href=.*>' | sed -e 's/<a /\n<a /g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d'
Это устраняет две проблемы:
Пример, поскольку вы не предоставили образец
awk 'BEGIN{
RS="</a>"
IGNORECASE=1
}
{
for(o=1;o<=NF;o++){
if ( $o ~ /href/){
gsub(/.*href=\042/,"",$o)
gsub(/\042.*/,"",$o)
print $(o)
}
}
}' index.html
Я предполагаю, что вы хотите извлечь URL-адрес из некоторого текста HTML, а не анализировать HTML (как предлагает один из комментариев). Хотите верьте, хотите нет, но кто-то уже сделал это.
OT: веб-сайт sed содержит много полезной информации и множество интересных/сумасшедших sed. скрипты. Вы даже можете играть Sokoban в sed!
wget http://sed.sourceforge.net/grabbag/scripts/list_urls.sed -O ~/bin/list_urls.sed && chmod +x ~/bin/list_urls.sed
чтобы получить скрипт, а затем wget http://www.example.com -O - | ~/bin/list_urls.sed > example.com.urls.txt
чтобы получить URL-адреса в текстовом файле!
- person arjan; 19.02.2016
Вы можете сделать это довольно легко с помощью следующего регулярного выражения, которое неплохо находит URL-адреса:
\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
Я взял его из статьи Джона Грубера о том, как найти URL-адреса в тексте.
Это позволяет вам найти все URL-адреса в файле f.html следующим образом:
cat f.html | grep -o \
-E '\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))'
Расширение ответа kerkael:
grep "<a href=" sourcepage.html
|sed "s/<a href/\\n<a href/g"
|sed 's/\"/\"><\/a>\n/2'
|grep href
|sort |uniq
# now adding some more
|grep -v "<a href=\"#"
|grep -v "<a href=\"../"
|grep -v "<a href=\"http"
Первый добавленный мной grep удаляет ссылки на локальные закладки.
Второй удаляет относительные ссылки на верхние уровни.
Третий удаляет ссылки, которые не начинаются с http.
Выберите и выберите, какой из них вы используете в соответствии с вашими конкретными требованиями.
В bash должно работать следующее. Обратите внимание, что он не использует sed или awk, но использует tr
и grep
, оба очень стандартные, а не perl ;-)
$ cat source_file.html | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' -e '^http://' -e'^//' | sort | uniq
Например:
$ curl "https://www.cnn.com" | tr '"' '\n' | tr "'" '\n' | grep -e '^https://' -e '^http://' -e'^//' | sort | uniq
генерирует
//s3.amazonaws.com/cnn-sponsored-content
//twitter.com/cnn
https://us.cnn.com
https://www.cnn.com
https://www.cnn.com/2018/10/27/us/new-york-hudson-river-bodies-identified/index.html\
https://www.cnn.com/2018/11/01/tech/google-employee-walkout-andy-rubin/index.html\
https://www.cnn.com/election/2016/results/exit-polls\
https://www.cnn.com/profiles/frederik-pleitgen\
https://www.facebook.com/cnn
etc...
Перейдите к первому проходу, заменив начало URL-адресов (http) новой строкой (\n
http). Тогда вы гарантировали себе, что ваша ссылка начинается в начале строки и является единственным URL в строке.
Остальное должно быть легко, вот пример:
sed "s/http/\nhttp/g" <(curl "http://www.cnn.com") | sed -n "s/\(^http[s]*:[a-Z0-9/.=?_-]*\)\(.*\)/\1/p"
alias lsurls='_(){ sed "s/http/\nhttp/g" "${1}" | sed -n "s/\(^http[s]*:[a-Z0-9/.=?_-]*\)\(.*\)/\1/p"; }; _'
Можешь попробовать:
curl --silent -u "<username>:<password>" http://<NAGIOS_HOST/nagios/cgi-bin/status.cgi|grep 'extinfo.cgi?type=1&host='|grep "status"|awk -F'</A>' '{print $1}'|awk -F"'>" '{print $3"\t"$1}'|sed 's/<\/a> <\/td>//g'| column -c2 -t|awk '{print $1}'
Вот как я попробовал это для лучшего просмотра, создайте файл оболочки и укажите ссылку в качестве параметра, он создаст файл temp2.txt.
a=$1
lynx -listonly -dump "$a" > temp
awk 'FNR > 2 {print$2}' temp > temp2.txt
rm temp
>sh test.sh http://link.com
Это мой первый пост, поэтому я стараюсь изо всех сил объяснять, почему я публикую этот ответ...
Итак, простейший скрипт из GNU grep 2.28:
grep -Po 'href="\K.*?(?=")'
О переключателе \K
на страницах MAN и INFO не было информации, поэтому я пришел здесь для ответа.... переключатель \K
избавляет от предыдущих символов (и самого ключа). Имейте в виду, следуя советам из справочных страниц: это очень экспериментально, и grep -P может предупредить о нереализованных функциях.
Конечно, вы можете изменить сценарий в соответствии со своими вкусами или потребностями, но я нашел его довольно простым для того, что было запрошено в посте, а также для многих из нас...
Надеюсь, ребята, вы найдете это очень полезным.
Спасибо!!!
Отказ от требования awk
/sed
:
urlextract
создан именно для такой задачи (документация).urlview
— это интерактивное решение CLI (репозиторий github).