Попытка grep url из источника html в файле .txt с помощью sed

Если вы не можете позволить себе неудачу, попробуйте.
Даже если вы можете позволить себе неудачу, тестирование - это хорошо. Если возможно, запустите сборку в специальной тестовой среде. Во многих случаях виртуальный гость является подходящей тестовой системой. Когда вы перезагружаетесь в обновленное ядро ​​и все последующие тесты также завершаются успешно, только затем скопируйте и разверните новый пакет в своей удаленной системе.

Теперь к вашему основному вопросу: будут ли ваш план и делать olddefconfig ошибками, которые приведут к сбою загрузки?
Только идиот может поверить, что любая система полностью защищена от дурака. Когда вы хотите запустить самое последнее ядро ​​, как вы заявили, вы будете на переднем крае и получите все преимущества и риски, связанные с этим. Снижение риска - это выбор долгосрочного выпуска, в котором набор функций заморожен, и будут внесены только исправления ошибок / безопасности.

В любом случае: любая перезагрузка имеет небольшой риск неудачи.

Кстати, в прошлом я провел слишком много часов в центрах обработки данных, устраняя проблемы / неправильную конфигурацию серверов и рекомендую всем всегда добавлять подходящий вариант удаленного управления (например, HP ILO, Dell DRAC, Oracle ILOM и т. Д.) или шлюз KVM через IP) на удаленные серверы, что позволяет решить большинство проблем, не выходя из рабочего стола.

1
08.10.2015, 20:30
5 ответов
sed 's/^[^"]*  *//
     s/" */"\n/2
      /\n/P;D
'    <in >out

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

В любом случае, это значительно упрощает обработку вашего образца:

class="box-download"
data-no-file="0"
title="SHAREit free download"
href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe"
id="download-button"
class="button-main-download-xl"
data-ua="#c,#l,a=Download,downloadType=HostedDownload"
class="icon-download-alt"
0
27.01.2020, 23:49

С помощью этого (фиксированного) file.html:

<html>
  <div class="box-download">
    <a data-no-file="0" title="SHAREit free download" href="http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&amp;channel=WEB&amp;fdh=no&amp;id_file=69703978&amp;instance=softonic_en&amp;type=PROGRAM&amp;Expires=1444364906&amp;Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&amp;Key-Pair-Id=APKAJUA62FNWTI37JTGQ&amp;filename=LenovoShareIt-win.exe" id="download-button" class="button-main-download-xl" data-ua="#c,#l,a=Download,downloadType=HostedDownload">
      <strong>Free Download<span>Safe download</span></strong>
      <i class="icon-download-alt"></i>
    </a>
  </div>
</html>

Команда:

xmlstarlet sel -t -v "//html/div/a/@href" file.html

Вывод:

http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe
1
27.01.2020, 23:49

Это не может работать, потому что у вас есть обратная косая черта (если только парсер StackExchange не напортачил). Вы выяснили, что для выбора содержимого атрибута вы поместите его в новую строку и вырежете оттуда. Но символ новой строки - \ n , а не \ / n . Второй - « / n , гарантирующий, что косая черта обрабатывается буквально».

Итак, этот код после исправления будет работать:

grep -1 box-download shareit1.txt|sed 's:<a:\n:'|sed 's/href/\n/'|grep http |cut -d\" -f 2

Хотя вы можете сократить количество каналов и вызовов внешних программ, полагаясь исключительно на sed :

sed -n -e '/http/ s:.*href="\([^"]*\)".*:\1: p' shareit1.txt

Примечание. в любом случае все эти подходы ошибочны. Правильный способ - использовать DOM / XPath. Проблема в том, что нет DOM-парсера для оболочки (о котором я знаю) и обычных XML-парсеров оболочки, которые позволяют указывать выражения XPath, ожидают, что файл будет действительным XML, чего почти никогда не бывает с содержимым веб-сайта. В других языках программирования, таких как Python, ruby ​​или perl (чтобы упомянуть наиболее распространенные из них для системных администраторов), есть библиотеки, которые превратят беспорядочный HTML-файл во что-то, напоминающее действительный XML-файл, и то, что может быть загружено в синтаксический анализатор XML.

0
27.01.2020, 23:49

Вы можете использовать lynx -dump --list-only для извлечения списка URL из html-ввода.

Если у вас еще не установлен lynx, вам придется установить его, используя любой механизм, обычный для вашей системы linux или unix (например, lynx). apt-get, yum, make install и т. д.)

например

$ lynx -force_html -dump --listonly shareit1.txt | awk '/^ *[0-9]+\. / { print $2}'
http://gsf-cf.softonic.com/c98/1a8/173dd01ec9001985d81eb5f2023b03280c/LenovoShareIt-win.exe?SD_used=0&channel=WEB&fdh=no&id_file=69703978&instance=softonic_en&type=PROGRAM&Expires=1444364906&Signature=SdKSfTDHY4dG6HVu2--lqt8lRbGK9S1opIDZiSNwvggAAAXB3hESz1G1Y00rU5iLGY5lai0YOJBXhE4y6gvL4uQvCV4U5jzLDU9TmFTxe4xNDrEmkSC95LyGdGSudQKfrWdD06gBlVrqE49AeeotENtdA3SpkmfQGGd1tnjS138_&Key-Pair-Id=APKAJUA62FNWTI37JTGQ&filename=LenovoShareIt-win.exe
0
27.01.2020, 23:49

Вы можете использовать pup ]; это потрясающий инструмент.

Посмотрите, как я загружаю файл, а затем добавляю в файл определенные ссылки из HTML-кода.

wget http://domain.com -O file.html && pup 'a.className[href] attr{href}' < file.html > links.md

Все ссылки на Domain.com с именем класса className будут загружены и сохранены в файл с именем links.md .

0
27.01.2020, 23:49

Теги

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