LINUX.ORG.RU

Объединение stdout двух команд

 


0

2

Подскажите, пожалуйста, как объединить вывод двух команд в один поток (без использования файла)?

Пытаюсь грепнуть логи nginx и обработать выбранные строки. Проблема в том, что старые логи архивируются в .gz и приходится получать строки из текущего лога с помощью cat, а из архивированных - с помощью zcat:

sudo cat /var/log/nginx/access.log       | grep 'GET /music/?id'| cut -d '"' -f 2| sort -u|cut -d '=' -f 2 | cut -d ' ' -f 1 | grep -E [a-f0-9]{32}
sudo zcat /var/log/nginx/access.log.*.gz | grep 'GET /music/?id'| cut -d '"' -f 2| sort -u|cut -d '=' -f 2 | cut -d ' ' -f 1 | grep -E [a-f0-9]{32}

Можно писать вывод во временный файл, а потом удалять, но это некрасиво

★★★
(cat /var/log/nginx/access.log; zcat /var/log/nginx/access.log.*.gz ) | grep 'GET /music/?id'| cut -d '"' -f 2| sort -u|cut -d '=' -f 2 | cut -d ' ' -f 1 | grep -E [a-f0-9]{32}

?

cx ★★
()

Если я правильно понял, то:

{ cat /ololo/firstfile & zcat /ololo/secondfile ; } | grep ololo

где grep ololo любой обработчик стандартного ввода.

IPR ★★★★★
()
Ответ на: комментарий от IPR
$ {echo 1;echo 2;echo 3}|sort -u
-bash: {echo: команда не найдена
2
3}

$ {ls;ls;ls}|sort -u
-bash: {ls: команда не найдена
<список файлов>
-bash: ls}: команда не найдена

{ ls ; ls }|sort -u; 
> 
> 
> ^C
<ждёт ввода>
disarmer ★★★
() автор топика
Ответ на: комментарий от disarmer

во, с пробелами работает, но как то помороченно синтаксис выдерживать)

Ничего не поделаешь, это шелл. Когда ты запускаешь в обычных скобках, это команда выполняется отдельным процессом, а в фигурных - объединение команд. Полезно, когда нужно получить предсказуемое поведение при трёх или более конвеерах и перенаправляторах ввода/вывода.

IPR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.