От 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 его стандартный вход.
grep
может grep больше чем один файл ¹.grep
может отобразить имя файла где каждое возникновение line
найден.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
и администраторы должны знать лучше).
Вы можете использовать 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
указывает ему, что он будет молчать, поэтому он не будет отображать индикатор выполнения во время загрузки. 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].
Я еще не тестировал это конкретное приложение, но что-то мне подсказывает, что здесь можно использовать пару 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, чтобы он немедленно последовал вашему примеру. Единственный реальный трюк - это отладить начальное рукопожатие - как только вы запустили поток, вы можете бросить его, когда захотите.
Чтение комментариев slm побудило меня поддержать это предложение; если вы можете сериализовать JSON POST в правильном формате, то это определенно путь к более своевременному ответу. Парсинг HTML в любом случае предназначен для птиц.
Один полезный трюк для этого - захват сетевого потока во время общения с сервером в браузере, затем, когда браузер отправит POST, который получит то, что вы хотите, отправьте его снова как GET вместо этого и посмотрите на результаты.