2009-06-02 8 views
1

Comment puis-je extraire certaines variables d'une plage spécifique de lignes dans sed/awk?Effectuer une action sur une plage de lignes dans sed/awk

Exemple: Je veux exctract l'hôte et le port de .tnsnames.ora de cette section qui commence à la ligne 105.

DB_CONNECTION= 
    (description= 
    (address= 
     (protocol=tcp) 
     (host=127.0.0.1) 
     (port=1234) 
    ) 
     (connect_data= 
     (sid=ABCD) 
     (sdu=4321) 
) 

Répondre

1

utilisation:

sed « 105, < $ quelle que soit sed code que vous voulez ici> »

Si vous voulez spécifiquement l'hôte et le port que vous pouvez faire quelque chose comme:

sed .tnsnames.ora '105,115p'|grep -e 'host=' -e 'port=' 
1

Vous pouvez utiliser des plages d'adresses pour spécifier à quelle section appliquer les expressions régulières. Si vous laissez l'adresse de la ligne de fin (gardez la virgule), elle correspondra à la fin du fichier. Vous pouvez également «chaîner» plusieurs expressions en utilisant «-e» plusieurs fois. L'expression suivante affichera simplement la valeur du port et de l'hôte à la sortie standard. Il utilise des références arrières (\ 1) pour imprimer simplement les parties correspondantes.

sed -n -e '105,115s/(port=\([0-9].*\))/\1/p' -e '105,115s/(host=\([0-9\.].*\))/\1/p' tnsnames.ora 
1

Le gawk peut utiliser une expression régulière dans un séparateur de champ (FS).

'$ 0 = $ 2' est toujours vrai, donc automatiquement ce script imprime $ 2.

$ gawk -F'[()]' 'NR>105&&NR<115&&(/host/||/port/)&&$0=$2' .tnsnames.ora 
0

@lk, pour répondre à la réponse que vous avez affichée:

Vous pouvez écrire awk code comme C, mais il est plus succinctement comme "motif {action}" paires.

Si vous avez gawk ou nawk, le séparateur de champ est un ERE comme Hirofumi Saito

gawk -F'[()=]' ' 
    NR < 105 {next} 
    NR > 115 {exit} 
    $2 == "host" || $2 == "port" { 
     # do stuff with $2 and $3 
     print $2 "=" $3 
    } 
' 
Questions connexes