Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Extraire certaines lignes d'un fichier log

18 réponses
Avatar
Gauthier
Bonjour à tous,

Si un fichier log comprend à certains intervalles une ligne
avec un motif caractéristique, comme par exemple

-- MARK --

comme on peut trouver dans certains /var/log/messages,
ou tout autre repère temporel qu'on insèrerait avec cron + logger,
comment, avec des outils de base comme sed, awk, grep...
afficher ce qui figure entre la dernière ligne de ce type et la fin du
fichier ?

Encore mieux, comment afficher les n dernières "tranches" de ce log
délimitées par ces lignes ?

Merci d'avance,
--
^^ Gauthier
(_____/°°-ç
| \_`-"
)/@mmm||
\nn \nn FOE-Belgium : http://www.amisdelaterre.be

8 réponses

1 2
Avatar
Jean-Louis Liagre
Stephane Chazelas wrote:
On 23 Aug 2005 16:04:43 GMT, David LE BOURGEOIS wrote:


Avec GNU tac (certains systemes ont "tail -r" qui fait
l'equivalent)

tac < file | sed '/-- MARK --/q' | tac


Sur les systèmes où les outils GNU ne sont pas présents, j'ai l'habitude
d'utiliser sed pour remplacer tac :

sed '1!G;h;$!d'



Tu as besoin du GNU sed pour ca ;). Car tout le fichier se
retrouve en memoire et il n'y a guere que le GNU sed pour
oublier de mettre une limitation ici.


Si l'on remplace chaque appel à tac par un appel à sed, on obtient 3 sed
enchaînés par tubes :

sed '1!G;h;$!d' | sed '/--MARK--/q' | sed '1!G;h;$!d'

N'y aurait-il pas un moyen de factoriser tout ça, en un seul appel à
sed ?



Si, une fois que tu as tout le fichier en memoire, tu peux faire
un s/././

sed '1!G;h;$!d;s/.*(--MARK--)/1/'

Mais encore une fois, ca met tout le fichier en memoire et ne
marchera pas avec tous les sed, a moins que le fichier soit
tres petit.


Le problème de cette approche ne vient pas principalement de
l'utilisation de la mémoire, mais de l'algorithme utilisé et
de son impact sur la CPU.
Meme avec gnu sed, ça ne tient pas la comparaison avec tac,
qui va 13500 fois plus vite pour "retourner" un fichier de
5 mégas ...

$ wc bigfile
65579 131178 5823935 bigfile

$ /opt/csw/bin/gsed --version
GNU sed version 4.1.4

$ time /opt/csw/bin/gsed '1!G;h;$!d' bigfile >/dev/null

real 42m48.16s
user 41m18.22s
sys 0m0.25s

$ time /opt/gnu/bin/tac bigfile >/dev/null

real 0m0.19s
user 0m0.05s
sys 0m0.05s



Avatar
Laurent Wacrenier
drkm écrit:
Laurent Wacrenier writes:

Il le lit qu'une fois, mais il le met deux fois en mémoire...


Quelle est la différence ?


Si le fichier est lu deux fois, il faudrait tenir compte du fait qu'il
ai pu change et ça ne marche pas sur un pipe.

S'il est mis en mémoire, c'est un problème si le fichier est gros.


Avatar
Stephane Chazelas
On Tue, 23 Aug 2005 13:43:17 +0000 (UTC), Laurent Wacrenier wrote:
Stephane Chazelas écrit:
Note que ca signifie lire le fichier en entier deux fois (tac |
sed | tac dans mon exemple ne lit que la fin du fichier une
fois mais n'est pas portable).


Il le lit qu'une fois, mais il le met deux fois en mémoire...


Le premier tac lit a l'envers en faisant des lseek, le deuxieme
garde tout en memoire, c'est vrai mais ce n'est que la fin du
fichier.

Il n'y a que la fin du fichier, jusqu'au dernier bloc contenant
une marque qui est lue.

--
Stephane


Avatar
Stephane Chazelas
On Wed, 24 Aug 2005 00:56:05 +0200, Jean-Louis Liagre wrote:
[...]
Non, sous Solaris, nawk est different de /usr/xpg4/bin/awk meme
si /usr/xpg4/bin/awk est plus proche de nawk que de
/usr/bin/awk.


man nawk:

DESCRIPTION
The /usr/bin/nawk and /usr/xpg4/bin/awk utilities execute
programs written in the nawk programming language, which is
specialized for textual data manipulation.

nawk n'est pas POSIX conformant (du moins, moins
que /usr/xpg4/bin/awk) et la commande n'existe pas forcement sur
tous les Unix vu qu'elle n'est pas standardisee.



$ echo a | nawk '/[[:print:]]/'
$ echo a | /usr/xpg4/bin/awk '/[[:print:]]/'
a
$ ls -l =nawk /usr/xpg4/bin/awk
-r-xr-xr-x 1 bin bin 121952 Feb 16 2002 /usr/bin/nawk
-r-xr-xr-x 1 bin bin 72112 Sep 1 1998 /usr/xpg4/bin/awk

[...]
Et ni /usr/xpg4/bin/awk ni nawk ne supportent "--" sous Solaris.


1) je n'utilise "--" dans mon script qu'avec sed et grep,
et je viens de retirer celui que vous aviez mis au grep, qui ne
passe pas, sous Solaris du moins.


Ah oui, au temps pour moi.

2) Faux, /usr/xpg4/bin/awk et nawk supportent "--" sous Solaris,
d'ailleurs "--" est POSIX. awk (oawk) ne le supporte pas.


Depend de la version de Solaris alors. Aucun ne le supporte avec
Solaris 7.

$ cat a.awk
{
print $0
print a
}
$ date | awk -f a.awk -- a"
Wed Aug 24 00:45:40 CEST 2005

$ date | awk -f a.awk a"
Wed Aug 24 00:46:03 CEST 2005
22
$ date | nawk -f a.awk -- a"
Wed Aug 24 00:46:11 CEST 2005
22
$ date | /usr/xpg4/bin/awk -f a.awk -- a"
Wed Aug 24 00:46:26 CEST 2005
22


$ date | nawk 1 -- a"
nawk: can't open file --
source line number 1
$ date | /usr/xpg4/bin/awk 1 -- a"; echo
input file "--"



De plus, probleme si les noms de fichiers contiennent des "=",
mieux vaut laisser le shell ouvrir le fichier (l'alternative est
de remplacer les fichiers "fooºr" par "./fooºr").


Je ne vois pas en quoi des fichiers dont les noms contiennent
des "=" perturbent mon script.


Effectivement, j'avais pris $LOGFILE pour un argument de awk.

--
Stephane


Avatar
Jean-Louis Liagre
Stephane Chazelas wrote:
On Wed, 24 Aug 2005 00:56:05 +0200, Jean-Louis Liagre wrote:
[...]

Non, sous Solaris, nawk est different de /usr/xpg4/bin/awk meme
si /usr/xpg4/bin/awk est plus proche de nawk que de
/usr/bin/awk.


man nawk:

DESCRIPTION
The /usr/bin/nawk and /usr/xpg4/bin/awk utilities execute
programs written in the nawk programming language, which is
specialized for textual data manipulation.


nawk n'est pas POSIX conformant (du moins, moins
que /usr/xpg4/bin/awk) et la commande n'existe pas forcement sur
tous les Unix vu qu'elle n'est pas standardisee.




$ echo a | nawk '/[[:print:]]/'
$ echo a | /usr/xpg4/bin/awk '/[[:print:]]/'
a
$ ls -l =nawk /usr/xpg4/bin/awk
-r-xr-xr-x 1 bin bin 121952 Feb 16 2002 /usr/bin/nawk
-r-xr-xr-x 1 bin bin 72112 Sep 1 1998 /usr/xpg4/bin/awk

[...]


Je ne conteste bien sûr pas que nawk et xpg4/awk sont deux
programmes différents, je dis juste qu'ils sont tous les deux
des implémentations de nawk, et pas de awk.

Que xpg4/awk respecte (mieux) POSIX, c'est bien naturel.

Et ni /usr/xpg4/bin/awk ni nawk ne supportent "--" sous Solaris.


1) je n'utilise "--" dans mon script qu'avec sed et grep,
et je viens de retirer celui que vous aviez mis au grep, qui ne
passe pas, sous Solaris du moins.



Ah oui, au temps pour moi.


2) Faux, /usr/xpg4/bin/awk et nawk supportent "--" sous Solaris,
d'ailleurs "--" est POSIX. awk (oawk) ne le supporte pas.



Depend de la version de Solaris alors. Aucun ne le supporte avec
Solaris 7.


Solaris 7 est EOL depuis deux ans, et en support limité depuis 9
jours. J'espère que vous ne basez pas votre connaissance de Solaris
sur cette version. Si oui, il est temps de migrer !

http://www.sun.com/service/support/eosl/solaris/solaris_vintage_eol_5.2005.html

$ cat a.awk
{
print $0
print a
}
$ date | awk -f a.awk -- a"
Wed Aug 24 00:45:40 CEST 2005

$ date | awk -f a.awk a"
Wed Aug 24 00:46:03 CEST 2005
22
$ date | nawk -f a.awk -- a"
Wed Aug 24 00:46:11 CEST 2005
22
$ date | /usr/xpg4/bin/awk -f a.awk -- a"
Wed Aug 24 00:46:26 CEST 2005
22



$ date | nawk 1 -- a"
nawk: can't open file --
source line number 1
$ date | /usr/xpg4/bin/awk 1 -- a"; echo
input file "--"


Effectivement, nawk ne semble comprendre le
"--" que s'il y a eu des options avant.



Avatar
drkm
Laurent Wacrenier <lwa@ teaser . fr> writes:

drkm écrit:

Laurent Wacrenier writes:

Il le lit qu'une fois, mais il le met deux fois en mémoire...


Quelle est la différence ?


Si le fichier est lu deux fois, il faudrait tenir compte du fait qu'il
ai pu change


Ah oui, je n'avais pas songé à cela. Merci.

--drkm



Avatar
Stephane Chazelas
On Wed, 24 Aug 2005 12:36:39 +0200, Jean-Louis Liagre wrote:
[...]
Je ne conteste bien sûr pas que nawk et xpg4/awk sont deux
programmes différents, je dis juste qu'ils sont tous les deux
des implémentations de nawk, et pas de awk.


le standard POSIX est basé sur le /nouveau/ awk de 1988, le nawk
de Solaris aussi. le /usr/bin/awk est basé sur le vieux awk.

Que xpg4/awk respecte (mieux) POSIX, c'est bien naturel.


Ca en fait quand meme une commande differente avec un language
different et des fonctionnalités differentes, quoi qu'en dise la
page de man. J'ai donné pour exemple les "POSIX character
classes".

[...]
Depend de la version de Solaris alors. Aucun ne le supporte avec
Solaris 7.


Solaris 7 est EOL depuis deux ans, et en support limité depuis 9
jours. J'espère que vous ne basez pas votre connaissance de Solaris
sur cette version. Si oui, il est temps de migrer !


Ca reste la version de Solaris la plus repandue, du moins sur
les machines de production. Du moins, c'etait le cas l'annee
derniere.

[...]
$ date | nawk 1 -- a"
nawk: can't open file --
source line number 1
$ date | /usr/xpg4/bin/awk 1 -- a"; echo
input file "--"


Effectivement, nawk ne semble comprendre le
"--" que s'il y a eu des options avant.


Oui, ce qui est normal en fait. Ce qui est apres le script est
censé etre geré par le script. Je m'embrouille tout seul.

--
Stephane


Avatar
Jean-Louis Liagre
Stephane Chazelas wrote:
On Wed, 24 Aug 2005 12:36:39 +0200, Jean-Louis Liagre wrote:
[...]

Je ne conteste bien sûr pas que nawk et xpg4/awk sont deux
programmes différents, je dis juste qu'ils sont tous les deux
des implémentations de nawk, et pas de awk.



le standard POSIX est basé sur le /nouveau/ awk de 1988, le nawk
de Solaris aussi. le /usr/bin/awk est basé sur le vieux awk.


Que xpg4/awk respecte (mieux) POSIX, c'est bien naturel.



Ca en fait quand meme une commande differente avec un language
different et des fonctionnalités differentes, quoi qu'en dise la
page de man. J'ai donné pour exemple les "POSIX character
classes".


Vous exagérez, il s'agit du *même* langage, avec des variantes
mineures.
Il me semble que ce genre de sutuation s'observe sur la plupart
des implémentations de langages de programmation, sauf peut-être
Perl, je ne sais pas, je n'y connais rien en Perl ... ;-)

[...]

Depend de la version de Solaris alors. Aucun ne le supporte avec
Solaris 7.


Solaris 7 est EOL depuis deux ans, et en support limité depuis 9
jours. J'espère que vous ne basez pas votre connaissance de Solaris
sur cette version. Si oui, il est temps de migrer !



Ca reste la version de Solaris la plus repandue, du moins sur
les machines de production. Du moins, c'etait le cas l'annee
derniere.


Je ne met pas cela en doute pour les environnements que vous
connaissez, mais plus généralement, Solaris 7 n'a jamais été
la version la plus répandue, ça a été la 2.5.1, la 2.6 et
aujourd'hui le parc en prod est le plus souvent en Solaris 8.

Beaucoup passeront directement de la 8 vers la 10.


[...]




1 2