Concatene o conteúdo do stdout e do arquivo

4

Como podemos concatenar resultados de stdout (ou stderr) e um arquivo em um arquivo final.

Por exemplo

ls -a | grep text1

concatene com file2.txt em um resultado final (não file2.txt ), sem armazenar grep text1 em algo intermediário, como grep text1 > file1.txt

    
por Kenny 23.12.2015 / 15:42

5 respostas

14
ls -a | grep text1 | cat file2.txt -

O - significa entrada padrão. Alternativamente, você pode escrever

ls -a | grep text1 | cat - file2.txt

para ter a saída em ordem diferente.

Ainda outra possibilidade usando a substituição de processos:

cat <(ls -a | grep text1) file2.txt

ou em ordem diferente:

cat file2.txt <(ls -a | grep text1)
    
por 23.12.2015 / 15:50
5

Você pode agrupar comandos junto com {} ou () e redirecionar suas saídas combinadas:

{ 
  cat file1.txt
  echo "Now the ls/grep"
  ls -a |grep foobar
} > file2.txt

Como um oneliner:

{ cat file1.txt; echo "Now the ls/grep"; ls -a |grep foobar; } >file2.txt 

Esse último ; é necessário.

    
por 23.12.2015 / 16:03
1

Você pode apenas anexá-lo ao final de file2.txt fazendo

ls -a | grep text1 >> file2.txt

Ou se você quiser em um arquivo diferente

ls -a | grep text1 > output.txt
cat file2.txt >> output.txt

Se você quiser o stderr em vez de stdout

ls -a | grep text1 2>> output.txt

Note que isto provavelmente não colocará nada em seu arquivo, pois ls -a não produzirá nada para stderr.

EDIT: Se você quiser canalizar os resultados para outro programa em vez de redirecionar para um arquivo, você provavelmente desejará usar pipes nomeados.

mkfifo pipe1
cat pipe1 | next program &
ls -a | grep text1 >> pipe1
cat file2.txt >> pipe1
    
por 23.12.2015 / 15:43
0
ls -a | { grep text1; cat file2.txt; } >outfile

Aqui ls grava em grep , que grava em um stdout que ele compartilha com o processo cat que é iniciado quando sua filtragem é feita através da saída ls . Quando grep cat grava uma cópia de file2.txt no mesmo stdout compartilhado. Menos canos dessa maneira, geralmente.

... ou ...

ls -a | sed -ne'$r file2.txt' -e'/text1/p' >outfile

Aqui sed representa grep e filtra a entrada para saída imprimindo apenas correspondências para um text1 regexp. Quando atinge a $ last da saída de ls , ela programa uma r ead de file2.txt para que a saída ocorra depois de ter concluído o ciclo de linha atual - e assim que imprime (ou não imprime) a última linha da saída de ls , copia todos os file2.txt para sua stdout também.

    
por 29.12.2015 / 07:54
-1

Você pode fazer algo como abaixo

ls -a | grep text1 >> file2.txt 2>&1

2>&1 irá redirecionar o erro padrão para a saída std

    
por 23.12.2015 / 15:47