我试图只打印wget命令的一小部分输出。如果我输入
wget http://google.com --spider --server-response
我收到一个很长的输出列表到我要搜索的终端。其中一行是
Content-Length: 219
我想要做的就是读取并打印出数字219到标准输出。我在另一个堆栈溢出线程(get file size of a file to wget before wget-ing it?)
上找到了答案wget http://google.com --spider --server-response -O - 2>&1 | sed -ne '/Content-Length/{s/.*: //;p}'
我在理解这个命令时遇到两个主要困难。我希望有人可以向我详细解释这两件事。
sed通常需要一个输入文件吗?管道wget命令的输出不会使其成为文件。怎么没有这个呢?
我不明白-e的意思。我查了一下linux手册页,它提到它是为了“脚本”?这个标志很重要,因为没有它,没有任何作用。这是什么意思?此外,命令的其余部分发生了什么,以及如何打印出数字?
很抱歉问一个以前回答的问题,但我没有找到任何有意义的解释,我想尝试使用替代解决方案!
答案 0 :(得分:5)
sed通常需要一个输入文件吗?管道wget命令的输出并不能使其成为文件。怎么没有这个呢?
与大多数Unix实用程序一样,sed
将处理文件,如果它们作为参数提供,否则它将处理其标准输入。
我不明白 - 是什么意思。我查了一下linux手册页,它提到它是用于"脚本" ?这意味着什么?另外,引号行中发生了什么?
-e
用于表示下一个参数是要执行的sed
个操作的字符串(文档称之为"脚本")。这是sed
的第一个参数的默认值,但是您获得的脚本恰好使用了它。当您提供多个命令时,它最有用,因为如果您在其他命令之前没有使用-e
,那么它们将被视为文件名。另见
what does dash e(-e) mean in sed commands?
在您的命令中,-n
选项意味着默认情况下sed
不应打印其输入行 - 您将使用p
操作明确打印所选行。 /Content-Length/
匹配包含该字符串的行,然后是在{}
中对这些匹配行执行的一组操作。第一个操作是s/.*: //
,它将所有内容替换为:
以及后面的空格。第二个操作是p
,它打印修改后的行。这样就可以在Content-Length:
之后输出数字。
答案 1 :(得分:1)
您仍然可以将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
的行,从头开始删除所有字符,包括:
和{{1} }。然后打印修改后的行(space
中的p
)。
与sed
相同:
awk
对于包含wget http://google.com --spider --server-response 2>&1 | awk '/Content-Length/{print $2}'
的行,打印第二个字段(将是数字部分)。