IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Commande grep bloc d'informations


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de rufa11
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    300
    Détails du profil
    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 300
    Par défaut Commande grep bloc d'informations
    Bonjour,

    SVP je cherche une commande ou une option de recherche dans un fichier, par exemple:

    le output de la commande lshw dans un fichier test.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    *-storage
    				description: RAID bus controller
    				product: 82801 SATA RAID Controller
    				vendor: Intel Corporation
    				physical id: 1f.2
    				bus info: pci@0000:00:1f.2
    				logical name: scsi0
    				logical name: scsi1
    				logical name: scsi5
    				version: 02
    				width: 32 bits
    				clock: 66MHz
    				capabilities: storage msi pm bus_master cap_list emulated
    				configuration: driver=ahci latency=0 module=ahci
    				*-disk:0
    				description: ATA Disk
    				product: Hitachi HDT72502
    				vendor: Hitachi
    				physical id: 0
    				bus info: scsi@0:0.0.0
    				logical name: /dev/sda
    				version: V5DO
    				serial: XXXX
    				size: 232GiB (250GB)
    				capabilities: partitioned partitioned:dos
    				configuration: ansiversion=5 signature=88000000
    				*-volume:0
    						description: EXT3 volume
    						vendor: Linux
    						physical id: 1
    						bus info: scsi@0:0.0.0,1
    						logical name: /dev/sda1
    						logical name: /
    						version: 1.0
    						serial: XXXX
    						size: 13GiB
    						capacity: 13GiB
    						capabilities: primary bootable journaled extended_attributes large_files huge_files recover ext3 ext2 initialized
    						configuration: created=2008-09-21 12:24:55 filesystem=ext3 label=linux modified=2009-05-05 20:40:27 mount.fstype=ext3 mount.options=rw,errors=remount-ro,data=ordered mounted=2009-05-05 20:31:11 state=mounted
    				*-volume:1
    						description: Linux swap volume
    						physical id: 2
    						bus info: scsi@0:0.0.0,2
    						logical name: /dev/sda2
    						version: 1
    						size: 956MiB
    						capacity: 956MiB
    						capabilities: primary nofs swap initialized
    						configuration: filesystem=swap pagesize=4096
    				*-volume:2
    						description: EXT3 volume
    						vendor: Linux
    						physical id: 3
    						bus info: scsi@0:0.0.0,3
    						logical name: /dev/sda3
    						logical name: /home
    						version: 1.0
    						serial: XXXX
    						size: 217GiB
    						capacity: 217GiB
    						capabilities: primary journaled extended_attributes large_files huge_files recover ext3 ext2 initialized
    						configuration: created=2008-09-21 12:25:
    Ce que je veux c'est arriver a *-volume:0 ensuitre entrer dans le sous bloc pour arriver apres a Serial.

    Merci.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,
    Un exemple sous sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n -e '/\*-volume:0/,/serial/{/serial/p;}' fichier.txt

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour,

    Il est intéressant de noter que tous les volumes n'ont pas un numéro de série. Si on remplace *-volume:0 par *-volume:1 , la commande va renvoyer le serial de *-volume:2 sans sourciller.

    Et si on nettoyait le fichier en supprimant les volumes sans serial d'abord ?

    Après, on pourrait faire un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ sed -n '/volume/{:z;N;/serial/!bz;s/\n.*serial/ serial/p}' /tmp/test.txt
                                    *-volume:0 serial: XXXX
                                    *-volume:2 serial: XXXX

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bien vu

    Voici une version corrigée avec un petit aménagement pour suivre l'exemple de ton affichage (mais ici, je ne traite que le bloc concerné):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed -n -e '/\*-volume:0/,/\*-volume/{s/serial/\*-volume:0 &/p;}' fic.txt 
    						*-volume:0 serial: XXXX
    $ sed -n -e '/\*-volume:1/,/\*-volume/{s/serial/\*-volume:1 &/p;}' fic.txt 
    $ sed -n -e '/\*-volume:2/,/\*-volume/{s/serial/\*-volume:2 &/p;}' fic.txt 
    						*-volume:2 serial: XXXX

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Juste pour l'exemple, une version awk
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
     
    awk -v find=$1 '{
    	if (match($0, "-volume:"))
    		flag=$1 == "*-"find ?1: 0;
    	if (flag && $1 == "serial:") printf("%s: %s\n", find, $0)
    }' $2

    Ce qui ne m'empêche pas de rester admiratif sur la version sed de disedorgue
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Puisqu'on parle de la variété des outils, on peut proposer grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ grep "\*-volume\|serial" /tmp/test.txt 
    				serial: XXXX
    				*-volume:0
    						serial: XXXX
    				*-volume:1
    				*-volume:2
    						serial: XXXX

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bon, pour le fun, voici 2 versions:

    Awk (ressemble beaucoup à ma version sed ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ awk '/\*-volume:0/,/\*-volume:[^0]/{X=sub(/serial/,"*-volume:0 &")}X' fic.txt 
    						*-volume:0 serial: XXXX
    Et une version Builtin bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ while read line; do [[ $line =~ "*-volume:" ]] && X=$line ; [[ $line =~ "serial" ]] && [[ $X =~ "*-volume:0" ]] && echo  $X $line && break; done <fic.txt 
    *-volume:0 serial: XXXX

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [shell] commande grep
    Par scolopendra dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 01/10/2008, 15h39
  2. Aide sur la commande GREP
    Par roadruner dans le forum Linux
    Réponses: 6
    Dernier message: 30/07/2007, 19h43
  3. utiliser commande grep
    Par salim81 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 01/07/2007, 21h52
  4. Le temps que la commande "grep" en shell prend
    Par Pauli dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 25/12/2006, 19h59
  5. Commande Grep
    Par zalett dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 20/03/2006, 23h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo