#1 Le 02/06/2022, à 11:05
- AFR33
recuperer liste des fichiers après un fichier nommé test linux
Bonjour
j'ai essayé de faire le script suivant pour récupérer la liste des fichiers dans un répertoire log après un fichier nommé test.log
pour ensuite lire ces fichiers et sortir les messages d'erreur de chaque fichier.
mais je n'arrive pas comment lister les fichiers qui sont créer après le fichier test.log puis le lires . je bloque.
le début de script est comme ceci. Je pointe sur le bon dossier puis je fais un find sur le fichier test.log puis je n'arrive pas a trouvé la logique( genre after find file=test.log , lister moi les fichiers d'après nommées test1.log , test2.log etc )
DAT="$(date +%Y%m%d)"
if [ "${DAT:6:2}" -ne "01" ] ; then
DAT="$(date +%Y%m)"
else
DAT="$(date -d "$DAT - 1 day " +%Y%m)"
fi
Ch="/app/HRAS/prod/logs/hraccess/"${DAT}
echo $Ch
file=$(find $Ch/*test.log* -type f -mtime -1)
Merci
Dernière modification par AFR33 (Le 02/06/2022, à 11:07)
Hors ligne
#2 Le 02/06/2022, à 12:30
- pingouinux
Re : recuperer liste des fichiers après un fichier nommé test linux
Bonjour,
Tu peux essayer ceci :
find repertoire_de_depart -name test\*.log -newer test.log
Hors ligne
#3 Le 02/06/2022, à 15:29
- AFR33
Re : recuperer liste des fichiers après un fichier nommé test linux
Bonjour
J'ai testé de faire ça , sauf il manque encore de choses , comment je dois récupèrer les messages de grep et le structuré dans mon fichiers de sortie
exemple dans un fichier test1.log j'ai le message fin anormal dans la dernière ligne puis j'ai un message avec erreur je voulais dans mon fichier de sortir avoir l'entête avec :
nomfichier;motcleerror;nberror
test1;finanromal;1
test1;erreur;1
je bloque sur ça , voilà mon code
echo "NomFichier;MotcleError;NbERROR" > ${FicLOG}
LISLOG="$TMP/list_log.txt"
rm -f $LISLOG
DAT="$(date +%Y%m%d)"
if [ "${DAT:6:2}" -ne "01" ] ; then
DAT="$(date +%Y%m)"
else
DAT="$(date -d "$DAT - 1 day " +%Y%m)"
fi
Ch="/app/HRAS/prod/logs/hraccess/"${DAT}
echo $Ch
file=$(find $Ch/*HRSYSTEM.K00.X00PX-DEBPLAN* -type f -mtime -1)
for i in $file;
do
find $Ch -type f ! -empty -newer $i >> $LISLOG
done
cat $LISLOG | while read j
do
NbERROR=$(cat $j | grep 'warning|erreur|FIN ANORMALE' | wc -l)
echo $NbERROR
if [ "$NbERROR" -ne "0" ] ; then
echo "$j;erreur;;$NbERROR" >> ${FicLOG}
fi
done
sauf la ligne
echo "$j;erreur;;$NbERROR" >> ${FicLOG}
pas vraiment correct car je peux trouvé tout ce que j'ai dans grep
help
Hors ligne
#4 Le 02/06/2022, à 16:01
- iznobe
Re : recuperer liste des fichiers après un fichier nommé test linux
Bonjour , ton script parait tres complexe pour ce que tu desires faire .
En prenant la base de @pingouinux ,
1er ligne : on stocke la sortie de la commande dans un fichier qui est censé lister les fichiers logs que tu desires .
2eme ligne : c ' est une boucle . on lit le nom de chaque fichier ( un par ligne en theorie ) du fichier de sortie de la 1ere commande && on affiche son contenu . c ' est là que tu peux alors proceder au traitement de tes données .
find repertoire_de_depart -name *.log -newer test.log > stock_log_files
for line in $(cat stock_log_files); do echo "$line" && cat "$line" ; done
Note : tu peux decomposer la boucle en plusieurs lignes afin d ' y introduire ton traitement :
find repertoire_de_depart -name *.log -newer test.log > stock_log_files
for line in $(cat stock_log_files) ; do
echo "$line"
cat "$line"
# ici tu peux traiter le contenu de tes fichiers comme tu le desires .
done
je n' ai pas teste le script , il est fort probable qu ' il y ait des erreurs dans celui-ci , mais ce qui est important c ' est de comprendre la technique
Dernière modification par iznobe (Le 02/06/2022, à 16:06)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#5 Le 02/06/2022, à 16:22
- Watael
Re : recuperer liste des fichiers après un fichier nommé test linux
des fichiers plus récents que le fichier log que tu crées au début du script, il ne doit pas y en avoir beaucoup.
echo "NomFichier;MotcleError;NbERROR" > ${FicLOG}
# où est déféini FICLOG ?
# les accolades sont inutile !
# il faut toujours mettre des guillemets autour des Développements de paramètres
LISLOG="$TMP/list_log.txt"
# où est définit TMP ?
# les noms de variables tout en majuscules sont réservés aux variables d'environnement système
rm -f $LISLOG # les guillemets ! :)
DAT="$(date +%Y%m%d)"
if [ "${DAT:6:2}" -ne "01" ] # 01 est un octal, pas un décimal. à 08 tu vas avoir une erreur.
# et ici les guillemets ont inutiles, puisque tu testes des nombres.
then
DAT="$(date +%Y%m)" # pourquoi rappeler `date' ?
else
DAT="$(date -d "$DAT - 1 day " +%Y%m)"
fi
Ch="/app/HRAS/prod/logs/hraccess/"${DAT} # les guillemets et les accolades ! :)
echo $Ch
file=$(find $Ch/*HRSYSTEM.K00.X00PX-DEBPLAN* -type f -mtime -1)
# il est très maladroit de lister des noms de fichiers dans une variable
for i in $file # parce `for' boucle sur des mots séparés par les caractères inscrit dans l'IFS
do
find $Ch -type f ! -empty -newer $i >> $LISLOG
done
# UUOC ! : `while read line; do ... done <nomFichier'
cat $LISLOG | while read j
do
NbERROR=$(cat $j | grep 'warning|erreur|FIN ANORMALE' | wc -l) # UUOC, et `grep' sait compter, un peu. :)
echo $NbERROR
if [ "$NbERROR" -ne "0" ] ; then
echo "$j;erreur;;$NbERROR" >> ${FicLOG}
fi
done
Dernière modification par Watael (Le 02/06/2022, à 16:35)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 02/06/2022, à 16:31
- iznobe
Re : recuperer liste des fichiers après un fichier nommé test linux
autre precision , car j ' avoue que ta demande de depart n' est pas super claire . si par " apres test.log " tu entends , test1.log , test2.log , test3.log etc , ce n' est pas l ' option -newer qu ' il faut utiliser ( newer c ' est pour des dates plus recentes que ) , mais plutot un joker a la place des numeros des noms de fichiers dans la 1ere ligne de commande en partant du principe que tous les fichiers commencent par test et finissent par .log :
find repertoire_de_depart -name test*.log > stock_log_files
Dernière modification par iznobe (Le 02/06/2022, à 16:37)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#7 Le 02/06/2022, à 16:35
- AFR33
Re : recuperer liste des fichiers après un fichier nommé test linux
Bonjour ,
oui mais par contre comment je vais lire mes fichiers un par un dans stock_log_files et voir quel sont les fichiers qui contiennent les mots clés suivante ( erreur , fin anormale etc)
c'est possible faire grep dans la boucle for
for line in $(cat stock_log_files) ; do
grep 'warning|erreur|FIN ANORMALE' $line
#après ici coomment je vais lui dire de faire un fichier de sortie qui contient le mot clé et le nom de fichier contient cette erreur ?
Hors ligne
#8 Le 02/06/2022, à 16:37
- Watael
Re : recuperer liste des fichiers après un fichier nommé test linux
on ne lit pas un fichier avec une boucle for.
il faut utiliser une boucle while comme je l'ai montré dans les commentaires de ton script.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 02/06/2022, à 16:39
- iznobe
Re : recuperer liste des fichiers après un fichier nommé test linux
c'est possible faire grep dans la boucle for ?
On y fait ce qu ' on veut dans la boucle for , meme une boucle while si besoin , meme si ce n' est pas des plus adequat .
Donc un grep tout a fait possible , cependant il s ' appliquera a chaque fichier qui sera traité dans la boucle .
Dernière modification par iznobe (Le 02/06/2022, à 16:40)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#10 Le 02/06/2022, à 16:46
- iznobe
Re : recuperer liste des fichiers après un fichier nommé test linux
find repertoire_de_depart -name *.log -newer test.log > stock_log_files
for line in $(cat stock_log_files) ; do
echo "$line"
# ici tu peux traiter le contenu de tes fichiers comme tu le desires .
cat "$line" | while read j ; do
NbERROR=$(cat $j | grep 'warning|erreur|FIN ANORMALE' | wc -l) # UUOC, et `grep' sait compter, un peu. :)
echo $NbERROR
if [ "$NbERROR" -ne "0" ] ; then
echo "$j;erreur;;$NbERROR" >> ${FicLOG}
fi
done
done
Tu peux inclure la boucle while donnée par @watael pour lire les fichiers dans la boucle for qui liste les fichiers .log .
je n' ai pas repris les noms de variables , c ' est sur que comme ci-dessus , ca ne fonctionnera pas , c ' est juste pour l' exemple .
Dernière modification par iznobe (Le 02/06/2022, à 17:14)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#11 Le 02/06/2022, à 17:13
- Watael
Re : recuperer liste des fichiers après un fichier nommé test linux
non, ce n'est pas ce que j'ai dit.
j'ai dit : ON N'UTILISE PAS UNE BOUCLE `FOR' POUR LIRE UN FICHIER !!!
personne ne m'écoute. ouin!
on reprend :
find repertoire_de_depart -name "*.log" -newer test.log -print0 | while IFS='' read -d '' ficName; do : ce que vous voulez avec "$ficName"; done
vous pouvez faire autrement, mais
« y en a qu'ont essayé. Ils ont eu des problèmes. »
Dernière modification par Watael (Le 02/06/2022, à 20:00)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#12 Le 02/06/2022, à 17:20
- diesel
Re : recuperer liste des fichiers après un fichier nommé test linux
« y en a qu'on essayé. Ils ont eu des problèmes. »
"Cela dit, il est très rapide"
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#13 Le 02/06/2022, à 17:34
- iznobe
Re : recuperer liste des fichiers après un fichier nommé test linux
mouai , ben chez moi ca marche tres bien pourtant :
pi@raspberrypi:~ $ sudo find /var/log -name *.log > stock_log_files
pi@raspberrypi:~ $ cat stock_log_files
/var/log/log2ram.log
/var/log/dpkg.log
/var/log/mail.log
/var/log/alternatives.log
/var/log/Xorg.0.log
/var/log/apache2/access.private.log
/var/log/apache2/access.log
/var/log/apache2/error.private.log
/var/log/apache2/error.log
/var/log/apache2/other_vhosts_access.log
/var/log/lightdm/lightdm.log
/var/log/lightdm/x-0.log
/var/log/wicd/wicd.log
/var/log/kern.log
/var/log/boot.log
/var/log/daemon.log
/var/log/apt/term.log
/var/log/apt/history.log
/var/log/auth.log
/var/log/user.log
pi@raspberrypi:~ $ for line in $(cat stock_log_files) ; do echo "$line" ; done
/var/log/log2ram.log
/var/log/dpkg.log
/var/log/mail.log
/var/log/alternatives.log
/var/log/Xorg.0.log
/var/log/apache2/access.private.log
/var/log/apache2/access.log
/var/log/apache2/error.private.log
/var/log/apache2/error.log
/var/log/apache2/other_vhosts_access.log
/var/log/lightdm/lightdm.log
/var/log/lightdm/x-0.log
/var/log/wicd/wicd.log
/var/log/kern.log
/var/log/boot.log
/var/log/daemon.log
/var/log/apt/term.log
/var/log/apt/history.log
/var/log/auth.log
/var/log/user.log
pi@raspberrypi:~ $
l ' interet ici , c ' est que le fichier comporte un nom de fichier par ligne . Dans le cas present , ca rend facile la demarche de traitement de fichiers et de verification manuelle .
Evidemment on peut toujours raccourcir au maximum et rendre un script plus obscur en moins de ligne et de commandes .
Cependant , au depart , je prefere un script plus long et plus clair , plutot que , plus court , plus obscur et difficilement modifiable .
Surtout pour quelqu ' un , qui apparemment a un peu de mal a se depatouiller et qui aura certainement besoin de modifier encore son script .
Dernière modification par iznobe (Le 02/06/2022, à 17:44)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#14 Le 02/06/2022, à 18:28
- nany
Re : recuperer liste des fichiers après un fichier nommé test linux
Bonjour,
chez moi ca marche
Chezmoicamarche.org ou chezmoicamarche.fr ne sont pas des arguments recevables.
En effet, je peux donner un contre-exemple où « chez moi ça marche pô » :
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - jeudi 02 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$ ls -1 ~/log
'deuxième log.log'
'premier log.log'
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - jeudi 02 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$ find ~/log -name "*.log" > stock_log_files
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - jeudi 02 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$ cat stock_log_files
/home/nany/log/deuxième log.log
/home/nany/log/premier log.log
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - jeudi 02 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$ for line in $(cat stock_log_files) ; do echo "$line" ; cat "$line" ; done
/home/nany/log/deuxième
cat: /home/nany/log/deuxième: Aucun fichier ou dossier de ce type
log.log
cat: log.log: Aucun fichier ou dossier de ce type
/home/nany/log/premier
cat: /home/nany/log/premier: Aucun fichier ou dossier de ce type
log.log
cat: log.log: Aucun fichier ou dossier de ce type
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - jeudi 02 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$
Tandis que là ça marche :
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - jeudi 02 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$ find ~/log -name "*.log" -print0 | while IFS='' read -d '' ficName ; do echo "$ficName" ; cat "$ficName" ; done
/home/nany/log/deuxième log.log
/home/nany/log/premier log.log
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - jeudi 02 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$
Bon, mon exemple n’est pas très parlant car mes fichiers sont vides mais il n’y a pas de message d’erreur de cat.
Hors ligne
#15 Le 02/06/2022, à 21:42
- Watael
Re : recuperer liste des fichiers après un fichier nommé test linux
voici mon fichier :
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Maecenas ultricies nibh erat, nec cursus elit sodales in.
et voici le résultat de sa lecture avec une boucle for :
for i in $(cat ./loremIpsum); do echo "$i"; done
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Vestibulum
facilisis
tristique
purus
quis
vulputate.
c'est pourquoi on ne lit pas un fichier avec une boucle for.
Dernière modification par Watael (Le 02/06/2022, à 21:43)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#16 Le 03/06/2022, à 09:41
- iznobe
Re : recuperer liste des fichiers après un fichier nommé test linux
Bonjour .
Dans le cas de @nany , on est face au probleme recurrent des espaces non traités dans les chemins ( variables ) . des encadrements de guillemet devrait resoudre la situation .
Dans le cas de @watael , on retrouve aussi le soucis des espaces .
Bref , pour que ca marche a tous les coups :
pi@raspberrypi:~ $ nano file
pi@raspberrypi:~ $ cat file
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Maecenas ultricies nibh erat, nec cursus elit sodales in.
pi@raspberrypi:~ $ for line in $(cat file) ; do echo "$line" ; done
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Maecenas
ultricies
nibh
erat,
nec
cursus
elit
sodales
in.
pi@raspberrypi:~ $ for line in $("cat file") ; do echo "$line" ; done
-bash: cat file : commande introuvable
pi@raspberrypi:~ $ for line in $(cat "file") ; do echo "$line" ; done
Lorem
ipsum
dolor
sit
amet,
consectetur
adipiscing
elit.
Maecenas
ultricies
nibh
erat,
nec
cursus
elit
sodales
in.
pi@raspberrypi:~ $ for line in "$(cat "file")" ; do echo "$line" ; done
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Maecenas ultricies nibh erat, nec cursus elit sodales in.
pi@raspberrypi:~ $ for line in "$(cat file)" ; do echo "$line" ; done
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Maecenas ultricies nibh erat, nec cursus elit sodales in.
pi@raspberrypi:~ $
la derniere commande fonctionne sans problemes peu importe le contenu des lignes du fichier ( $file ):
for line in "$(cat file)" ; do echo "$line" ; done
Dernière modification par iznobe (Le 03/06/2022, à 09:44)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#17 Le 03/06/2022, à 12:43
- Watael
Re : recuperer liste des fichiers après un fichier nommé test linux
mais ça ne marche pas :
$ for i in "$(cat ./loremIpsum)"; do echo "$((++n)) >$i<"; done; unset n
1 > lorem ipsum dolor sit amet, consectetur adipiscing elit.
Vestibulum facilisis tristique purus quis vulputate.<
en fait, $i contient tout ce qui est affiché par cat; cela ne constitue qu'1 seule variable.
pour que ça marche à tous les coups, on ne lit pas un fichier dans une boucle for. On utilise une boucle while.
Dernière modification par Watael (Le 03/06/2022, à 12:46)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#18 Le 03/06/2022, à 12:59
- nany
Re : recuperer liste des fichiers après un fichier nommé test linux
Oui, et d’ailleurs, voilà pour mon exemple :
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - vendredi 03 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$ for line in "$(cat stock_log_files)" ; do echo "$line" ; cat "$line" ; done
/home/nany/log/deuxième log.log
/home/nany/log/premier log.log
cat: '/home/nany/log/deuxième log.log'$'\n''/home/nany/log/premier log.log': Aucun fichier ou dossier de ce type
┏[ Ubuntu 22.04 LTS (Jammy Jellyfish) - vendredi 03 juin 2022 ]
┣ nany@stupidcomputer :
┗▶ ~$
Mais peut-être sommes-nous deux à se tromper ?
Hors ligne
#19 Le 04/06/2022, à 12:53
- diesel
Re : recuperer liste des fichiers après un fichier nommé test linux
Vous savez, faire avancer un âne qui n'a pas envie...
Il parait que c'est têtu ces bêbêtes là.
Et plutôt que de porter l'accent sur le type de boucle (chacune a ses avantages et inconvénients en fonction de ce qu'on veut en faire), je pointerais surtout l'inadaptation de l'exploitation du résultat d'une commande 'cat' pour lire le contenu d'un fichier (même combat que pour la commande "ls"). En bash, pour lire des lignes dans un fichier, il y a une commande pour ça qui s'appelle "read".
Et le moyen le plus pratique pour la mettre en œuvre, c'est à l'intérieur d'une boucle "while".
Amicalement.
Jean-Marie
P.S. pour @Nany : nous devons être trois alors.
Dernière modification par diesel (Le 04/06/2022, à 15:18)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#20 Le 04/06/2022, à 15:16
- diesel
Re : recuperer liste des fichiers après un fichier nommé test linux
Oui, Maître. Corrigé
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne