Comment effectuer une commande Ssi grep renvoie 1 seule ligne ?

Résolu
Julosdu13 Messages postés 3 Statut Membre -  
Julosdu13 Messages postés 3 Statut Membre -
Bonjour,

Je souhaite traiter des fichiers et recuperer des zones de textes particulieres de mon fichier pour ensuite les concatener sur une ligne dans un nouveau fichier, le probleme c est que des fois mon grep renvoir plusieurs lignes et donc ca ne marche pas.
Je voudrais donc rajouter une condition dans ma boucle du type if le nombre de ligne renvoye par grep est superieur a 1 alors faire autre chose...
Voici mon script

#!/bin/bash

currdir=`pwd`
echo "$currdir"| cut -f 8 -d '/' >> CS.file

ligands=`ls -d *`
for lig in $ligands;
do
cd $lig
if [ -f so1h-$lig.out ];
then
echo "$lig" >> ../CS.file
var=$(grep "NMR Sh" so1h-$lig.out| cut -c56-| grep "H"| grep "-")
sed -i 's/'"$lig"'/& '"$var"'/g' ../CS.file

else
echo "$lig" >> ../CS.file
sed -i 's/'"$lig"'/& NO RESULTS FOR '"$lig"'/g' ../CS.file

fi
cd ..
done

Merci beaucoup d avance :)

2 réponses

  1. UnGars
     
    Salut,

    man grep :

           -m NUM, --max-count=NUM
    Stop reading a file after NUM matching lines.


    Sinon, concernant :
    currdir=`pwd`
    echo "$currdir"| cut -f 8 -d '/'

    Il y a plus simple :
     basename  ${PWD}


    ;-))
    0
  2. Julosdu13 Messages postés 3 Statut Membre
     
    Hello merci pour cettte reponse !

    Le truc c est que je ne veux pas forcement lire seulement la premiere ligne, je voudrai pouvoir trier les lignes si jamais le grep m'en renvoie plus d'une.

    Du coup je voudrai une boucle if avec comme condition si le grep renvoie une ligne alors je continue mon scrpit normalement sinon je lui rajoute d autres commandes :)
    0
    1. UnGars
       
      Dans ce cas tu testes avec un
      grep -c 'motif'
      :

      $ cat fich
      1 bla bla
      2 bla bli bla
      3 bla blu blo
      4 bli bla
      5 bly ble bla bli
      6 bla bla bla
      7 bla bla
      8 bla bli blu
      9 bla blu

      $ if [ $(grep -c 'blo' fich) = 1 ]; then echo "Good"; else echo "Bad";fi
      Good

      $ if [ $(grep -c 'bli' fich) = 1 ]; then echo "Good"; else echo "Bad";fi
      Bad
      0
      1. Julosdu13 Messages postés 3 Statut Membre > UnGars
         
        la bombe !

        Merci 1Gars !

        :D
        0
    2. Utilisateur anonyme
       
      salut,

      si tu veux appeler les sous-répertoires du répertoire en cours dans une boucle
      for
      , la commande
      ls
      , qui est toujours mauvaise dans un script, est fausse, et inutile :
      for dir in ./*/
      do
      echo "$dir est un répertoire, pas besoin de faire de test"
      done


      autre chose : utiliser des chemins relatifs (le répertoire courant, par exemple) n'est pas une bonne idée àmha, car un script peut être exécuté de n'importe où.

      pour compter le nombre de lignes comportant un motif, il y a
      wc -l
      , ou l'option
      -c
      de
      grep
      (i lfaut lire les pages man !)
      donc, quelque chose comme :
      nbL=$(grep -c 'motif' fichier)
      if test $nbL -gt 1
      then
      commandes "normales"
      elif test $nbL -gt 1
      autres commandes
      fi
      0