Intereting Posts
Как удалить файл без использования rm? Как использовать параметр -t для отображения команды Unix Как сгенерировать пакет deb без компиляции Нормально ли, что перезагрузка требуется для установки USB после обновления ядра? Если вы используете SSH на другом компьютере, как получить доступ к другим дисплеям X? Аутентификация открытого ключа SSH работает в локальной сети, а не из WAN Rsyslog не отправляет журналы на сервер logstash на порт Что делает: p делать в vim? Как получить настоящее имя управляющего терминала? Ошибка при обновлении apt-get: недопустимы следующие подписи: Как обеспечить, чтобы исходящий трафик TCP / IP всегда использовал VPN, даже при использовании Wi-Fi? Видеопроигрыватель, который использует несколько ядер CPU / GPU в Linux? Как избежать того, что редактор Geany изменяет владельца файла при его редактировании? Зеркало localhost: 3280 / some / long / url to localhost: 3000 Как установить переменную среды glib: g_slice

Curl url txt file, но grep каждый URL отдельно от одного файла

Хорошо, вот один из вас, ребята, который меня озадачивает. Поэтому у меня есть текстовый файл с большим количеством URL-адресов. Я использую curl -K "$urls" > $output

вывести вывод в выходной файл. Теперь для вывода каждого отдельного URL есть термин, скажем, «залог», под которым я не хочу больше информации. Теперь я знаю, что могу использовать

 sed '/mortgage/q' 

удалить всю информацию под термином «ипотека», но если я использую ее в своем сценарии так,

 curl -K "$urls" | sed '/mortgage/q' > $output 

он удаляет все из всего выпуска под первым экземпляром «ипотеки» из вывода первого URL-адреса в URL-адресах, но это вытирает всю информацию из другого URL-адреса (включая материал перед их собственным экземпляром слова «закладка» ») из-за того, что он работает над всей продукцией, а не для каждого URL-адреса.

Как я могу указать sed '/mortgage/q' чтобы действовать отдельно на выходе каждого URL-адреса в файле url, чтобы он не влиял на результат глобально. Любая помощь оценивается.

мой url-файл довольно прост, в формате (это всего лишь пример):

 URL = http://www.bbc.co.uk/sport/rugby-union/34914911 URL = http://stackoverflow.com/questions/9084453/simple-script-to-check-if-a-webpage-has-been-updated 

и так далее…..

******* НОВЫЙ РЕДАКТ: Я задумал гипотетический способ достижения этого, но не уверен в коде – есть ли способ адаптировать curl -K "$urls" | sed '/mortgage/q' > $output curl -K "$urls" | sed '/mortgage/q' > $output чтобы команда возвращалась после каждого последующего url в файле $url Таким образом, команда curl изначально просто извлекает первый url в файле, выполняет команду sed на этом url-материале , добавляет к $output , затем возвращается ко второму URL-адресу в файле, выполняет команду sed, добавляет к $output и т. д …. Это будет означать, что требуемый материал из каждого URL-адреса был включен в выходной файл, но материал ниже «залога» в каждом URL-адресе не был. Я просто не знаю, как добиться этого с помощью кода. Есть идеи?

Это должно быть сделано в двух строках:

 sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf|xargs -I {} curl -O "{}" sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf|xargs -I {} basename "{}"|xargs -I {} sed '/mortgage/q' "{}" 

Первая команда sed в каждой строке извлекает URL-адреса из вашего файла urls (/tmp/curl.conf в примере). В первой строке мы используем параметр -O curl для сохранения вывода с каждой страницы в файл с именем страницы. Во второй строке мы пересматриваем каждый из этих файлов и показываем только текст, который вас интересует. Конечно, если слово «залог» не встречается в файле, тогда будет выводиться весь файл.

Это оставит вам временный файл для каждого URL-адреса в текущем каталоге.

РЕДАКТИРОВАТЬ:

вот короткий скрипт, который позволяет избежать любых файлов с более старыми файлами, выводит результат на стандартный вывод, вы можете перенаправить его оттуда, как хотите:

 #!/bin/bash TMPF=$(mktemp) # sed command extracts URLs line by line sed -n 's/\s*URL\s*=\s*\(.*\)/\1/p' /tmp/curl.conf >$TMPF while read URL; do # retrieve each web page and delete any text after 'mortgage' (substitute whatever test you like) curl "$URL" 2>/dev/null | sed '/mortgage/q' done <"$TMPF" rm "$TMPF" 

Этот общий трюк работает, даже если ваш файл конфигурации curl содержит разные параметры, такие как пользовательский агент, референт и т. Д.

Сначала сделайте свой конфигурационный файл с именем curl_config , затем используйте awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config > curl_config2 чтобы создать новый файл конфигурации curl, который постепенно добавляет разные имена выходных файлов под каждым URL / URL:

Пример:

 [xiaobai@xiaobai curl]$ cat curl_config URL = "www.google.com" user-agent = "holeagent/5.0" url = "m12345.google.com" user-agent = "holeagent/5.0" URL = "googlevideo.com" user-agent = "holeagent/5.0" [xiaobai@xiaobai curl]$ awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config > curl_config2 [xiaobai@xiaobai curl]$ cat curl_config2 URL = "www.google.com" output = dummy/1 user-agent = "holeagent/5.0" url = "m12345.google.com" output = dummy/2 user-agent = "holeagent/5.0" URL = "googlevideo.com" output = dummy/3 user-agent = "holeagent/5.0" [xiaobai@xiaobai curl]$ 

Затем mkdir dummy создает каталог для хранения этих временных файлов. Создайте сеанс inotifywait (замените sed / google / q на ваш sed / mortgage / q '):

 [xiaobai@xiaobai curl]$ rm -r dummy; mkdir dummy; [xiaobai@xiaobai curl]$ rm final [xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done; Setting up watches. Watches established. 

Откройте еще один сеанс bash / terminal, rm final file if exist, затем запустите завиток с вашим файлом curl_config2, созданным на первом шаге выше:

 [xiaobai@xiaobai curl]$ curl -vLK curl_config2 ...processing 

Теперь взгляните на сеанс inotifywait, он распечатает последний закрытый файл, скопируйте его и сразу же удалите его:

 [xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done; Setting up watches. Watches established. dummy/1 dummy/3 

Наконец, вы можете наблюдать, что ваш результат называется final , разделитель [1 и 3] генерируется из echo "[$file]">> final выше:

введите описание изображения здесь

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