Você pode descartar cat completamente e, em seguida, redirecionar a saída de grep para o arquivo de resultado:
grep -i "osx" test.txt >q1.txt
Isso pesquisará linhas em test.txt contendo a string osx (sem distinção entre maiúsculas e minúsculas) e armazenará essas linhas em q1.txt . Se o arquivo q1.txt existir, ele será truncado (esvaziado) antes que a saída seja armazenada nele.
Se você deseja anexar a saída no final do arquivo, use >> em vez de > como o operador de redirecionamento.
Seu comando:
cat q1.txt | grep -i "osx" test.txt
O que isso realmente faz é iniciar cat e grep simultaneamente. cat lerá de q1.txt e tentará gravar em sua saída padrão, que é conectada à entrada padrão de grep .
No entanto, como você está dando a grep um arquivo para ler, ele ignorará totalmente o que o cat está enviando.
No final, todas as linhas em test.txt que contiverem a string osx serão enviadas para o terminal.
Há algo frequentemente chamado de "uso inútil de cat ", o que significa que uma invocação de cat pode ser completamente removida e que o arquivo pode ser lido diretamente por outra ferramenta.
O exemplo extremo disso seria:
cat test.txt | cat | cat | cat | grep -i "osx" | cat | cat >q1.txt
mas mesmo apenas
cat test.txt | grep -i "osx" >q1.txt
é inútil, pois grep é perfeitamente capaz de ler de um arquivo por si só (como visto acima). Mesmo que não tenha capacidade de abrir test.txt , pode-se escrever
grep -i "osx" <test.txt >q1.txt
para dizer que a entrada padrão deve vir do arquivo test.txt e que a saída padrão deve ir para o arquivo q1.txt
Use cat somente ao concatenar dados (é o principal uso). Existem alguns outros usos de cat também, mas está fora do escopo desta questão.
Relacionados: