Retourner aux forums || Retourner au forum Programmation.shell
Programmation.shell : commande Cat avec un arret prècis
Posté par dubis () le 31 mars 2008Est-il possible de faire un "cat" ou "more" d'un fichier avec un arrêt précis qui correspond à une date. Dans mon cas, c'est "TIMESTAMP 12/31/2007".
Merci de votre aide.
> Lire le message (16 commentaires, moyenne: 3).
grep?
quelque chose du genre:
grep "TIMESTAMP 12/31/2007" mon_fichier
?
-
[^]Re: grep?
Posté par dubis () le 31/03/2008 à 11:29. (lien). Évalué à 1.Non,
Ce serait trop facile :-)
En fait, j'aimerais avoir la liste de ce qu'il y avait avant le "TIMESTAMP 12/31/2007".
J'ai un fichier log sur plusieurs mois et j'aimerais le découper en plusieurs fichiers avec des dates bien précises......
J'ai pensé à une boucle "while" mais cela implique de charger le fichier en variable donc en mémoire.... Il est trop gros plusieurs centainnes de méga
Merci de votre aide-
[^]Re: grep?
Posté par Olivier Macchioni () le 31/03/2008 à 11:35. (lien). Évalué à 1.crade:
grep -B`wc -l fichier | sed 's/ .*//'` "TIMESTAMP 12/31/2007" fichier
(il manque clairement une option dans wc pour ne pas afficher le nom de fichier)
-
Réponse alambiquée :
$ tail -n `echo $(($(wc -l fichier.txt | cut -f 1 -d ' ') - $(grep -n "TIMESTAMP 12/31/2007" fichier.txt | cut -f 1 -d ':') + 1))` fichier.txt
Quelques explications :
On recherche le nombre de lignes du fichier fichier.txt (wc -l) et on ne récupère que le nombre de ligne (cut -f 1 -d ' ').
On y retranche le numéro de la ligne où l'on trouve le motif (grep -n "TIMESTAMP 12/31/2007" (là encore, on ne récupère que le numéro de la ligne, et pas tout le blabla qui s'en suit (cut -f 1 -d ':').
On effectue la soustraction des deux grâce au echo $((A -B +1))
Enfin, on appel tail -n resultat fichier.txt
Voilà, j'espère que ceci répond à la question.
Il y a probablement plus simple, mais au moins, cette commande fonctionne.
All articles which are excluded shall be deemed included
Tous les articles exclus sont considérés inclus
--Brian de Palma in Phantom of the Paradize
-
[^]Re: Réponse alambiquée :
Posté par dubis () le 31/03/2008 à 11:56. (lien). Évalué à 1.Merci Gyro
Effectivement je n'avait pas penser à la commande "tail" certainement à cause du lundi matin :-)
J'ai simplifié ta ligne de commande par la suivante :
tail -`grep -n "TIMESTAMP 12/31/2007" Fichier.log | awk -F: '{print $1}'` Fichier.log
Mais j'ai un problème avec celle ci. En effet la commande tail -34 Fichier.log m'affiche bien les premières 34 lignes du fichier.log.
Dans mon cas le "grep -n "TIMESTAMP 12/31/2007" Fichier.log | awk -F: '{print $1}'" donne 34171. Le tail m'affiche tout le fichier sans s'arrêter à la ligne 34171.
Merci de votre aide-
[^]Re: Réponse alambiquée :
Posté par Gyro Gearllose () le 31/03/2008 à 12:04. (lien). Évalué à 3.C'est une question de sens, à mon avis....
Si le but est d'afficher les 37141 dernières lignes, il faut en effet utiliser tail, mais si le but est d'afficher les 37141 premières lignes, il faudrait peut-être utiliser head...
Autrement, pour afficher un intervalle, par exemple de la ligne 31542 à la ligne 37141, il faudrait coupler les deux...
Commencer par un head, par exemple, du début du fichier à la ligne 37141, et passer le résultat (que ce soit un pipe ou un fichier temporaire ne changera rien à l'affaire) à tail...
Voilà, en espérant que ça aide.--
All articles which are excluded shall be deemed included
Tous les articles exclus sont considérés inclus
--Brian de Palma in Phantom of the Paradize
-
[^]Re: Réponse alambiquée :
Posté par totof2000 () le 31/03/2008 à 12:36. (lien). Évalué à 6.awk ' { if ( $0~/TIMESTAMP 12\/31\/2007/ ) { exit }; print $0 }' toto2.txt
-
[^]Re: Réponse alambiquée :
Posté par totof2000 () le 31/03/2008 à 12:37. (lien). Évalué à 2.C'est quand même plus simple que vos cat | head|cut ...
-
[^]Re: Réponse alambiquée :
Posté par Olivier Macchioni () le 31/03/2008 à 12:55. (lien). Évalué à 1.Oui, mais t'es sûr que ça répond au problème ? ;)
(en fait, ça s'arrête 1 ligne trop tôt - mais il y a peut-être une solution simple)-
[^]Re: Réponse alambiquée :
Posté par Pierre Bouteillon () le 31/03/2008 à 14:06. (lien). Évalué à 2.(en fait, ça s'arrête 1 ligne trop tôt - mais il y a peut-être une solution simple)
--> solution toute simple: imprimer AVANTde quiter:
awk ' { print $0; if ( $0~/mon texte/ ) { exit } }' monfichier.txt
:-)
-
[^]Re: Réponse alambiquée :
-
-
-
[^]Re: Réponse alambiquée :
Posté par Etienne () le 31/03/2008 à 14:35. (lien). Évalué à 3.La même chose et simplement pour gagner quelques caractères :
awk '/TIMESTAMP 12\/31\/2007/{print; exit;} {print;}'
En effet, avec awk /pattern/{ code;} exécute le code du bloque si la ligne correspond au pattern.
De même print $0; peut s'abréger en print;
Par rapport à la version en sed, c'est vrai que awk est un peu plus clair, sed ayant des commandes très abrégées.
Étienne
-
-
Avec sed
Une ligne de sed
sed -ne '/^TIMESTAMP 12\/31\/2007/q;p'
Pour l'explication :
- /pattern/q va exécuter la command q (quitter) si la ligne correspond au pattern.
- p afficher la ligne.
Dans cet ordre, on ne va pas afficher la ligne qui correspond au pattern, mais si on inverse les deux commandes :
sed -ne 'p;/^TIMESTAMP 12\/31\/2007/q'
On imprimer avant de quitter donc on affichera la ligne.
Etienne
-
[^]Re: Avec sed
Posté par Obsidian () le 31/03/2008 à 15:07. (lien). Évalué à 7.Je plussoie.
On peut faire plus court en virant l'option n (donc affichage implicite), et donc virer p aussi.
Et tant que l'on y est, on peut donner la commande pour faire l'inverse, soit tout afficher à partir du motif :
sed -ne '/TIMESTAMP 12\/31\/2007/,$ p' < fichier
Voila, comme ça, ça restera dans Google Aide-mémoire ! :-)
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.shell



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.