Comment effectuer une commande Ssi grep renvoie 1 seule ligne ?

Résolu/Fermé
Julosdu13 Messages postés 3 Date d'inscription jeudi 24 mars 2016 Statut Membre Dernière intervention 24 mars 2016 - 24 mars 2016 à 13:50
Julosdu13 Messages postés 3 Date d'inscription jeudi 24 mars 2016 Statut Membre Dernière intervention 24 mars 2016 - 24 mars 2016 à 15:07
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 :)
A voir également:

2 réponses

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
Julosdu13 Messages postés 3 Date d'inscription jeudi 24 mars 2016 Statut Membre Dernière intervention 24 mars 2016
24 mars 2016 à 14:48
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
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
Julosdu13 Messages postés 3 Date d'inscription jeudi 24 mars 2016 Statut Membre Dernière intervention 24 mars 2016 > UnGars
24 mars 2016 à 15:07
la bombe !

Merci 1Gars !

:D
0
Utilisateur anonyme
24 mars 2016 à 15:06
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