Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 21/04/2017, à 00:32

migrec

[Résolu] Remplacement d'un champ dans un fichier texte

Bonjour,

Je bricole un petit script afin de calculer le temps d'utilisation de ma machine et je bloque sur un problème : remplacer un champ par un autre dans un fichier.

michel@basket:~/catecu$ tail -f 2017-04-21.log 
2017-04-21 00:09:59 00:09:59
2017-04-21 00:10:04 00:10:04
2017-04-21 00:10:30 00:10:30
2017-04-21 00:14:10 00:14:10
2017-04-21 00:14:55 00:14:55
2017-04-21 00:29:40 00:29:40

Il s'agit de remplacer le 3ème champ (actuellement le dernier soit "00:29:40") de la dernière ligne. C'est pour la mise à jour de l'heure.

PS : j'ai fait quelques scripts il y a quelques années mais j'ai tout oublié !!

Dernière modification par migrec (Le 21/04/2017, à 16:14)

Hors ligne

#2 Le 21/04/2017, à 01:11

Arbiel

Re : [Résolu] Remplacement d'un champ dans un fichier texte

Bonsoir

Comment définis-tu le champ à remplacer ? Dans ton exemple tu dis le troisième champ de la dernière ligne.

Veux-tu dire toujours le troisième champ de la dernière ligne du fichier, ou un champ qui a une valeur connue, et qui se trouve en troisième position de n'importe quelle ligne, ou encore autre chose ?

Arbiel


Arbiel Perlacremaz
Dell Vostro 3550 Ubuntu 14.04 64 bits (je ne suis pas passé à la 16,04 à cause d'un problème majeur avec crypttab, et de sa déconcertante lenteur)
Protonmail, une messagerie sécurisée

Hors ligne

#3 Le 21/04/2017, à 04:39

Watael

Re : [Résolu] Remplacement d'un champ dans un fichier texte

salut,

le temps d'utilisation [d'une] machine

?
uptime :

$ uptime -p
up 36 minutes

ce n'est pas très bien expliqué :
comment constitues-tu ce fichier ?
tu veux remplacer le troisième champ par quoi ?
pourquoi ? changer l'heure ? comment vas-tu utiliser ce fichier à cette fin ?


eval, c'est mal.

Hors ligne

#4 Le 21/04/2017, à 07:14

pingouinux

Re : [Résolu] Remplacement d'un champ dans un fichier texte

Bonjour,
Pour faire exactement ce que tu demandes (même si je nuis pas très sûr non plus de ce que tu veux) :

$ nouveau_champ=quelque_chose

$ sed -r "\$s/[0-9:]+$/$nouveau_champ/" 2017-04-21.log
2017-04-21 00:09:59 00:09:59
2017-04-21 00:10:04 00:10:04
2017-04-21 00:10:30 00:10:30
2017-04-21 00:14:10 00:14:10
2017-04-21 00:14:55 00:14:55
2017-04-21 00:29:40 quelque_chose

Hors ligne

#5 Le 21/04/2017, à 08:24

migrec

Re : [Résolu] Remplacement d'un champ dans un fichier texte

Bonjour,
La dernière solution semble convenir à ce que je veux faire pour l'instant mais fonctionne sur le dernier champ. Comment faire si dans le futur, j'ai un 4ème champ ?

Pour Watael, uptime donne simplement le temps de fonctionnement de la machine depuis le dernier reboot. Je cherche à connaître le temps passé par l'utilisateur : pour ça, je me base sur la sortie de xprintidle qui m'affiche en ms le temps depuis la dernière action (souris, clavier).
Mon script écrit la date, l'heure de sortie du mode idle et écrit immédiatement la même date (3ème champ). Toutes les 10 secondes, je vérifie si une dernière action a eu lieu dans les 30 dernière secondes et si c'est le cas, je vais justement modifier ce dernier champ.

Pour Arbiel, ça sera effectivement toujours le 3ème champ de la dernière ligne. Ce champ contiendra une heure. J'envisage d'ajouter un 4ème champ avec le cumul journalier.

Dernière modification par migrec (Le 21/04/2017, à 08:26)

Hors ligne

#6 Le 21/04/2017, à 09:24

pingouinux

Re : [Résolu] Remplacement d'un champ dans un fichier texte

Je te propose ceci (il y a sans doute plus simple) qui devrait te convenir :

$ cat 2017-04-21.log
2017-04-21 00:09:59 00:09:59 quatrième_1
2017-04-21 00:10:04 00:10:04 quatrième_2
2017-04-21 00:10:30 00:10:30 quatrième_3
2017-04-21 00:14:10 00:14:10 quatrième_4
2017-04-21 00:14:55 00:14:55 quatrième_5
2017-04-21 00:29:40 00:29:40 quatrième_6

$ sed -r '$s/(([^ ]+ ){2})([^ ]+( |$))(.*)/\1'"$nouveau_champ"'\4\5/' 2017-04-21.log
2017-04-21 00:09:59 00:09:59 quatrième_1
2017-04-21 00:10:04 00:10:04 quatrième_2
2017-04-21 00:10:30 00:10:30 quatrième_3
2017-04-21 00:14:10 00:14:10 quatrième_4
2017-04-21 00:14:55 00:14:55 quatrième_5
2017-04-21 00:29:40 quelque_chose quatrième_6

Hors ligne

#7 Le 21/04/2017, à 13:14

migrec

Re : [Résolu] Remplacement d'un champ dans un fichier texte

Merci ! Ça fonctionne. Si j'ai bien compris :
$ : dernière ligne du fichier
(([^ ]+ ){2}) : chaîne contenant tout sauf un espace répété à l'infini avec l'espace de fin (et répété 2 x donc on arrive au début du champ 3)
([^ ]+( |$)) : idem mais la fin est soit une fin de ligne, soit un espace. C'est mon 3ème champ
(.*) : tous les autres caractères qui suivent

Est-ce que c'est bien ça ?
J'ai encore une question concernant le le \5 dans la substitution. D'après ta ligne, je ne vois pas à quoi il correspond puis que le champ 4 contient tout le reste de la ligne non ?

Hors ligne

#8 Le 21/04/2017, à 15:22

pingouinux

Re : [Résolu] Remplacement d'un champ dans un fichier texte

Est-ce que c'est bien ça ?

Oui.

J'ai encore une question concernant le le \5 dans la substitution. D'après ta ligne, je ne vois pas à quoi il correspond puis que le champ 4 contient tout le reste de la ligne non ?

La numérotation des champs se fait dans l'ordre des parenthèses ouvrantes.

sed -r '$s/(([^ ]+ ){2})([^ ]+( |$))(.*)/\1'"$nouveau_champ"'\4\5/' 2017-04-21.log
           12           3     4     5

Hors ligne

#9 Le 21/04/2017, à 16:14

migrec

Re : [Résolu] Remplacement d'un champ dans un fichier texte

pingouinux a écrit :

La numérotation des champs se fait dans l'ordre des parenthèses ouvrantes.

Merci !

Hors ligne