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

  1. #1
    Membre habitué 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
    Points : 136
    Points
    136
    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 éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    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
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    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
    Cordialement.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 984
    Points
    30 984
    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 éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    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
    Cordialement.

  8. #8
    Membre habitué 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
    Points : 136
    Points
    136
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses, ça ma beaucoup aidé.

    Salutations.

+ 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