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 :

Supprimer les 2 lignes précédentes et la suivante


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut Supprimer les 2 lignes précédentes et la suivante
    Bonjour,
    J'aurais besoin de vos lumières.
    J'essaye de supprimer une série de 4 lignes consécutives. J'arrive bien à "greper" ce que que je veux mais je n'arrive pas à enchaîner par une suppression.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    grep -B2 -A1 test multipath.test
            multipath {
                             wwid           3500122204b
                             alias          test
            }
            multipath {
                             wwid           350002ac104b
                             alias          test_vg_vr
            }
    J'ai essayé de combiner avec l'option "-v" mais ça donne n'importe quoi.
    Pourriez-vous m'aider ?

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ra:/local/iso$ cat toto
    multipath {
    wwid 3500122204b
    alias test
    }
    multipath {
    wwid 350002ac104b
    alias test_vg_vr
    }
    ra:/local/iso$ sed 'N;N;N;N; /test/ d' toto
    wwid 350002ac104b
    alias test_vg_vr
    }
    là j'ai merdé en conservant 3 lignes au lieu de 4 mais c'est le principe

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Quelle est la condition précise de ta suppression ?
    Tu cherches à supprimer un ensemble de lignes précises (commençant par "multipath {" et finissant par "}") si et seulement si elles contiennent le motif "test" ?

    Peut être (et sûrement) que grep n'est pas l'outil idéal

  4. #4
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Merci frp31 mais j'avoue ne pas comprendre ta solution...
    Idéalement, le but sera de lancer un script avec en paramètre le pattern du grep (ou sed). Ensuite, je cherche à supprimer cette ligne, les deux précédentes et la suivante dans /etc/multipath.conf.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Re-

    Contenu du fichier :
    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
    $ cat plop
    multipath {
    wwid 3500122204b
    alias test1
    }
    multipath {
    wwid 350002ac104b
    alias test_vg_vr
    }
    multipath {
    wwid 3500122204b
    alias test1
    }
    multipath {
    wwid 350002ac104b
    alias test_vg_vr
    }
    On cherche le motif "test1" et on élimine tout le contenu du multipath contenu entre accolade :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ sed '/multipath {$/{:z;N;/}$/!bz;/test1/d}' plop 
    multipath {
    wwid 350002ac104b
    alias test_vg_vr
    }
    multipath {
    wwid 350002ac104b
    alias test_vg_vr
    }
     
    $

  6. #6
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Vraiment top ta commande zipe31 !!!
    Je vais essayer de la comprendre maintenant...
    Merci beaucoup !

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    /multipath {$/
    Motif de recherche contenant le terme "mutipath" et se terminant ($) par une accolade ouvrante.

    {
    Début du regroupement de commandes. Si le motif est trouvé, les commandes se trouvant entre les accolades seront exécutées.

    :z
    Étiquette. Permet d'effectuer une boucle.

    N
    On ajoute la ligne suivante dans l'espace de travail.

    /}$/!bz
    Si la nouvelle ligne ajoutée ne comprends pas (le caractère "!" signifie la négation) le motif "/}$/" (une accolade fermante en fin de ligne), on se branche (commande "b") à l'étiquette "z"préalablement définie, et ce autant de fois que nécessaire.

    /test1/d
    Une fois la ligne avec le motif "}" trouvée, on teste si l'ensemble des lignes contient le motif "test1", et si c'est le cas on supprime (commande "d") le tout.

    }
    Fin du regroupement de commandes.

  8. #8
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Sans l'explication, ça ne valait pas grand chose pour moi.
    Merci beaucoup !!! Clair, net et précis.

  9. #9
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    En fait c'est pas tout à fait résolu.
    Je m'explique. Quand je le fais sur un fichier de test, cela fonctionne très bien mais quand j'essaye de l'appliquer au vrai fichier (/etc/multipath.conf) le sed ne fonctionne pas...
    J'ai fait quelques tests. Si je fais "cp /etc/multipath.conf /etc/multipath_test.conf" et que j'applique le sed au fichier test, cela ne fonctionne pas.
    En revanche, lorsque je fais un "cat" de /etc/multipath.conf, que je sélectionne manuellement le contenu du fichier et que je le colle dans un fichier de test, le sed fonctionne sur ce fichier de test...
    Les droits ne sont pas en cause.
    Auriez-vous une idée de la provenance du problème ?
    Une question de format ?

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Affiche le résultat de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat -A /etc/multipath.conf

  11. #11
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    [468][root@pl123:tools]# cat -A /etc/multipath.conf
    # This is a basic configuration file with some examples, for device mapper$
    # multipath.$
    # For a complete list of the default configuration values, see$
    # /usr/share/doc/device-mapper-multipath-0.4.7/multipath.conf.defaults$
    # For a list of configuration options with descriptions, see$
    # /usr/share/doc/device-mapper-multipath-0.4.7/multipath.conf.annotated$
    $
    $
    # Blacklist all devices by default. Remove this to enable multipathing$
    # on the default devices. $
    #blacklist {$
    #        devnode "*"$
    #}$
    $
    ## By default, devices with vendor = "IBM" and product = "S/390.*" are$
    ## blacklisted. To enable mulitpathing on these devies, uncomment the$
    ## following lines.$
    #blacklist_exceptions {$
    #^Idevice {$
    #^I^Ivendor^I"IBM"$
    #^I^Iproduct^I"S/390.*"$
    #^I}$
    #}$
    $
    ## Use user friendly names, instead of using WWIDs as names.$
    #defaults {$
    #^Iuser_friendly_names yes$
    #}$
    ##$
    ## Here is an example of how to configure some standard options.$
    ##$
    #$
    defaults {$
    ^Iudev_dir^I^I/dev$
    ^Ipolling_interval ^I5$
    ^Iselector^I^I"round-robin 0"$
    ^Ipath_grouping_policy^Imultibus$
    ^Igetuid_callout^I^I"/sbin/scsi_id -g -u -s /block/%n"$
    ^Iprio_callout^I^I/bin/true$
    ^Ipath_checker^I^Ireadsector0$
    ^Irr_min_io^I^I100$
    ^Imax_fds^I^I^I8192$
    ^Irr_weight^I^Ipriorities$
    ^Ifailback^I^Iimmediate$
    ^Ino_path_retry^I^Ifail$
    ^Iuser_friendly_names^Iyes$
    }$
    ##$
    ## The wwid line in the following blacklist section is shown as an example$
    ## of how to blacklist devices by wwid.  The 2 devnode lines are the$
    ## compiled in default blacklist. If you want to blacklist entire types$
    ## of devices, such as all scsi devices, you should use a devnode line.$
    ## However, if you want to blacklist specific devices, you should use$
    ## a wwid line.  Since there is no guarantee that a specific device will$
    ## not change names on reboot (from /dev/sda to /dev/sdb for example)$
    ## devnode lines are not recommended for blacklisting specific devices.$
    ##$
    blacklist {$
    ^Idevnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"$
    ^Idevnode "^hd[a-z]"$
    ^Idevnode "^cciss!c[0-9]d[0-9]*"$
    }$
    multipaths {$
     ^Imultipath { $
    ^I^I^I wwid ^I^I350002ac12b732b$
    ^I^I^I alias ^I^IKNB400_dtest1_bvg^I$
    ^I}$
     ^Imultipath { $
    ^I^I^I wwid ^I^I350002ac12b722b$
    ^I^I^I alias ^I^IKNB400_dtest1_vg^I$
    ^I}$
    }$

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Tu peux essayer avec cette syntaxe légèrement modifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '/multipath { *$/{:z;N;/}$/!bz;/test1_bvg/d}' /etc/multipath.conf

  13. #13
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Merci beaucoup ! Ca fonctionne !
    Mais qu'apporte l'ajout de "*" ?

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par ned57 Voir le message
    Merci beaucoup ! Ca fonctionne !
    Mais qu'apporte l'ajout de "*" ?
    J'ai remarqué avec la visualisation des caractères non-imprimables qu'il y avait un espace après l'accolade ouvrante, donc j'ai rajouté un espace après l'accolade et un astérisque pour palier le cas où il n'y en aurait pas, il y en aurait un ou plusieurs...


  15. #15
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Nickel, t'es un chef !

  16. #16
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Je me permets de déterrer ce topic car mon besoin a un peu évolué depuis la dernière fois. Il s'agissait, à l'époque, de lancer cette commande en local mais désormais il faudrait que je la lance en ssh. Or, il n'apprécie pas vraiment la boucle dans le sed j'ai l'impression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ssh k27 "sed -i".old" '/multipath { *$/{:z;N;/}$/!bz;/base_bvg/d}' /etc/multipath.conf"
    -bash: !bz: event not found
    Auriez-vous une piste ?

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Comment lances-tu ta commande (syntaxe exacte) ?

  18. #18
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par ned57 Voir le message
    Je me permets de déterrer ce topic car mon besoin a un peu évolué depuis la dernière fois. Il s'agissait, à l'époque, de lancer cette commande en local mais désormais il faudrait que je la lance en ssh. Or, il n'apprécie pas vraiment la boucle dans le sed j'ai l'impression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ssh k27 "sed -i".old" '/multipath { *$/{:z;N;/}$/!bz;/base_bvg/d}' /etc/multipath.conf"
    -bash: !bz: event not found
    Auriez-vous une piste ?
    une toute petite piste: j'essaierais avec un backslash devant le bang (car celui-ci est interprété par le shell): '\!' à la place de '!'

  19. #19
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Voici la syntaxe exacte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ligne in `cat $work_dir/pv_b_$serveur.txt`
    do
            echo "ssh $serveur_b \"sed -i\".old\" '/multipath { *$/{:z;N;/}$/!bz;/$ligne/d}' /etc/multipath.conf\""
    done
    A noter que j'utilise un "echo" pour le moment afin de vérifier le bon déroulement de mon script, à terme il disparaîtra.

    Cette boucle me renvoie bien à l'écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh k27 "sed -i".old" '/multipath { *$/{:z;N;/}$/!bz;/base_bvg/d}' /etc/multipath.conf"
    Par contre, quand j'exécute cette commande, elle plante...

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par ned57 Voir le message
    A noter que j'utilise un "echo" pour le moment afin de vérifier le bon déroulement de mon script, à terme il disparaîtra.
    C'est d'ailleurs ce qui doit provoquer l'erreur de syntaxe, due principalement au point d'exclamation qui, entouré de quote double dans une commande echo provoque systématiquement une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo "!"
    bash: !: event not found
     
    $ echo '!'
    !
    Ce qui n'est plus vrai si on rajoute un espace derrière
    Je suppose donc que les nombreuses quotes doubles que tu emploies doivent interférer quelque part

    De toute façon, tu pourrais déjà retirer le "-i.old" de ta commande ce qui générerait juste un affichage à l'écran sans modifier ni altérer quoi que ce soit.

    Par contre pour avoir fait des tests hier soir, il faut entourer la commande qui doit être exécutée par des quotes simples, mais à ce moment là, il faut entourer celle de "sed" par des quotes doubles, ce qui devrait donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh $serveur_b 'sed  "/multipath { *$/{:z;N;/}$/!bz;/$ligne/d}" /etc/multipath.conf\'
    Si le résultat est probant, alors tu pourras rajouter le "-i.old".

Discussions similaires

  1. Supprimer les dernières lignes d'un fichier
    Par eleana dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 03/11/2017, 11h55
  2. supprimer les dernières lignes vides
    Par buhrne dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/03/2008, 16h08
  3. Supprimer les memes lignes
    Par NapsterVB dans le forum Delphi
    Réponses: 10
    Dernier message: 20/04/2007, 22h02
  4. Supprimer les dernieres lignes et concatener plusieurs fichier
    Par filsdugrand dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 11/04/2006, 22h15
  5. supprimer les dernieres lignes d'un classeur excel
    Par zouille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/12/2005, 12h23

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