OVH Cloud OVH Cloud

grep immense

17 réponses
Avatar
Rakotomandimby (R12y) Mihamina
Bonjour,

J'ai un serveur qui a du changer d'IP.

Je dois donc me taper tous les fichiers de configuration des serveurs
logiciels (MTA, Apache, tout...)


Pour avoir une idée de la masse de travail qui m'attend, je voudrai faire
un 'grep $OLD_IP /**/*' et ainsi savoir combien de fichiers contiennent
l'ancienne IP et ainsi commencer l'assignation des priorités d'édition.

Comme mentionné plus haut, le grep il va crier parceque trop d'arguments.
En effet je lui donne à manger tout le filesystem. Comment arranger un
peu ça? Avec un for bien senti du genre

for FICHIER in /**/* ; do
if ((le fichier contient $OLD_IP)) then
print $FICHIER
done

Comment faire bref pour la chose entre "(( ))" ?

J'utilise zsh.

Merci d'avance.

--
Miroir de logiciels libres http://www.etud-orleans.fr
Développement de logiciels libres http://aspo.rktmb.org/activites/developpement
Infogerance de serveur dédié http://aspo.rktmb.org/activites/infogerance
(En louant les services de l'ASPO vous luttez contre la fracture numerique)

7 réponses

1 2
Avatar
Stephane Dupille
Je connaissais xargs mais je pensais xargs lançait la commande pour
chaque argument. Une vérification avec strace confirme ça.


Non, xargs va concaténer chaque ligne de son entrée standard, pour
tout mettre en argument de la commande. Il va tout remplir au maximum
la ligne de commande, pour éviter que cela ne dépasse.

Si on veut la commande pour chaque argument, il vaut mieux faire une
boucle while ou for dans le shell.

Mais bon, pour vérifier, il y a mieux que strace... le man !

Je me demandais comment xargs faisait ce miracle et je suppose qu'il
lance N fois la commande en argument, avec N = <longueur totale des
arguments> modulo <longueur maxi de la ligne de commande>.


Oui, en quelque sorte.

Je m'endormirais moins bête ce soir.


:)

--
Oh que non, je ne suis pas juriste. Mais j'aimerais bien voir la tête
du magistrat si Jean Dupont se pointe pour porter plainte avec le print
d'un post de "Colargol" intitulé "Bozo Le Clown est une raclure"
-+- GS in <http://www.le-gnu.net> + Du rififi chez les neuneux -+-

Avatar
TiChou
Dans le message <news:,
*Rakotomandimby (R12y) Mihamina* tapota sur f.c.o.unix :

Bonjour,


Salut Mihamina,

Pour avoir une idée de la masse de travail qui m'attend, je voudrai faire
un 'grep $OLD_IP /**/*' et ainsi savoir combien de fichiers contiennent
l'ancienne IP et ainsi commencer l'assignation des priorités d'édition.


Te connaissant, j'imagine que tu es sous Linux et que donc tu as à ta
disposition les outils GNU. Je te propose alors la solution suivante :

$ grep -rl -D skip "$OLD_IP" /etc

ou qui sera plus rapide et efficace :

$ find /etc -xdev -type f -print0 | xargs -0r grep -l "$OLD_IP"

Merci d'avance.


De rien.

--
TiChou

Avatar
Manu
Stephane Dupille wrote:

Mais bon, pour vérifier, il y a mieux que strace... le man !


Je ne trouve pas justement. Enfin sous Linux (en anglais comme en
français) le man n'est pas clair. On commence un peu à comprendre quand
on regarde certaines options.
Et le principal interet (je trouve) qui est ce gain en performance n'est
pas mentioné.

Donc maintenant que j'ai bien lu le man je proposerais plutot:

find / -type f -print0 | xargs -0 grep -H $IP

:)

Avatar
Stephane Dupille
Mais bon, pour vérifier, il y a mieux que strace... le man !
Je ne trouve pas justement. Enfin sous Linux (en anglais comme en

français) le man n'est pas clair. On commence un peu à comprendre quand
on regarde certaines options.


Mauvais man, changer man.

~> man xargs
[...]
The xargs utility reads space, tab, newline and end-of-file delimited
strings from the standard input and executes utility with the strings as
arguments.

Any arguments specified on the command line are given to utility upon
each invocation, followed by some number of the arguments read from the
standard input of xargs. The utility is repeatedly executed until stan-
dard input is exhausted.
[...]

Moi, ça me parait clair (même si pas immédiat).

La version que j'ai sur mon cygwin (qui est la version GNU) est
nettement moins claire. Mais avec les gnuteries, c'est pas bien
étonnant... ;-)

Et le principal interet (je trouve) qui est ce gain en performance n'est
pas mentioné.


Ben non. Forcément.

Donc maintenant que j'ai bien lu le man je proposerais plutot:
find / -type f -print0 | xargs -0 grep -H $IP


Oui, si on possède la version GNU de find :
~> man find | egrep -- -print0
~>

--
Ma femme a appris sur une 400 four que je revends également si ça
t'intéresse. C'est pas trop puissant et tu as une position bien droite.
Même elle qui est couillonne comme pas deux s'est bien amusée deçu.
-+- OW in http://www.le-gnu.net : Gai gai, marions nous -+-


Avatar
Laurent Wacrenier
Manu écrit:
Je connaissais xargs mais je pensais xargs lançait la commande pour
chaque argument. Une vérification avec strace confirme ça.
Je me demandais comment xargs faisait ce miracle et je suppose qu'il
lance N fois la commande en argument, avec N = <longueur totale des
arguments> modulo <longueur maxi de la ligne de commande>.


Plutôt :

The
xargs utility shall limit the command line length such that when the
command line is invoked, the combined argument and environment lists
(see the exec family of functions in the System Interfaces volume of
IEEE Std 1003.1-2001) shall not exceed {ARG_MAX}-2048 bytes. Within
this constraint, if neither the -n nor the -s option is specified,
the default command line length shall be at least {LINE_MAX}.

À part ça, tout le monde fait ce qu'il veut.

Avatar
Laurent Wacrenier
Manu écrit:
Je ne trouve pas justement. Enfin sous Linux (en anglais comme en
français) le man n'est pas clair. On commence un peu à comprendre quand
on regarde certaines options.


On commence à comprendre quand on sait à quoi ça sert, ce que le
manuel en général n'indique pas.

Avatar
Rakotomandimby (R12y) Mihamina
Thomas :
par curiosité, pourquoi il y a l'ip du serveur lui meme dans les fichiers
de config ?


Il y a plusieurs interfaces réseau sur le serveur, et il est inutile que
certain serveur logiciels écoutent sur les interfaces qui ne les
concernent pas. Typiquement, le serveur de mail ne transfert les mail que
si ils arrivent sur une IP et non l'autre.

Pareil pour apache et le FTP, on peut avoir à mettre en oeuvre du Virtual
hosting basé sur les IP. Il faut donc mentionner à quel VHost correspond
une IP.

Un cas flagrant est BIND. Le serveur est le DNS de quelques dizaines de
domaines, qui sont eux-mêmes hébergé sur ce serveur. Il a fallu changer
les IPs aussi.

il n'est pas fait pour pouvoir repondre de la
meme maniere quelle que
soit l'ip qui lui est attribuée ?


Oui, mais comme je viens d'expliquer, non. :-)

--
Miroir de logiciels libres http://www.etud-orleans.fr
Développement de logiciels libres http://aspo.rktmb.org/activites/developpement
Infogerance de serveur dédié http://aspo.rktmb.org/activites/infogerance
(En louant les services de l'ASPO vous luttez contre la fracture numerique)

1 2