Я хочу извлечь URL из тегов привязки html файла. Это нужно сделать в BASH с помощью SED/AWK. Нет perl, пожалуйста.
Каков самый простой способ сделать это?
Я хочу извлечь URL из тегов привязки html файла. Это нужно сделать в BASH с помощью SED/AWK. Нет perl, пожалуйста.
Каков самый простой способ сделать это?
Вы также можете сделать что-то подобное (при условии, что у вас установлена lynx)...
Версии Lynx < 2.8.8
lynx -dump -listonly my.html
Lynx версии >= 2.8.8 (любезно предоставлено @condit)
lynx -dump -hiddenlinks=listonly my.html
Вы просили об этом:
$ wget -O - http://stackoverflow.com | \
grep -io '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
sed -e 's/^<a href=["'"'"']//i' -e 's/["'"'"']$//i'
Это грубый инструмент, поэтому применяются все обычные предупреждения о попытке анализа HTML с помощью регулярных выражений.
grep "<a href=" sourcepage.html
|sed "s/<a href/\\n<a href/g"
|sed 's/\"/\"><\/a>\n/2'
|grep href
|sort |uniq
С помощью Xidel - инструмент для извлечения данных HTML/XML, это можно сделать с помощью:
$ xidel --extract "//a/@href" http://example.com/
С конверсией в абсолютные URL:
$ xidel --extract "//a/resolve-uri(@href, base-uri())" http://example.com/
Пример, поскольку вы не предоставили какой-либо образец
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
Я сделал несколько изменений в решении Грега Бэкона
cat index.html | grep -o '<a .*href=.*>' | sed -e 's/<a /\n<a /g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d'
Это устраняет две проблемы:
Я предполагаю, что вы хотите извлечь URL из некоторого HTML-текста, а не анализировать HTML (как предполагает один из комментариев). Верьте или нет, кто-то уже сделал это.
OT: на сайте sed есть много полезной информации и много интересных/сумасшедших сценариев sed. Вы даже можете играть в Сокобана в седе!
Вы можете сделать это довольно легко с помощью следующего регулярного выражения, которое неплохо находит 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]|/)))'
В 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"; }; _'
Расширение на ответ 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.
Выберите и выберите, какой из них вы используете в соответствии с вашими конкретными требованиями.
Вы можете попробовать:
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
Это мой первый пост, поэтому я стараюсь объяснить, почему я публикую этот ответ...
Итак, вот самый простой script из GNU grep 2.28:
grep -Po 'href="\K.*?(?=")'
О переключателе \K
, а не информация была создана на страницах MAN и INFO, поэтому я пришел здесь для ответа....
переключатель \K
избавится от предыдущих символов (и самого ключа).
Имейте в виду следующие советы:
"Это очень экспериментально, и grep -P может предупредить о нереализованных функциях".
Конечно, вы можете изменить script, чтобы соответствовать вашим вкусам или потребностям, но я нашел это довольно прямо для того, что было запрошено в сообщении, а также для многих из нас...
Надеюсь, вам это очень понравится.
спасибо!!!