Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Un petit coup de main pour la commande find svp


Messages recommandés

Posté(e)

Salut j'ai quelques petits problèmes avec la commande find.

 

1) Je dois rechercher dans tous les fichiers de tous utilisateurs. Je me demande justement dans quel répertoire sont contenus les fichiers personnels des utilisateurs (donc pas ceux de configuration mais bien les documents des utilisateurs). Je pense que je dois pointer etc/home mais je suis pas sur,...

 

 

2)On me donne un fichier avec la structure suivante :

 

N-Dubois:P-Alexandre:C-NT:R-15

 

Je dois écrire la ligne de commandes permettant de lister sur la sortie standard le prénom, le nom et les cours des étudiant ayant un résultat = 12.

 

Là je vois pas comment cibler le critère de recherche qui est R (celui le plus à droite), peut être est-ce *:*:12 mais j'en doute fort...

et ensuite afficher nom et prénom... dois-je ajouter un paramètre à -print ?

 

Pourriez-vous me donner la commande que je dois taper en expliquant en 2 mots comment vous faites...

 

Merci de votre aide

 

Nico

Posté(e)

La fonction find je l'utilise comme ca moi:

find . -name *.c -exec grep cequejecherche {} ; -print

je ne sais pas si ca va t'aider

Posté(e)

Salut Florent :P

Ok, on peut l'utiliser de cette manière ou en utilisant un pipe plutôt que le -exec.

 

Sinon concernant mes 2 problèmes ça ne m'avance pas beaucoup mais je te remercie quand même d'avoir essayé :-P

 

Donc je suis toujours ouvert à vos propositions... :-(

 

Nico

Posté(e)

Tiens, je m'appelle florent maintenant :P

Allez :-( un coup et tu verras la vie autrement :-P

Posté(e)
Salut j'ai quelques petits problèmes avec la commande find.

 

1) Je dois rechercher dans tous les fichiers de  tous utilisateurs. Je me demande justement dans quel répertoire sont contenus les fichiers personnels des utilisateurs (donc pas ceux de configuration mais bien les documents des utilisateurs). Je pense que je dois pointer etc/home mais je suis pas sur,...

 

 

2)On me donne un fichier avec la structure suivante :

 

N-Dubois:P-Alexandre:C-NT:R-15

 

Je dois écrire la ligne de commandes permettant de lister sur la sortie standard le prénom, le nom et les cours des étudiant ayant un résultat = 12.

 

Là je vois pas comment cibler le critère de recherche qui est R (celui le plus à droite), peut être est-ce *:*:12 mais j'en doute fort...

et ensuite afficher nom et prénom... dois-je ajouter un paramètre à -print ?

 

Pourriez-vous me donner la commande que je dois taper en expliquant en 2 mots comment vous faites...

 

Merci de votre aide

 

Nico

Tu serais pas en train de nous refourguer un TP que t'as à faire pour un de ces jours, par hasard ??

Posté(e)

Bon, allez... je vais être sympa :

 

1) en général c'est dans /home (sur une slackware en tout cas), des fois c'est dans /var/home (sous AIX en tout cas), mais si tu cherches tous les répertoires "home" des gens c'est ~* qui te sera d'une plus grande utilité...

 

2) Tu veux une ligne de commande simple, ou un script awk ?

Avec cut, ca donne cat tonfichier | grep ":R-12$" | cut -d: -f2 | cut -d- -f2

Avec sed, ca doit donner un truc du style cat tonfichier | grep ":R-12$" | sed -e "s/^[^:]*:P-([^:]*):/1/"

Avec awk, je sais plus, mais si vraiment tu la veux, je peux refaire un effort...

 

Ah mince, après relecture, il semblerait que tu veuilles nom + prénom (et pas juste prénom), soit...

Avec sed, ca donne cat tonfichier | grep ":R-12$" | sed -e "s/^N-([^:]*):P-([^:]*)/1 2/"

 

Une explication en deux mots ?

- Tu gardes que les lignes avec le résultat 12 (le grep)

- Tu chopes prénom et nom avec sed (lire la page man de sed)

Posté(e)

Merci beaucoup Kewlcat !

 

C'était bien une ligne de commande simple qu'il me fallait :-(

 

En fait, le prof nous a donné des questions d'exam qu'il a fait l'année dernière, et j'essaye de m'entraîner à y répondre même si on a pas encore vu toute la matière spécifique à ces questions.

 

C'est pas mon genre de refourguer des TP car sur le moment c'est relax mais après t'as la'air fin devant ta feuille d'exam quand t'es pas capable de répondre...

 

J'en profite pour poser encore une question, y a une question concernant les variables d'environnement, je pensais que je devais expliquer le commande export (ou setenv sur les c-shell) mais le prof m'as dit que ça avait rapport avec back quote (`)... en regardant sur le net, j'ai appris qu'on se servait des back quote pour donner une priorité à une commande mais je n'ai vu aucun rapport avec les variable d'environnement personne n'as une idée ?

 

Merci :P

 

Nico

Posté(e)

Avec sed, ca donne cat tonfichier | grep ":R-12$" | sed -e "s/^N-([^:]*):P-([^:]*)/12/"

 

Dans la sed :

 

- ([^:]*) , le ^ signifie signifie n'importe quels caractères avant le : (enfin dit moi si je me trompe...) et pour * je vois pas trop, ça voudrait peut être dire que c'est pour toute les lignes renvoyée par grep sinon il ne ferait que la première ?

 

- /12/ : Ca sert à quoi ?

 

- Dans le cas ou j'aurais eu besoin par exemple du 1er champ et du troisième, (pour me renvoyer N-Dubois et C-NT) aurais-je pu taper ça ?

cat monfichier | grep ":R-12$" | sed -e "s/^N-([^:]*):C-([^:]*)/12/"

 

Excuse moi de t'embêter avec mes problème mais je tient à bien comprendre la chose...

 

Merci

 

Nico

Posté(e)

Dans la commande s de sed, la première partie (entre les deux premiers /) correspond à la chaine recherchée, la seconde partie donne la chaine de sortie (celle par laquelle on doit remplacer la chaine recherchée, une fois trouvée).

 

Explication en plus que deux mots (mini-cours sur les expressions régulières) :

 

le ^ signifie "début de ligne"

le $ signifie "fin de ligne"

donc si tu recherches "^$" ca te filera toutes les lignes vides

pour "toto.$" c'est les lignes qui se terminent par "toto."

etc.

 

les [abcd] signifient "un caractère qui peut être 'a' ou 'b' ou 'c' ou 'd'"

les [^o] signifient "un caractère quelconque MAIS SURTOUT PAS 'o'"

 

ensuite tu peux rajouter * derrière une expression pour dire "un nombre indeterminé de fois [cette expression]"

 

donc, chercher "N-[^:]*:" revient à faire une recherche sur une chaine commençant par "N-" puis contenant un nombre indéterminé de fois un caractère quelconque mais pas ':' puis un caractère ':'

 

le fait de placer une portion entre ( et ) dans une regexp (euh "expression régulière") signifie que l'on veut "marquer" cette portion.

 

dans mon premier post je me suis gourré en indiquant N-([^:]*): il fallait écrire N-([^:]*): (en effet, le fait de ne pas "échapper" les parenthèses revient à chercher le caractère parenthèse ouvrante ou parenthèse fermante, au lieu de marquer la portion !!)

 

Une fois marquée, une portion peut être rappelée par son numéro, précédé d'un pour qu'on ne confonde pas avec le caractère du même nom (même principe que les parenthèses dans la partie recherche)

 

exemple avec un truc qui fait comme cut -d: -f3 :

sed -e "s/[^:]*:[^:]*:([^:]*):.*/1/"

en plus correct (juste histoire de retrouver le "3"), on peut faire

sed -e "s/([^:]*):([^:]*):([^:]*):.*/3/"

 

dans mon post, j'avais aussi oublié de rajouter .* à la fin de la chaine recherchée, pour indiquer qu'on voulait aussi remplacer jusqu'à la fin de la ligne.

ici, le . représente n'importe quel caractère, et le * toujours pareil (voir plus haut)

 

 

Pour résumer :

 

[^:] c'est n'importe quel caractère mais pas ':'

[^:]* c'est une suite de caractères dont aucun n'est un ':'

([^:]*) on marque cette suite de caractères, c'est celle qu'on veut afficher !

N-([^:]*): on fait savoir que la portion qui nous interesse est comprise entre "N-" et un ':' (ici le nom)

 

sed sert à remplacer du texte ligne par ligne, si tu veux éviter les trucs qui trainent, il te faut une regexp qui corresponde à toute ta ligne !

dans ton cas, c'est ^N-[^:]*:P-[^:]*:C-[^:]*:R-.*$

mais si on veut récupérer des "arguments" de cette ligne il faut utiliser ^N-([^:]*):P-([^:]*):C-([^:]*):R-(.*)$ qui nous donnera 1 le nom, 2 le prénom, 3 le cours et 4 la note

 

Voilà...

Rejoindre la conversation

Vous publiez en tant qu’invité. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...