[gull] Petite question grep

Félix Hauri felix at f-hauri.ch
Wed Nov 18 16:34:57 CET 2009


On Wed, Nov 18, 2009 at 03:33:52PM +0100, Nicolas Borboën wrote:
>> Or, si j'ai bien compris le probleme, on veut avoir la liste des 
>> fichiers qui contiennet expr1 & expr2, mais pas forcement sur *la meme 
>> ligne*. Juste ?
>>   
> Juste!
>> Si c'est le cas, je propose une ecriture marrante, mais qui implique 
>> que les noms de fichiers ne contienent pas d'espaces (sinon il fauit 
>> utiliser xargs). je dis bien... c'est juste interessant... :-)
>>
>> grep "expr2" $(grep -rilw "expr1" * 2>/dev/null | sed 's/:.*$//' | sort -u)

Oui, mais c'est juste ``marrant''.

La manière la plus ``juste'' proposée jusqu'ici est celle de Marc Mongenet.
On pourrait pousser encore pour assurer les noms de fichier farfellus
et dans la recherche de l'excellence:

Plutot que l'option -r, utiliser la commande find qui permet d'être précis
dans la récursion, comme dans les noms de fichiers:

$ find . -type f -exec grep -iwq "expr1" {} \; -print0 | xargs -0 grep -iwl "expr2"

Pour la recursion voir ``-maxdepth'' et ``-mindepth'' dans ``man find''.

L'avantage de print0 est que les noms de fichiers sont séparés par \\000 (chr(0))
plutôt que des sauts-de-ligne...

$ find . -type f -exec grep -iwq "expr1" {} \; -exec grep -iwq "expr2" {} \; -print0 | tar -c -T - --null -z -f tarball.tgz

( ou
  .... | xargs -0 rm
 pour effacer d'un coup tous les fichiers qui correspondent...)

Le caractère ``zero'' est égallement utilisé par ``tar'', ``xargs'', etc.
(RTFM! ;)

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list