загрузите только первые несколько байтов исходной страницы

От man grep страница (на Debian):

ОПИСАНИЕ

   grep  searches the named input FILEs (or standard input if no files are
   named, or if a single hyphen-minus (-) is given as file name) for lines
   containing  a  match to the given PATTERN.  By default, grep prints the
   matching lines.

В первом случае, grep открывает файл; во втором оболочка открывает файл и присваивает его стандартному входу grep, и grep не будучи переданным никакой аргумент имени файла предполагает, что ему нужен к grep его стандартный вход.

Профессионалы 1:

  • grep может grep больше чем один файл ¹.
  • grep может отобразить имя файла где каждое возникновение line найден.

Профессионалы 2:

  • Если файл не может быть открыт, оболочка возвращает ошибку, которая будет включать более релевантную информацию (как номер строки в сценарии) и более последовательным способом (если Вы позволите оболочке открыть файлы для других команд также) чем тогда, когда grep открывает его. И если файл не может быть открыт, grep даже не назван (который для некоторых команд - возможно, нет grep - может иметь большое значение).
  • в grep line < in > out, если in не может быть открыт, out не будет создан или не усеченный.
  • Нет никакой проблемы с некоторыми файлами с необычными именами (как - или имена файлов, запускающиеся с -) ².
  • косметический: можно поместить <file где угодно на командной строке для показа команды текут более естественно, как <in grep line >out если Вы предпочитаете.
  • косметический: с GNU grep, можно выбрать что маркировку использовать перед согласующим отрезком длинной линии вместо просто имени файла как в:

    <file grep --label='Found in file at line' -Hn line
    

С точки зрения производительности, если файл не может быть открыт, Вы сохраняете выполнение grep при использовании перенаправления, но иначе для grep Я не ожидаю большого различия.

С перенаправлением Вы сохраняете необходимость передать дополнительный аргумент grep, Вы делаете grepаргумент, анализирующий немного легче. С другой стороны, оболочке будет нужен (по крайней мере), дополнительный системный вызов dup2() дескриптор файла на дескриптор файла 0.

В { grep -m1 line; next command; } < file, grep (здесь GNU grep) захочет seek() назад к сразу после согласующего отрезка длинной линии так next command видит остальную часть файла (это должно будет также определить, seekable ли файл или не). Другими словами, положение в stdin - другой grepвывод. С grep -m1 line file, это может оптимизировать это, это - то меньше вещи для grep заботиться о.


Примечания

¹ С zsh, можно сделать:

grep line < file1 < file2

но это делает эквивалент cat file1 file2 | grep line (не вызывая cat утилита), и так менее эффективно, может вызвать беспорядок, если первый файл не заканчивается в символе новой строки и не сообщит, в котором регистрируют шаблон, найден.

² В случае ksh93 и bash хотя, существуют файлы как /dev/tcp/host/port/dev/fd/x в некоторых системах в bash) который при использовании в цели перенаправлений прерывания оболочки для особых целей вместо того, чтобы действительно открыть файл в файловой системе (хотя обычно, те файлы не существуют в файловой системе). /dev/stdin служит той же цели как - распознанный grep, но по крайней мере, здесь это более правильно namespaced (кто-либо может создать названный файл - в любом каталоге, в то время как только администраторы могут создать названный файл /dev/tcp/host/port и администраторы должны знать лучше).

9
03.03.2014, 23:25
3 ответа

Вы можете использовать head и переключатель -s на curl , чтобы загрузить часть страницы. Просто скажите head , сколько строк вывода вы хотите.

Пример

$ curl -r[0-1] "http://www.freebase.com/m/045c7b" -s 2>&1 | head -10
Warning: Invalid character is found in given range. A specified range MUST 
Warning: have only digits in 'start'-'stop'. The server's response to this 
Warning: request is uncertain.


  <!DOCTYPE html PUBLIC "null" "null">
  <html class="no-js" dir="ltr" lang="en">
    <head>
      <meta charset="utf-8">
      <title>

Подробности

  • Заголовок с -10 до вернет 10 строк и затем остановится. Если вы хотите большего, измените его по своему усмотрению.
  • Переключатель -s на curl указывает ему, что он будет молчать, поэтому он не будет отображать индикатор выполнения во время загрузки.
6
27.01.2020, 20:07
[1120853] Команда [1121245] head[1121246] обычно останавливает загрузку до ее окончания (хотя для коротких файлов она может заполнить буфер трубы до закрытия трубы). Это происходит потому, что когда канал закрыт, [1121247]curl[1121248] некуда записывать (дескриптор файла закрыт, запись не удается).

bcdedit /set {current} bootstatuspolicy ignoreallfailures

Однако, по моему опыту, самая длинная вещь при загрузке - это ожидание DNS запросов (болезненно, когда вы загружаете сотни файлов последовательно). В этом может помочь локальный DNS кэш типа [1121249]dnsmasq[1121250] или, если вы используете одно и то же имя домена много раз с разной структурой каталога, просто разрешите его на IP один раз и сделайте замену на URL.

bcdedit /set {default} bootstatuspolicy ignoreallfailures

Чтобы доказать мою точку зрения... попробуйте [1121251] time netstat[1121252] против [1121253] time netstat -n[1121254] (без кэша разница драматична, с кэшем это плохо только в первый раз, тогда он запомнит)[1120858].

1
27.01.2020, 20:07

Я еще не тестировал это конкретное приложение, но что-то мне подсказывает, что здесь можно использовать пару dd и nc:

$ nc www.website.com 80 <<GOT | dd bs=$BYTE_COUNT iflag=fullblock \
     count=1 of=$OUTFILE
GET / HTTP/1.1
Host: ispconfig.org
Referrer: mypage.com
User-Agent: my-browser
$(printf %b '\r\r')
GOT

Netcat (nc) может потребовать дополнительной настройки для правильного получения заголовков запроса, но если это публичный сайт, вы сможете получить полезный результат, если будете достаточно внимательны, чтобы попробовать. Конечно, dd примет только столько входных данных, сколько вы укажете, и завершит работу, что вызовет SIGPIPE netcat, чтобы он немедленно последовал вашему примеру. Единственный реальный трюк - это отладить начальное рукопожатие - как только вы запустили поток, вы можете бросить его, когда захотите.

EDIT

Чтение комментариев slm побудило меня поддержать это предложение; если вы можете сериализовать JSON POST в правильном формате, то это определенно путь к более своевременному ответу. Парсинг HTML в любом случае предназначен для птиц.

Один полезный трюк для этого - захват сетевого потока во время общения с сервером в браузере, затем, когда браузер отправит POST, который получит то, что вы хотите, отправьте его снова как GET вместо этого и посмотрите на результаты.

1
27.01.2020, 20:07

Теги

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