Partage

Parcourir fichier et supprimer ligne si match

5 juillet 2018 à 11:19:07

Bonjour à tous,

Je possède un fichier de logs qui devient rapidement volumineux. Le but est de gardé toutes les infos datant de moins de 7 jours. Pour cela j'ai voulu écrire un script qui va comparer la date de la ligne et la date du jour (en seconde avec une conversion) et faire la différence. Jusqu'ici ca fonctionne pas mal mais ensuite lorsque la condition est matché la commande sed de ne permet pas de faire ce que j'ai envie...

time=$(date +%s)
annee=$(date | awk '{print $6}'| cut -c3-4)
while IFS= read -r line; do
	col=$(echo $line | awk '{print $1"-"$2}')
	fTime=$(date -j -f "%B-%d-%y" "$col"-"$annee" +%s)
	var=$(($time - $fTime))
	id=$(nl -ba | awk '{print $1}')
	if [ $var -gt 604800 ]
	then
		sed $id'd'
	fi
done < LogFW.txt

Je pense que je pars un peu dans tous le sens et que c'est pas du tout optimisé mais ca fais 4 jours que je cherche et j'ai toujours pas de solution... Rapidement le script : on crée différente variables permettant la conversion en seconde de la date (chaque ligne du fichier possède la date au début sur les deux premieres colonnes). Puis on lis le fichier et on test chaque ligne si elle possède une date supérieur a 7 jours alors elle est supprimé. Si qq a une idée svp je galère...

Structure d'une ligne du fichier : Jul   4   00:32:21   FW_TEST_01   em3   match   pass   in   udp   src:192.168.1.2   :63499   dst:192.168.1.3   :53

Merci d'avance

-
Edité par JeanBilly1 5 juillet 2018 à 11:21:37

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
certifiante
Financée
à 100%
5 juillet 2018 à 11:42:47

salut,

bon. c'est affreux : la deuxième ligne m'a fait tomber de ma chaise, et le reste m'a déclenché des crises d'épilepsie.

#!/bin/bash

mv fichier.log /tmp/
yy=$(date +%Y)
butoir=$(date +%s -d "7days ago")
while read -a dat
do
   test $(date +%s -d "${dat[0]} ${dat[1]} $yy ${dat[3]}") -gt $butoir && echo "${dat[@]}"
done </tmp/fichier.log >fichier.log

pas testé, 'faudra peut-être adapter...

-
Edité par dantonq 5 juillet 2018 à 19:41:27

« un problème clairement exposé est à moitié résolu. » | je ne réponds pas aux questions techniques par MP.
5 juillet 2018 à 13:11:05

Salut, merci pour ta réponse rapide même si la gentillesse des gens sur ce forum me fera toujours tombé de ma chaise...

Peut tu expliquer le code que tu proposes stp ? Je ne comprends pas ce que tu veux faire.

Par contre il faut du shell et non du bash j'ai oublié de mettre quel interpréteur dans le code.

Merci

-
Edité par JeanBilly1 5 juillet 2018 à 13:12:42

5 juillet 2018 à 13:57:25

Salut

Regarde du coté de logrotate , ça fait tout ce que tu veux .

A plus

5 juillet 2018 à 19:41:06

Peut tu expliquer le code que tu proposes stp

non, cela t'es laissé à titre d'exercice.

Par contre il faut du shell

qu'à cela ne tienne :

#!/bin/sh

mv fichier.log /tmp/
yy=$(date +%Y)
butoir=$(date +%s -d "7days ago")
while read mois jour heure reste
do
    test $(date +%s -d "$mois $jour $yy $heure") -gt $butoir && echo "$mois $jour $heure $reste"
done </tmp/fichier.log >fichier.log
« un problème clairement exposé est à moitié résolu. » | je ne réponds pas aux questions techniques par MP.
6 juillet 2018 à 11:38:30

Salut, le code ne fonctionne pas et honnêtement je ne vois vraiment pas ce que tu cherches à faire.

butoir=$(date +%s -d "7days ago")

je vois pas l'utilité de cette variable et ni le but du while read.

-
Edité par JeanBilly1 6 juillet 2018 à 14:02:39

6 juillet 2018 à 17:03:04

le code ne fonctionne pas

« ça marche pas » ne renseigne pas sur ce qu'il se passe, ou pas. :(
il n'y a pas d'erreur à l'exécution, et les lignes datant de plus de 7 jours ne sont pas affichées.

je ne vois vraiment pas ce que tu cherches à faire.

d'après toi ?

procure-nous un échantillon représentatif de ton fichier, afin de tests "rééls".

« un problème clairement exposé est à moitié résolu. » | je ne réponds pas aux questions techniques par MP.
16 juillet 2018 à 14:52:15

Eh bien si il y a une erreur a l'exécution sur quasiment toutes les lignes.  
butoir=$(date +%s -d "7days ago")

erreur : date: illegal time format

Je suis sous FreeBSD, ca peut venir de là. Pour l'échantillon tu peux prendre ce que j'ai donné en exemple et juste changé la date et l'heure.

16 juillet 2018 à 19:26:48

Je suis [SUR]* FreeBSD, ca peut venir de là.

oui, ça vient de là.

#!/bin/bash

printf -v Ep '%(%s)T'
dateButoir=$(( Ep - 7*24*60*60))



*c'est l'ordinateur qui est SOUS freeBSD

« un problème clairement exposé est à moitié résolu. » | je ne réponds pas aux questions techniques par MP.
24 juillet 2018 à 14:10:40

mon avatar n'est pas suffisamment éloquent ?
« un problème clairement exposé est à moitié résolu. » | je ne réponds pas aux questions techniques par MP.

Parcourir fichier et supprimer ligne si match

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown