J'ai ce magasin dans une variable
sCellEventTrap-03-28 TRAP-TYPE - Code CAC: 00 ENTERPRISE compaq VARIABLES {scellNameDateTime, scellSWComponent, scellECode, [. .____.] scellCAC, scellÉIP} DESCRIPTION "Gravité: normale - de nature informative. Un disque physique a subi une incohérence lors de la vérification périodique du disque. " - # TYPE" Evénement StorageCell " - # SUMMARY" SCellName-TimeDate% s: SWCID% d: ECode:% d: CAC% d: EIP% d. " - # ARGUMENTS {0,1,2,3,4,} - # GRAVITÉ INFORMATIONNELLE - # TIMEINDEX 136 - # STATE AVERTISSEMENT :: = 13600808
Je dois tout couper jusqu'à la deuxième occurrence de "
. Donc ça me donnerait:
sCellEventTrap-03-28 TRAP-TYPE - Code CAC: 00 ENTERPRISE compaq VARIABLES {scellNameDateTime, scellSWComponent, scellECode, [. .____.] scellCAC, scellÉIP} DESCRIPTION "Gravité: normale - de nature informative. Un disque physique a subi une incohérence lors de la vérification périodique du disque. "
Un autre exemple
genericSanEvent TRAP-TYPE ENTERPRISE hpSanManager VARIABLES {severityLevel, category, id, msgString, contactName, contactEmail, contactWorkPhone, contactHomePhone, contactPager, contactFax} DESCRIPTION "Un événement générique SAN a eu lieu. Les variables sont: severityLevel - le niveau de gravité de l'événement; category - Catégorie de l'événement signalé; code - ID de l'événement dans la catégorie donnée; msgString - chaîne de message décrivant l'événement; contactName - le nom de la personne à notifier de l'événement; contactEmail - l'adresse e-mail de l'individu mentionné dans contactName; contactWorkPhone - le numéro de téléphone au travail de l'individu mentionné dans contactName; contactHomePhone - le numéro de téléphone personnel de la personne mentionnée dans contactName; contactPager - le numéro de téléavertisseur de la personne mentionnée dans contactName; contactFax - le numéro de fax de l'individu mentionné dans contactName " - Les attributs suivants sont utilisés par xnmloadmib pour améliorer le formatage - # TYPE" OV SAM SAN événement " - # SOMMAIRE" OV SAM SAN événement, catégorie/I d:% d /% d, msg:% d Gravité:% d Contact:% d " - # ARGUMENTS {1,2,3,0,4} - # GRAVITÉ CRITICAL - # GÉNÉRIQUE 6 - # CATÉGORIE "Événements d’alerte d’application" - # SOURCE_ID "T" :: = 1
La sortie pour cet exemple devrait être:
genericSanEvent TRAP-TYPE ENTERPRISE hpSanManager VARIABLES {severityLevel, category, id, msgString, contactName, contactEmail, contactWorkPhone, contactHomePhone, contactPager, contactFax} DESCRIPTION "Un événement générique SAN a eu lieu. Les variables sont: severityLevel - le niveau de gravité de l'événement; category - Catégorie de l'événement signalé; code - ID de l'événement dans la catégorie donnée; msgString - chaîne de message décrivant l'événement; contactName - le nom de la personne à notifier de l'événement; contactEmail - l'adresse e-mail de l'individu mentionné dans contactName; contactWorkPhone - le numéro de téléphone au travail de l'individu mentionné dans contactName; contactHomePhone - le numéro de téléphone personnel de la personne mentionnée dans contactName; contactPager - le numéro de téléavertisseur de la personne mentionnée dans contactName; contactFax - le numéro de fax de la personne mentionnée dans contactName "
awk -v RS='"' -v ORS='"' 'NR==1{print} NR==2{print; printf"\n";exit}' file
Cela définit le séparateur d'enregistrement sur "
. Donc, nous voulons imprimer les deux premiers enregistrements et ensuite nous avons terminé. Plus en détail:
-v RS='"'
Cela définit le séparateur d'enregistrement d'entrée sur un guillemet double.
-v ORS='"'
Ceci définit le séparateur d'enregistrement en sortie sur une citation double.
NR==1{print}
Cela indique à awk d’imprimer la première ligne.
NR==2{print; printf"\n";exit}
Cela indique à awk d’imprimer la deuxième ligne, puis d’imprimer un caractère de nouvelle ligne, puis de quitter.
sed -r 'H;1h;$!d;x; s/(([^"]*"){2}).*/\1/' file
Cela lit tout le fichier à la fois. Donc, si le fichier est énorme, n'utilisez pas cette approche. Cela fonctionne comme suit:
H;1h;$!d;x
C'est un langage Sed utile: il lit tout le fichier en une fois.
s/(([^"]*"){2}).*/\1/
Cela cherche le deuxième "
puis supprime tout le texte qui suit le deuxième guillemet.
La regex (([^"]*"){2})
capture tout le texte jusqu'au deuxième guillemet compris et l'enregistre dans le groupe 1. La regex .*
capture tout ce qui suit jusqu'à la fin du fichier. Le texte de remplacement est le groupe 1, \1
.
Voici un petit script python
:
#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
print '"'.join(f.read().split('"')[:2]) + '"'
f.read().split('"')
lit le fichier entier en tant que chaîne, puis le divise en "
pour obtenir toutes les parties "
séparées.
Comme nous ne nous intéressons qu'aux deux premières parties "
séparées, '"'.join(f.read().split('"')[:2])
joignera les deux premières à "
Enfin, nous avons ajouté un "
pour obtenir le format souhaité.
Bien que de nombreux programmes n'aiment pas les très longues lignes en entrée, lorsque vos données ne sont pas énormes, vous pouvez souvent simplifier correspondance sur plusieurs lignes en manipulant d'abord les données pour les mettre toutes sur une seule ligne, puis restaurer les nouvelles lignes.
Par exemple, utilisez tr pour remplacer newline \n
par un caractère ne figurant pas dans vos données (j’ai utilisé chariot-return `\ r '), utilisez sed pour modifier cette ligne unique, puis revenez le caractère:
tr '\n' '\r' < file |
sed 's/\("[^"]*"\).*/\1/' |
( tr '\r' '\n'; echo ) # add a final newline
Sinon, même si vous indiquez que vous voulez sed/awk/grep, des langages tels que Perl et python utilisent des expressions régulières similaires à celles-ci et permettent de manipuler des chaînes de plusieurs lignes. Par exemple, Perl:
Perl -e '$_ = join("",<>); s/(".*?").*/$1/s; print "$_\n"; ' file
Utiliser Perl:
< infile Perl -0777 -pe 's/((.*?"){2}).*/$1/s' > outfile
-0777
: glisse le fichier entier en même temps au lieu d'une ligne à la fois-p
: place une boucle while (<>) {[...]}
autour du script et imprime le fichier traité.-e
: lit le script à partir des argumentsRépartition de la commande Perl:
s
: affirme effectuer une substitution/
: lance le motif((.*?"){2})
: correspond et regroupe un nombre quelconque de caractères, zéro ou plusieurs fois, dans le fichier actuel (c.-à-d. Qu'il correspond le moins de fois possible, en s'arrêtant lorsque le modèle suivant commence à correspondre) avant un caractère "
, deux fois.*
: correspond à n'importe quel nombre de caractères, zéro ou plus, avec gourmandise dans le fichier actuel (c'est-à-dire qu'il correspond le plus souvent possible)/
: arrête le motif/démarre la chaîne de remplacement$1
: remplace par le premier groupe capturé/
: arrête la chaîne de remplacement/démarre les modificateurss
: traite le fichier entier comme une seule ligne, permettant ainsi à .
de correspondre aux nouvelles lignesVoici une version plus courte de awk
: awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ '
$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile.txt
sCellEventTrap-03-28 TRAP-TYPE -- CAC Code: 00
ENTERPRISE compaq
VARIABLES { scellNameDateTime,
scellSWComponent,
scellECode,
scellCAC,
scellEIP}
DESCRIPTION
"Severity: Normal -- informational in nature. A physical disk drive has experienced an ID block inconsistency during a periodic drive check."
$ awk '/TRAP-TYPE/,/[[:alpha:]]*"$/ ' testfile2.txt
genericSanEvent TRAP-TYPE
ENTERPRISE hpSanManager
VARIABLES { severityLevel, category, id,
msgString, contactName, contactEmail,
contactWorkPhone, contactHomePhone,
contactPager, contactFax }
DESCRIPTION
"A generic SAN event has occurred. The variables are:
severityLevel - the event severity level;
category - Category of the event being reported;
code - ID of the event in the given category;
msgString - the message string describing
the event;
contactName - the name of the individual
to be notified of the event;
contactEmail - the e-mail address of the
individual referred to in contactName;
contactWorkPhone - the work phone number
of the individual referred to in
contactName;
contactHomePhone - the home phone number
of the individual referred to in
contactName;
contactPager - the pager number of the
individual referred to in contactName;
contactFax - the FAX number of the individual
referred to in contactName"