我试图只打印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}'我很难理解这个命令。我希望有人能向我详细解释这两件事。
很抱歉问了一个先前回答的问题,但我还没有在网上找到任何有意义的解释,我想试着用另一种解决方案来解决这个问题!
发布于 2015-10-15 02:39:20
sed通常需要一个输入文件,对吗?将wget命令输出的管道不能使它成为一个文件。为什么没有这个就行了?
与大多数Unix实用程序一样,如果文件是作为参数给出的,sed将处理它们,否则它将处理它的标准输入。
我不明白-e是什么意思。我已经查找了linux手册页,它提到它是为了“脚本”?那是什么意思?还有,引号是怎么回事?
-e用于表示下一个参数是要执行的一串sed操作(文档称此为“脚本”)。这是sed的第一个参数的缺省值,但是您得到的脚本恰好显式地使用了它。当您发出多个命令时,它非常有用,因为如果在附加命令之前不使用-e,它们将被视为文件名。另请参阅
what does dash e(-e) mean in sed commands?
在您的命令中,-n选项意味着sed在默认情况下不应该打印其输入行--您将使用p操作显式地打印选定的行。/Content-Length/匹配包含该字符串的行,然后是一组操作以在{}中的匹配行上执行。第一个操作是s/.*: //,它将:之前的所有内容以及后面的空间替换为空。第二个操作是p,它打印修改后的行。这样就可以在Content-Length:之后打印数字了。
发布于 2015-10-15 05:21:01
您仍然可以将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 in sed)。
同样适用于awk
wget http://google.com --spider --server-response 2>&1 | awk '/Content-Length/{print $2}'对于包含Content-Length的行,请打印第二个字段(这将是数字部分)。
https://stackoverflow.com/questions/33138834
复制相似问题