|script bash]aide commande unix

salut tout le monde, j'aimerais avoir de l'aide concernant les commandes possibles sous Unix.

En gros, je fais une recherche dans un fichier avec grep et je voudrais afficher la première concordance qu'il trouve, ensuite afficher que la deuxième concordance etc...

et je voudrais savoir si c'est possible avec la commande grep et une boucle for ou si il y a plus simple en utilisant une autre commande.

Merci d'avance

25 réponses

Résumé de la discussion

Le problème porte sur l'utilisation de grep sous Unix pour afficher successivement la première, puis la deuxième et les concordances suivantes d'un motif dans un fichier. Several solutions ont été proposées, notamment une boucle for ou une boucle while associée à une substitution de processus, afin d’aligner l’affichage des occurrences dans l’ordre et sans écraser les lignes. D'autres propositions utilisent grep avec des remplacements de champ, parcours des résultats via IFS, ou des outils comme sed ou awk pour isoler chaque ligne concordante et numéroter les occurrences. En cas de difficultés liées au fait que les lignes ne se présentent pas sur une seule ligne, il est conseillé d’ajuster la gestion des entrées et d’éviter les conversions risquées.

Bobot (l’IA à votre service)
  1. Modérateur
    Salut,

    Essaie comme ça :
    #! /bin/bash
    
    nb=0
    while read ligne
    do
    (( nb = $nb + 1 ))
    echo "Occurence n°$nb :" $ligne
    done < <(grep  'PA Bay [0-9]* Information:' test.txt)
    Sinon si tu veux garder la solution de FullVolant :
    OLD_IFS=$IFS
    IFS=$'\n'
    nb=0
    for ligne in `grep 'PA Bay [0-9]* Information:' test.txt`
    do
    (( nb = $nb + 1 ))
    echo "Occurence n°$nb :" $ligne
    done
    IFS=$OLD_IFS
    ;-))
    1. Bonjour,

      La commande grep est très bien pour cela et avec un for, il ne devrait pas y avoir de soucis:
      nb=0
      for ligne in `grep toto /tmp/fic01.txt`
      do
      (( nb = $nb + 1 ))
      echo "Occurence n°$nb :" $ ligne
      done

      Poste à nouveau si problème.
      Bon scripting.
      1. merci de ta réponse mais j'ai encore un souci, voila ce que ce lame fait avec ton script :

        nb=0
        for ligne in `grep 'PA Bay [0-9]* Information:' test.txt`
        do
        (( nb = $nb + 1 ))
        echo "Occurence n°$nb :" $ligne
        done

        et le truk c 'est que ça m'affiche une occurrence dès qu'il trouve PA ensuite Bay etc..., hors moi je veux k'il m'affiche "Occurence n°1 : " lorsqu'il trouve un ligne qui contient "PA Bay 0 Information" par exemple et ainsi de suite.
        1. je te remercie beaucoup de ta réponse jipicy car ça fonctionne très bien mais par contre je ne comprends les lignes que tu as rajouté au programme de fullvolant. Tu voudrais bien m'expliquer à quoi elle sert exactement?

          je vous remercie mais je pense que j'aurai encore d'autre questions d'ici peu de temps.lol
          1. Modérateur
            Alors la variable pédéfinie du shell "IFS" (Input Field Separator) contient le caractère séparateur de champs en entrée qui par défaut est l'espace (ou tabulation).

            Donc il suffit de changer ce séparateur de champs en fonction du format qu'on veut traiter en entrée.

            Dans ton cas tu veux analyser des lignes, donc séparées par un saut de ligne (\n). Il suffit d'initialiser la variable $IFS avec la représentation du caractère de saut de ligne sous les systèmes UNIX, à savoir (\n)...

            ;-))
            1. bon, me revoila comme je l'avais dit.

              et donc j'aimerais savoir si c'est possible et comment, lorsque l'on fait une recherche dans un fichier pour afficher le texte qui se trouve entre deux chaines de caractères.

              Merci
              1. Modérateur
                Re-

                Il faudrait savoir si le texte à afficher se trouve sur la même ligne que les chaînes de caractères elles même ou non...
                1. ben non le texte n'est pas sur la mm ligne.

                  en gros on a :

                  chaines 1
                  ...
                  ....
                  ....
                  ....

                  chaines 2

                  et donc j'aimerais afficher ce qu'il y a entre les deux chaines 1 et 2
                  1. Je te propose de parcourir toutes les lignes du fichier et d'utiliser des variables.
                    Initialisation de 2 variables à 0.
                    Lorsque tu rencontres chaine1, tu valorises la première variable à 1.
                    Lorsque tu rencontres chaine2, tu valorises la seconde variable à 1.
                    Tant que variable 1=1 et variable 2!=1, affichage des lignes du fichier.

                    Dans ce cas, la méthode de parcour du fichier de jipicy parait la plus appropriée:

                    var1=0
                    var2=0
                    while read ligne
                    do
                    if echo $ligne|grep "chaine1" > /dev/null
                    then
                    var1=1
                    fi
                    if echo $ligne|grep "chaine2" > /dev/null
                    then
                    var2=1
                    fi

                    if [ "$var1" == "0" ] && [ "$var2" == "0" ]
                    then
                    echo $ligne
                    fi

                    done < test.txt
                    1. merki de vos réponses, mais fullvolant t'as solution ne renvoie rien a l'écran. je ne vois pas ce qui déconne..
                      1. bon j'ai une autre petite question cette fois-ci concernant la commande if :

                        voici mon code :

                        i=0
                        nb=`grep -c 'Slot [0-9]*:' tests.txt`
                        if (( $i < $nb )) ;
                        then
                        echo "Slot $i:"
                        sed -n '/Slot '$i':/,/Boot log begin--/p' tests.txt > retest.txt
                        (( i = $i + 1 ))
                        echo $i
                        fi

                        et j'ai un prb, c'est que ce code n'execute qu'une seule fois l'instruction if, je voudrais que l'instruction if soit execute tant que i est inférieur a nb.

                        en espérant que quelqu'un pourra m'aider
                        1. Modérateur
                          i=0
                          nb=$(grep -c 'Slot [0-9]*:' tests.txt)
                          
                          while [ "$i" -lt "$nb" ]
                          do
                          echo "Slot $i:"
                          sed -n '/Slot '$i':/,/Boot log begin--/p' tests.txt > retest.txt
                          (( i = $i + 1 ))
                          echo $i
                          done
                          ;-))
                          1. je te remercie beaucoup jipicy, mais maintenant j'ai encore un autre problème, je voudrais tester si une variable contient quelque chose, donc j'ai essayé ça :

                            if [ -n $variable ];
                            then
                            ...
                            fi

                            mai ça ne fonctionne pas, je comprends pas pourquoi
                            1. Modérateur
                              Que te dire... affiche ton code et tes tests...
                              [jp@MDK tmpfs]$ A="Bonjour" ; echo $A
                              
                              Bonjour
                              
                              [jp@MDK tmpfs]$ if [ -n "$A" ] ; then echo "Ok" ; else echo "Variable vide :-(" ; fi
                              
                              Ok
                              
                              [jp@MDK tmpfs]$ unset A
                              
                              [jp@MDK tmpfs]$ if [ -n "$A" ] ; then echo "Ok" ; else echo "Variable vide :-(" ; fi
                              
                              Variable vide :-(
                              
                              [jp@MDK tmpfs]$
                              ;-))
                              1. je te remercie de ton aide mais en fin de compte c'étai une faute toute bête, j'avais juste oublié de mettre les "" autour de la variable.

                                Merci
                                1. bon me revoila une fois de plus, mais par contre la je ne suis pas sur que la question seras dans le bon forum.

                                  Donc deja j'ai un programme bash ou il y a des variables et je voudrais savoir si il y a possiblités d'exporter ces variables dans un fichier php ou à partir du fichier php importer les variables qui sont dans le programme bash. Ce qui me permettra ensuite de les afficher notamment sur une page.

                                  Merci d'avance
                                  1. donc personne peut m'aider?? ou a la limite me renvoyer vers un site ou je pourrais trouver la réponse..

                                    SVP
                                    1. Modérateur
                                      Salut,,

                                      je ne suis pas sur de bien comprendre ce que tu veux

                                      tu peux toujours parser le script bash avec php et récuperer ce que tu as besoin dans des variables php
                                      c'est ça que tu veux?
                                      1. euh je ne comprends pas ton termes "parser" mais en gros ouai c'est ce que je veux faire. Je veux récupérer la valeur des variables qui sont initialisé dans le script bash dans celui en php.

                                        voili voilou
                                        • 1
                                        • 2