[HS] si mon fichier contient la premiere ligne

Le
David Martin
--f403045ebee62340330550e35e47
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Bonjour à tous,

C'est tout bête mais je ne vois pas comment je peux faire un controle =
sur
une ligne.

J'ai un fichier, dans lequel je génére une ligne d'éxéc=
ution (un resultat
d'un bash), si j'en ai plusieurs
c'est que j'ai un problème dans l'éxécution de mon script.

Comment puis-je faire pour controler si j'ai strictement et seulement une
seule ligne dans ce fichier,
mais si j'en ai plusieurs ça ne va pas ?

echo "c'est bon"


echo "c'est pas bon"

Je pourrais faire un controle si il est vide ou pas, mais ce n'est pas =
a
dont j'ai besoin

Si vous avez une idée ?


--
david martin

--f403045ebee62340330550e35e47
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir="ltr">Bonjour à tous,<div><br></div><div>C&#39;est tout b=
ête mais je ne vois pas comment je peux faire un controle sur une lign=
e.</div><div><br></div><div>J&#39;ai un fichier, dans lequel je gén=
re une ligne d&#39;éxécution (un resultat d&#39;un bash), si j=
&#39;en ai plusieurs</div><div>c&#39;est que j&#39;ai un problème dans=
l&#39;éxécution de mon script.</div><div><br></div><div>Comment =
puis-je faire pour controler si j&#39;ai strictement et seulement une seule=
ligne dans ce fichier,</div><div>mais si j&#39;en ai plusieurs ça ne =
va pas ?</div><div><br></div><div>echo &quot;c&#39;est bon&quot;</div><div>=
<br></div><div><br></div><div>echo &quot;c&#39;est pas bon&quot;</div><div>=
<br></div><div>Je pourrais faire un controle si il est vide ou pas, mais ce=
n&#39;est pas ça dont j&#39;ai besoin</div><div><br></div><div>Si vou=
s avez une idée ?</div><div><br></div><div><div><br></div>-- <br><div =
class="gmail_signature" data-smartmail="gmail_signature"><div dir="lt=
r">david martin<div><br></div></div></div>
</div></div>

--f403045ebee62340330550e35e47--
Vos réponses Page 2 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Daniel Huhardeaux
Le #26435030
Le 02/06/2017 à 09:10, David Martin a écrit :
[...]
Je me demande bien comment faire ça, je peux rajouter dans le script
en crontab, de générer un fichier
qui contiendrait la date du jour + heure et minute du genre
/tmp/time
20170905 (pour 9h05)
mais comment et avec quoi faire la comparaison pour savoir qu'à la
prochaine génération du fichier /tmp/time c'est bon ou pas.


Utilise incron qui est un cron like permettant de gérer les événements
concernant la gestion d'un système de fichier.
--
Daniel
David - DCPC
Le #26435029
--f403045c2cf2af14c70550f50cfd
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Bonjour,
Si tu as un mot ou phrase clé unique dans ta ligne ET dans ton fichier ,
pourquoi ne pas faire un simple grep -c <mot_clé> ?
ça te diras combien de fois ta chaîne existe dans le fichier, et si c'est
unique, du coup tu as l'occurrence de ta ligne.
David
Le 2 juin 2017 à 08:50, David Martin
Lorenzo,
merci pour ton annalyse, je ne construit pas le fichier, c'est une
application métier.
Je vais essayer de le rajouter le n pour voir
--
david martin


--
Salutations,
David CHALON
--f403045c2cf2af14c70550f50cfd
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
</font></span></div></div>
</div><br><br clear="all"><br>-- <br><div class="gmail_sig nature" data-smartmail="gmail_signature">Salutations,<br>David CHALON</di v>
</div>
--f403045c2cf2af14c70550f50cfd--
Lorenzo Bernardi
Le #26435057
On 06/02/2017 09:10 AM, David Martin wrote:
Tu avais raison, avec le n ça fonctionne j'ai bien le compteur à 1

on peut utiliser l'astuce donnée par David Chalon faire un grep
[ "$(grep utilisateur BatchMajInfoUtilisateurEmargos20170602090001.log |
wc -l)" == "1" ] && echo 'ok' || echo 'KO'
devrait marcher.
Je vais remonter cette annomalie pour qu'il rajoute le n dans le
fichier généré,
en attendant on me demande de faire une moulinette qui vérifie que le
script qui génère ce fichier
soit bien exécuter toutes les 15 mintues. voici son vrai nom :
voici : BatchMajInfoUtilisateurEmargos20170602090001.log
C'est ce fameux fichier qui doit contenir le n
Je me demande bien comment faire ça, je peux rajouter dans le script
en crontab, de générer un fichier
qui contiendrait la date du jour + heure et minute du genre

je ne comprends pas trop le problème. Je veux dire tu veux savoir si le
fichier a été crée il y a moins de 15 minutes. En unix on ne connait pas
la date de création d'un fichier mais en fait dans ton cas cela ne doit
pas être un problème car j'imagine que la moulinette réécrit le meme
fichier à chaque fois.
donc la commande stat doit pouvoir etre utiliser
par exemple
stat toto.txt
renvoie
File: toto.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty
file
Device: fe01h/65025d Inode: 537127084 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ AAAA) Gid: ( 1001/ AAAA)
Access: 2017-06-02 11:21:00.848700391 +0200
Modify: 2017-06-02 11:21:00.848700391 +0200
Change: 2017-06-02 11:21:00.848700391 +0200
Birth: -
donc les date d'Acces de modification et de changement sont les meme.
C'est la date de creation. Comme tu modifie pas le fichier à priori on
doit pouvoir utiliser la date de modify.
On peut donc utiliser le script suivant.
# on recupere la valeur de modify et on extrait la date que l'on
converti en timestamp (durée en seconde depuis 1970)
stattime=$(date -d "$(stat toto.txt | grep Modify | cut -c8-27)" +%s)
# on fait la différence entre la date courante et la date de
modification de fichier.
diff=$(( $(date +%s) - $stattime ))
# on calcule si cette difference est superieur a 15*60 secondes
[ $diff -gt 600 ] && echo "more than 600" || echo "less than 600"

Tu mets ces lignes et tu lance un cron toute les x minutes qui verfie
que tout est bon et si cela dépasse 15 minutes (le truc more than 600)
tu fais quelque chose (envoi d'un courriel ou autre).
Bien sur il faut tester le truc et faire attention au fait que je teste
le fichier toto.txt et pas ton fichier.
Le | grep Modify récupére la chaine de caractères Modify de la commande
stat et le cut -c8-27 récupére la chaine de caractères entre la 8 et la
27 eme position de la chaine initiale. Il faut bien regarder si cela
colle avec la sortie de stat sur ta machine.
Le timestamp est utile car comme cela on ne fait qu'une soustraction en
seconde.
Je suis pas très bon en bash et il faut peut être rajouter des tests
pour être sur que le fichier existe ou autre subtilités.
Desolé si j'ai pas bien compris le problème
L.
=c3
Le #26435075
Charles Plessy, le 2017-06-02 :
Bonjour, c'est vendredi !

Bonjour, béni soit le vendredi !
pourquoi s'ennuyer avec des outils standards alors qu'on a Perl
6 ?

Pourquoi s'ennuyer avec des outils alors qu'il y a tout ce qu'il
faut, tout frais compilé, au sein même des shells bash 3 et
plus ? :-D
Si le fichier à lire est `fichier`, alors les trois commandes
suivantes devraient marcher :
$ builtin mapfile lignes < "fichier"
$ builtin test 1 = "${#lignes[@]}" && builtin echo ok
Considérant les fichiers `fichier0` à `fichier3` suivants et leur
contenu :
$ xxd fichier0 # vide
$ xxd fichier1 # une ligne sans caractère de fin de ligne
00000000: 6e6f 656f 6c noeol
$ xxd fichier2 # une ligne avec caractère de fin de ligne
00000000: 656f 6c0a eol.
$ xxd fichier3 # deux lignes
00000000: 6c31 0a6c 320a l1.l2.
Les résultat des commandes pour chacun de ces fichier est
disponible dans la copie d'écran suivante :
$ builtin mapfile lignes < "fichier0"
$ builtin test 1 = "${#lignes[@]}" && builtin echo ok
$ builtin mapfile lignes < "fichier1"
$ builtin test 1 = "${#lignes[@]}" && builtin echo ok
ok
$ builtin mapfile lignes < "fichier2"
$ builtin test 1 = "${#lignes[@]}" && builtin echo ok
ok
$ builtin mapfile lignes < "fichier3"
$ builtin test 1 = "${#lignes[@]}" && builtin echo ok
Bonne fin de builtin vendredi et bon builtin week-end,
--
builtin Étienne Mollier
Publicité
Poster une réponse
Anonyme