Fala Paulo,
Em 10 de junho de 2014 15:19, Paulo Bettega address@hidden
<mailto:address@hidden>
[shell-script] <address@hidden <mailto:address@hidden>> escreveu:
__
Olá Rodrigo, a saída que vc quer parece um grep simples na lista de
arquivos, será que não?
cat arq-path-completo.txt | xargs -i grep -H x {}
Interessante que o grep sozinho lista o arquivo e a linha com o padrão,
mas recebendo os arquivos do xargs, o grep só lista a linha, sem
o nome do arquivo.
A explicação para isso é simples. Qdo vc faz:
grep ER arq*
Antes de executar o cmd o shell expande o arq* e o grep que é executado é algo
como:
grep ER arq1 arq2 arq3 ... arqn
Como esse é um grep multi arquivos, ele especifica em quais ele achou,
precedendo a linha com seu nome.
Qdo vc faz:
cat arq | xargs -i grep ER {}
Os arquivos estão vindo um a um da entrada primária (o pipe), então ele nem tem
os nomes. Repare isso:
$ wc -l redimensiona
41 redimensiona
$ cat redimensiona | wc -l
41
A mesma coisa ocorreu, como os dados vieram da entrada primária, o wc não tinha
o nome do arquivo.
Vou aproveitar e dar duas dicas sobre o xargs -i:
» Essa opção está sendo descontinuada. Em seu lugar está entrando a opção -I{}.
Vou explicar usando
exemplos:
$ cat arq | xargs -I{} grep ER {}
$ cat arq | xargs -I-- grep ER --
Ambas funcionam, mas com -I vc tem de especificar o local que receberá a cadeia
vinda da entrada
primária e com -i o padrão é a marcação {}.
» A função do xargs é colocar no fim do cmd o maior número de argumentos
possíveis antes de ganhar
um fatídico "Too many parameters" e o -I, -i ou -n1, irá tratar um a um,
ficando muito mais lento.
Como no seu exemplo os dados do pipeseriam passados para o fim do grep, vc não
precisava (e não
deveria) usar a opção -i, pq fica muito mais lento. Teste e verá.
O -i é para qdo vc que botar algo no meio (ops) do cmd. Digamos que vc queira
mover todos os
arquivos do diretório dir1 para o diretório dir2. Ou vc faz como um ser
racional, isto é,
$ mv dir1* dir2
Ou vc usa um processo de nerd alucinado:
$ ls dir1 | xargs -i mv {} dir2
Já a opção -n é para qdo vc deseja tratar um a um os dados da entrada. Veja:
$ seq 10 | xargs echo Linha
Linha 1 2 3 4 5 6 7 8 9 10
$ seq 10 | xargs -n1 echo Linha
Linha 1
Linha 2
Linha 3
Linha 4
Linha 5
Linha 6
Linha 7
Linha 8
Linha 9
Linha 10
Se vc quiser aprender um pouco mais sobre o xargs, venha tomar um chope aqui
nesse botequim
<http://wiki.softwarelivre.org/TWikiBar/TWikiBarBirinaite#Op_es_do_xargs>, pois
está cheio de
exemplos, escrito em carioquês nativo ;) e portanto leve de ler.
Acho que me empolguei e falei demais : (
Abcs,
Julio
*@juliobash*
*Próximos cursos de Shell*
*Cidade LocalPeríodo*
*Rio de JaneiroEDX <http://edx.srv.br/>02 a 06/06*
*São Paulo4Linux <http://www.4linux.com.br/>21 a 25/07*
Dou treinamento de /Shell/ em qualquer cidade.
Para mais detalhes, me mande um e-mail <mailto:address@hidden>.