shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] [Ajuda] Script de busca -- Ajuda


From: Julio C. Neves
Subject: Re: [shell-script] [Ajuda] Script de busca -- Ajuda
Date: Tue, 10 Jun 2014 22:34:30 -0300

Fala Paulo,

Em 10 de junho de 2014 15:19, Paulo Bettega address@hidden [shell-script] <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, 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         Local Período
Rio de Janeiro EDX 02 a 06/06
São Paulo 4Linux 21 a 25/07
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]