Использование sed для чтения количества байтов веб-сайта из wget

Я пытаюсь распечатать только небольшую часть вывода команды wget. Если я наберу

wget http://google.com --spider --server-response

Я получаю длинный список вывода на терминал, который я хочу найти. Одна из этих строк

Content-Length: 219

Все, что я хочу сделать, это прочитать и распечатать номер 219 на стандартный вывод. Я нашел ответ в другом потоке переполнения стека ( получить размер файла для wget перед его созданием?)

wget http://google.com --spider --server-response -O - 2>&1 | sed -ne '/Content-Length/{s/.*: //;p}'

У меня две основные трудности с пониманием этой команды. Я надеялся, что кто-нибудь сможет объяснить мне подробно об этих двух вещах.

  1. sed обычно требует входной файл, верно? Передача результатов команды wget не делает ее файлом. Почему это работает без этого?

  2. Я не понимаю, что это значит. Я посмотрел справочные страницы Linux, и там упоминается, что это для "сценария"? Этот флаг важен, потому что без него ничего не работает. Что это значит? Кроме того, что происходит с остальной частью команды и как она выводит только номер?

Извините, что задал ранее отвеченный вопрос, но я не нашел в сети никакого объяснения, которое имеет смысл, и я хочу попробовать сделать это с альтернативным решением!

2 ответа

Решение

sed обычно требует входной файл, верно? Передача результатов команды wget не делает ее файлом. Почему это работает без этого?

Как и большинство утилит Unix, sed будет обрабатывать файлы, если они заданы в качестве аргументов, в противном случае он будет обрабатывать свой стандартный ввод.

Я не понимаю, что это значит. Я посмотрел справочные страницы Linux, и там упоминается, что это для "сценария"? Что это значит? Кроме того, что происходит в строке с кавычками?

-e используется, чтобы указать, что следующий аргумент является строкой sed выполняемые операции (документация называет это "сценарием"). Это значение по умолчанию для первого аргумента sed, но полученный скрипт использует его явно. Это в основном полезно, когда вы даете несколько команд, потому что если вы не использовали -e перед дополнительными командами они будут рассматриваться как имена файлов. Смотрите также

что означает тире e(-e) в командах sed?

В вашей команде -n опция означает, что sed не следует печатать входные строки по умолчанию - вы будете использовать p операция для явной печати выбранных строк. /Content-Length/ сопоставляет строки, содержащие эту строку, после чего следует набор операций, выполняемых с этими совпадающими строками в {}, Первая операция s/.*: //, который заменяет все до : и пространство после него ни с чем. Вторая операция p, которая печатает измененную строку. Так что печатает номер после Content-Length:,

Вы все еще можете уменьшить это sed команда (wget -O не требуется, sed -e не требуется) чтобы:

wget http://google.com --spider --server-response 2>&1 | sed -n '/Content-Length/{s/.*: //;p}'

Здесь, перенаправление STDERR в STDOUT и сделать sed оперировать этим. Что за sed команда делает, она подавляет печать (-n), то для строк, содержащих Content-Lengthудалить все символы с начала, включая : а также space, Затем выведите измененную строку (p в sed).

То же самое с awk:

wget http://google.com --spider --server-response 2>&1 | awk '/Content-Length/{print $2}'

Для строк, содержащих Content-Length, напечатайте второе поле (которое будет частью числа).

Другие вопросы по тегам