sed: не удалось написать 26 элементов на стандартный вывод: сломанная труба - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть следующая команда:

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

что мне не хватает

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Подход № 1: Переместить sed в конец

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

Это семантически то же самое.Помещая sed в конце, вы получаете желаемое форматирование, но избегаете сообщения об ошибке.

Подход № 2. Игнорируйте сообщения об ошибках.

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

Это довольно грубая сила и может привести к тому, что в будущем вы пропустите еще одну проблему.

0 голосов
/ 10 декабря 2018

Как сказал @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 | ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...