OVH Cloud OVH Cloud

Commande Shell GREP

14 réponses
Avatar
alilou94
Bonjour,

Je débute dans le shell.

J'ai un fichier test.txt qui contient :

EVENT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "XXXXX" Minor
FORMAT L'equipement a redemarre $r;
EVENT BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "XXXXX" Minor
FORMAT L'equipement a redemarre $r;
EVENT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "XXXXX" Major
FORMAT L'equipement a redemarre $r;
EVENT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD "ATE" Critical
FORMAT L'equipement a redemarre $r;
etc......

avec plusieur millier de lignes de log et je souhaiterais obtenir :

FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Major
FORMAT L'equipement a redemarre $r; Critical
etc.............

ou bien cela :

Minor FORMAT L'equipement a redemarre $r;
Minor FORMAT L'equipement a redemarre $r;
Major FORMAT L'equipement a redemarre $r;
Critical FORMAT L'equipement a redemarre $r;
etc............

ou encore :

Minor L'equipement a redemarre $r;
Minor L'equipement a redemarre $r;
Major L'equipement a redemarre $r;
Critical L'equipement a redemarre $r;
etc..........

ou encore :

L'equipement a redemarre $r; Minor
L'equipement a redemarre $r; Minor
L'equipement a redemarre $r; Major
L'equipement a redemarre $r; Critical
etc.............


Et je souhaiterais par la suite tranferer le fichier.txt une fois filtré de la sorte dans un document excel qui comporte deux colonnes :


COLONNE 1 | COLONNE 2

L'equipement a redemarre $r; | Minor
L'equipement a redemarre $r; | Minor
L'equipement a redemarre $r; | Major
L'equipement a redemarre $r; | Critical
etc.............

Auriez-vous des idées à me proposer ?
ps : je travaille sur le shel de la dernière version de ubuntu.

Merci d'avance pour votre aide.

10 réponses

1 2
Avatar
Olivier Miakinen
Bonjour,

Le 15/04/2015 16:46, alilou94 a écrit :

J'ai un fichier test.txt qui contient :

EVENT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "XXXXX" Minor
FORMAT L'equipement a redemarre $r;
EVENT BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "XXXXX" Minor
FORMAT L'equipement a redemarre $r;
EVENT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "XXXXX" Major
FORMAT L'equipement a redemarre $r;
EVENT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD "ATE" Critical
FORMAT L'equipement a redemarre $r;
etc......



Visiblement, ce qui ne change pas c'est le mot-clé EVENT au début
de la ligne qui contient la sévérité (Minor, Major ou Critical),
puis la totalité de la ligne suivante commençant par FORMAT et
finissant par $r;

avec plusieur millier de lignes de log et je souhaiterais obtenir :

FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Major
FORMAT L'equipement a redemarre $r; Critical
etc.............



Avec « grep '^EVENT ' » tu obtiendras le résultat suivant :

EVENT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "XXXXX" Minor
EVENT BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "XXXXX" Minor
EVENT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "XXXXX" Major
EVENT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD "ATE" Critical

Il te suffira alors de lancer une autre commande (un sed
par exemple) qui remplacera tout le début par ta chaîne
fixe « FORMAT L'equipement a redemarre $r; ».

Ah, ce n'est peut-être pas ce que tu veux parce que tu n'as
pas bien expliqué ce qui pouvait varier ? Dans ce cas, à toi
d'expliquer mieux...

Cordialement,
--
Olivier Miakinen
Avatar
mireero
On 04/15/2015 05:41 PM, Olivier Miakinen wrote:
avec plusieur millier de lignes de log et je souhaiterais obtenir :
>
>FORMAT L'equipement a redemarre $r; Minor
>FORMAT L'equipement a redemarre $r; Minor
>FORMAT L'equipement a redemarre $r; Major
>FORMAT L'equipement a redemarre $r; Critical
>etc.............


Avec « grep '^EVENT ' » tu obtiendras le résultat suivant :

EVENT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "XXXXX" Minor
EVENT BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "XXXXX" Minor
EVENT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "XXXXX" Major
EVENT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD "ATE" Critical

Il te suffira alors de lancer une autre commande (un sed
par exemple) qui remplacera tout le début par ta chaîne
fixe « FORMAT L'equipement a redemarre $r; ».

Ah, ce n'est peut-être pas ce que tu veux parce que tu n'as
pas bien expliqué ce qui pouvait varier ? Dans ce cas, à toi
d'expliquer mieux...

Cordialement,
-- Olivier Miakinen



Tout à fait d'accord, la solution est manifestement aussi simple que
cela si la chaîne "FORMAT L'equipement a redemarre $r;" est *stable*
tout au long du fichier.

--
mireero
Avatar
william
On 2015-04-15, mireero wrote:
On 04/15/2015 05:41 PM, Olivier Miakinen wrote:
avec plusieur millier de lignes de log et je souhaiterais obtenir :
>
>FORMAT L'equipement a redemarre $r; Minor
>FORMAT L'equipement a redemarre $r; Minor
>FORMAT L'equipement a redemarre $r; Major
>FORMAT L'equipement a redemarre $r; Critical
>etc.............


Avec « grep '^EVENT ' » tu obtiendras le résultat suivant :

EVENT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "XXXXX" Minor
EVENT BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "XXXXX" Minor
EVENT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "XXXXX" Major
EVENT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD "ATE" Critical

Il te suffira alors de lancer une autre commande (un sed
par exemple) qui remplacera tout le début par ta chaîne
fixe « FORMAT L'equipement a redemarre $r; ».

Ah, ce n'est peut-être pas ce que tu veux parce que tu n'as
pas bien expliqué ce qui pouvait varier ? Dans ce cas, à toi
d'expliquer mieux...

Cordialement,
-- Olivier Miakinen



Tout à fait d'accord, la solution est manifestement aussi simple que
cela si la chaîne "FORMAT L'equipement a redemarre $r;" est *stable*
tout au long du fichier.




% cat a.sh; echo "------"; ./a.sh
#!/bin/sh
awk 'BEGIN{i=0;} /^EVENT/{event=$NF} /^FORMAT/{print $0 " " event;}' foo
------
FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Major
Avatar
Lucas Levrel
On 04/15/2015 05:41 PM, Olivier Miakinen wrote:
Avec « grep '^EVENT ' » tu obtiendras le résultat suivant :

EVENT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "XXXXX" Minor
EVENT BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "XXXXX" Minor
EVENT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "XXXXX" Major
EVENT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD "ATE" Critical

Il te suffira alors de lancer une autre commande (un sed
par exemple)







Je doute que le PO maîtrise sed s'il ne maîtrise pas grep...

Le 15 avril 2015, william a écrit :
% cat a.sh; echo "------"; ./a.sh



Peut-être un peu obscur pour un débutant en shell ?
Si je peux me permettre de traduire :
- mettre ceci dans un fichier texte nommé (par exemple) monscript.sh :
#!/bin/sh
awk 'BEGIN{i=0;} /^EVENT/{event=$NF} /^FORMAT/{print $0 " " event;}' test.txt > fichier.txt
- modifier les droits d'accès de monscript.sh pour le rendre exécutable
- dans le terminal, taper ./monscript.sh (le script doit être dans le même
répertoire que test.txt)
- le résultat se trouve alors dans fichier.txt

Si nécessaire on peut faire un script plus souple, p. ex. à qui l'on passe
le nom du fichier à traiter en argument.

--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
C'est mieux avé les accents (F. Patte)
Avatar
Benoit Izac
Bonjour,

le 15/04/2015 à 23:42, william a écrit dans le message
:

% cat a.sh; echo "------"; ./a.sh
#!/bin/sh
awk 'BEGIN{i=0;} /^EVENT/{event=$NF} /^FORMAT/{print $0 " " event;}' foo



À quoi sert le BEGIN{i=0;} ?

--
Benoit Izac
Avatar
alilou94
Le mercredi 15 Avril 2015 à 16:46 par alilou94 :
Bonjour,

Je débute dans le shell.

J'ai un fichier test.txt qui contient :

EVENT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "XXXXX" Minor
FORMAT L'equipement a redemarre $r;
EVENT BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB "XXXXX" Minor
FORMAT L'equipement a redemarre $r;
EVENT CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC "XXXXX" Major
FORMAT L'equipement a redemarre $r;
EVENT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD "ATE" Critical
FORMAT L'equipement a redemarre $r;
etc......

avec plusieur millier de lignes de log et je souhaiterais obtenir :

FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Minor
FORMAT L'equipement a redemarre $r; Major
FORMAT L'equipement a redemarre $r; Critical
etc.............

ou bien cela :

Minor FORMAT L'equipement a redemarre $r;
Minor FORMAT L'equipement a redemarre $r;
Major FORMAT L'equipement a redemarre $r;
Critical FORMAT L'equipement a redemarre $r;
etc............

ou encore :

Minor L'equipement a redemarre $r;
Minor L'equipement a redemarre $r;
Major L'equipement a redemarre $r;
Critical L'equipement a redemarre $r;
etc..........

ou encore :

L'equipement a redemarre $r; Minor
L'equipement a redemarre $r; Minor
L'equipement a redemarre $r; Major
L'equipement a redemarre $r; Critical
etc.............


Et je souhaiterais par la suite tranferer le fichier.txt une fois filtré
de la sorte dans un document excel qui comporte deux colonnes :


COLONNE 1 | COLONNE 2

L'equipement a redemarre $r; | Minor
L'equipement a redemarre $r; | Minor
L'equipement a redemarre $r; | Major
L'equipement a redemarre $r; | Critical
etc.............

Auriez-vous des idées à me proposer ?
ps : je travaille sur le shel de la dernière version de ubuntu.

Merci d'avance pour votre aide.


Merci Olivier pour ta réponde mais effectivement j'ai pris un mauvais exemple pour expliquer mon problème.

Dans les ligne commencant par le mot FORMAT , le message varie et peu avoir donc plusieur message différent et non pas seulement "l'equipement a redemarré".

Ceux sont des message différent selon les cas.
Avatar
Benoit Izac
Bonjour,

le 16/04/2015 à 13:18, alilou a écrit dans le message
:

Merci Olivier pour ta réponde mais effectivement j'ai pris un mauvais
exemple pour expliquer mon problème.

Dans les ligne commencant par le mot FORMAT , le message varie et peu
avoir donc plusieur message différent et non pas seulement
"l'equipement a redemarré".

Ceux sont des message différent selon les cas.



Dans ce cas, peux-tu poster un exemple réel des lignes que tu as
à analyser car on s'y perd.

--
Benoit Izac
Avatar
Olivier Miakinen
Le 16/04/2015 08:57, Lucas Levrel m'a répondu :

Je doute que le PO maîtrise sed s'il ne maîtrise pas grep...



Certes, mais j'ai fait un peu exprès de prendre au pied de la lettre
son ébauche de description pour lui faire prendre conscience que
c'était trop vague pour qu'on puisse lui faire une réponse correcte
du premier coup.

On pouvait bien sûr supposer que la ligne avec FORMAT n'était pas
fixe, mais du coup est-ce qu'il n'aurait pas oublié de nous dire
qu'on peut avoir aussi un nombre variable de lignes FORMAT ? Ou
bien des lignes autres que EVENT et FORMAT ? Ou encore que ce qui
est dans son exemple « Major », « Minor » ou « Critical » pourrait
parfois comporter une espace comme « Not so critical » ? Et ainsi
de suite.

Par ailleurs, pourquoi vouloir utiliser grep ? Et est-ce que le
fichier intermédiaire fichier.txt est indispensable, ou bien
la seule chose qui l'intéresse est le fichier Excel ?

Bref...
Avatar
william
On 2015-04-16, Benoit Izac wrote:
Bonjour,

le 15/04/2015 à 23:42, william a écrit dans le message
:

% cat a.sh; echo "------"; ./a.sh
#!/bin/sh
awk 'BEGIN{i=0;} /^EVENT/{event=$NF} /^FORMAT/{print $0 " " event;}' foo



À quoi sert le BEGIN{i=0;} ?



A terminer si c'est une ligne pair ou impair, c'etait le code d'origine qui ne
sert plus.
Avatar
Benoit Izac
Bonjour,

le 19/04/2015 à 20:11, william a écrit dans le message
:

% cat a.sh; echo "------"; ./a.sh
#!/bin/sh
awk 'BEGIN{i=0;} /^EVENT/{event=$NF} /^FORMAT/{print $0 " " event;}' foo



À quoi sert le BEGIN{i=0;} ?



A terminer si c'est une ligne pair ou impair, c'etait le code
d'origine qui ne sert plus.



Même dans ce cas, ça ne sert à rien. Une variable non initialisée, dans
un contexte numérique, sera interprétée comme 0. De plus, lorsqu'il n'y
a qu'une action, le point virgule est inutile. Pour finir, NR contient
le numéro de la ligne courante donc NR%2 renvoie 1 pour une ligne
impaire, 0 pour une ligne paire.

--
Benoit Izac
1 2