gpt4 book ai didi

bash - sed:无法将 26 项写入标准输出:管道损坏

转载 作者:行者123 更新时间:2023-12-02 20:09:31 25 4
gpt4 key购买 nike

我有以下命令:

cat input.txt | awk '{print $1, $6}' | sort -n | uniq -c | sort -nr | sed 's/"//g'| head -10

我得到了所需的输出,但出现了此错误

sed: couldn't write 26 items to stdout: Broken pipe

其中 input.txt 类似于:

192.168.2.20 - - [28/Jul/2006:10:27:10 -0300] "GET /cgi-bin/try/ HTTP/1.0" 200 3395
127.0.0.1 - - [28/Jul/2006:10:22:04 -0300] "GET / HTTP/1.0" 200 2216

我错过了什么

最佳答案

正如 @KamilCuk 在评论中所说,发生这种情况是因为 head -10 仅读取管道中的前 10 行(可能还加上一些输入缓冲),然后将其关闭;如果输入足够大,这种情况会在 sed 将所有内容写入管道之前发生(并且管道的缓冲区不够大,无法吸收额外的内容)。因此,这种情况是否发生取决于输入大小、操作系统及其参数(决定管道的特性)、sed 在输出丢弃时的行为等。只需稍微改变一下就可以足以避免问题,例如:

...sort -nr | tr -d '"' | head -10       # use `tr` instead of `sed` -- it may behave differently
...sort -nr | head -10 | sed 's/"//g' # swap `head` and `sed` -- now `sort`'s output is dropped

这是避免该错误的一个:

...sort -nr | sed '11,$ d; s/"//g'

它的工作方式是告诉 sed 丢弃第 11 行到输入末尾(“$”),但因为它在读取它们之后丢弃它们(而不是比一开始就没有读取它们(例如 head -10),sort 的整个输出都会被读取并且不会发生错误。

顺便说一句,正如 @triplee 指出的那样,在管道的开头使用 cat 是没有用的;您应该让 awk 直接读取文件,如下所示:

awk '{print $1, $6}' input.txt | ...

关于bash - sed:无法将 26 项写入标准输出:管道损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53697280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com