Использование 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}'
У меня две основные трудности с пониманием этой команды. Я надеялся, что кто-нибудь сможет объяснить мне подробно об этих двух вещах.
sed обычно требует входной файл, верно? Передача результатов команды wget не делает ее файлом. Почему это работает без этого?
Я не понимаю, что это значит. Я посмотрел справочные страницы 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
, напечатайте второе поле (которое будет частью числа).