#1 Le 17/11/2019, à 22:13
- Compte supprimé
[Résolu]Effacer dans history les lignes contenant une cmd précise
Bonsoir,
Je cherche à effacer toutes les lignes dans mon history contenant la commande trans
J'ai fait ceci mais ce n'est pas fonctionnel :
history | grep 'trans' | awk '{history -d "$1"}'
Comment m'y prendre?
Question subsidiaire : Lorsque je consulte le man de awk, je tombe sur gawk . Faut il privilégier gawk?
Merci
Dernière modification par Compte supprimé (Le 18/11/2019, à 14:55)
#2 Le 17/11/2019, à 23:22
- Watael
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
salut,
avant tout, il y a un problème d'ordre d'exécution:
admettons un liste
1
2
3
si, avec history, tu supprimes 2, history va réindexer la liste
1
2
la suite du traitement voulant effacer 3 va échouer
il faut donc effacer en commençant par la fin, et donc stocker les index à effacer pour les parcourir à rebours.
de plus, history -d semble n'accepter qu'un seul paramètre à la fois
while read n; do history -d $n; done < <(awk '$2=="printf"{ar[++n]=$1}END{for(i=n;i>0;i--)print ar[i]}' < <(history))
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 18/11/2019, à 00:09
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Merci Watael,
Grace à tes explications comprends pourquoi ma ligne de commande ne fonctionne pas .
Par contre, je ne saisie pas pleinement ta ligne de commande ... je serais plus attentif demain (je fatigue) .
En tous cas elle est fonctionnelle
Je reviendrais vers toi si demain les yeux grands ouverts, un truc m'échappe ...
J'édite en résolu
#4 Le 18/11/2019, à 14:12
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Je rouvre le sujet:
Sur mes pc (Mate 16.04, Mate 18.04), history -d ne modifie pas le fichier cat /home/$USER/.bash_history .
Du coup quand je ferme mon terminal puis le rouvre, les lignes effacées réapparaissent
J'ignore si cela est dû à problème spécifique au terminal de mate (un bug?) ,cependant ça rend la commande inutilisable ...
#5 Le 18/11/2019, à 14:20
- Watael
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
sauvegarde ton fichier history (histoire de pouvoir comparer, au moins), et ajoute un history -w à la suite de la ligne de commande indiquée.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#6 Le 18/11/2019, à 14:41
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Yes ça fonctionne
Il me reste à bien saisir ta commande. (Pas facile à lire de droite à gauche)
Tu peux m'expliciter à quoi servent les parenthèses de (history) **et le fonctionnement du END car même après lecture du man ma compréhension reste vague ....
(awk '$2=="printf"{ar[++n]=$1}END{for(i=n;i>0;i--)print ar[i]}' < <(history))
Peut être que sous une forme, ça m'aiderai à mieux l'appréhender ..
edit :** ça c'est ok
edit2 END signifierait t'il que for(i=n;i>0;i--)print ar[] doit être fini avant de passer à la commande awk '$2=="printf"{ar[++n]=$1 ?
Dernière modification par Compte supprimé (Le 18/11/2019, à 14:52)
#7 Le 18/11/2019, à 14:52
- Watael
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
END est une instruction awk, qui est exécutée quand tout a été lu.
les substitution de processus (<(...)) fonctionne comme un pipe (c'est ±équivalent à cmd | cmd), mais sans créer de sous-shell.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#8 Le 18/11/2019, à 14:54
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Merci. Tout est clair maintenant
#9 Le 18/11/2019, à 15:35
- kamaris
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Question subsidiaire : Lorsque je consulte le man de awk, je tombe sur gawk . Faut il privilégier gawk?
Il est probable que awk pointe vers gawk chez toi.
Gawk contient awk, mais l'inverse est faux. Pour des raisons de portabilité, il vaudrait mieux privilégier awk, de même que sed sans les extensions GNU, de même que bash sans les bashismes, etc.
Après, si tu restes tranquillement sur ton système avec tes scripts, tu peux faire ce que tu veux, mais c'est peut-être pas mal d'être conscient du fait qu'on utilise les mécanismes POSIX ou des extensions.
Concernant gawk, tu peux l'utiliser avec l'option --lint, pour qu'il te signale, entre autres, ce qui n'est pas portable.
Perso, j'ai défini un alias awk='awk --lint', comme ça, vu que chez moi awk pointe vers gawk, par défaut awk appelle gawk --lint, et si je veux qu'il me laisse tranquille avec ses warnings, j'appelle explicitement gawk pour contourner mon alias.
Hors ligne
#10 Le 18/11/2019, à 16:11
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Merci pour ces précisions Kamaris
Chez moi , je pense que awk appelle aussi gawk par défaut puisqu'avec gawk --lint sur la commande de Watael je rencontre une erreur (plutôt une information non invalidante ).
~ jt'écoute :while read n; do history -d $n; done < <(gawk --lint '$2=="trans"{ar[++n]=$1}END{for(i=n;i>0;i--)print ar[i]}' < <(history))
gawk: ligne de commande:1: (FILENAME=- FNR=835) avertissement : référence à une variable non initialisée « n »
~ jt'écoute :
#11 Le 18/11/2019, à 16:48
- kamaris
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Ça c'est normal, quel que soit le statut de awk, puisqu'ici tu appelles explicitement gawk.
C'est plutôt l'appel réussi de awk --lint qui serait une indication que awk pointe vers gawk.
Mais pour le voir, le mieux est de faire
ls -l /usr/bin/awk
Hors ligne
#12 Le 18/11/2019, à 17:13
- moko138
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Sur mes pc (Mate 16.04, Mate 18.04), history -d ne modifie pas le fichier cat /home/$USER/.bash_history .
Du coup quand je ferme mon terminal puis le rouvre, les lignes effacées réapparaissent
J'ignore si cela est dû à problème spécifique au terminal de mate (un bug?)
Ce n'est ni un bug ni spécifique au terminal de mate, c'est très logique :
l'historique de commande est encore à l'oeuvre, puisque tous tes terminaux ne sont pas fermés.
= =
Accessoirement, tu peux atteindre ton but ("Effacer dans history les lignes contenant une cmd précise") en mode graphique :
1) D'abord fermer tous tes terminaux.
2) Ouvrir ~/.bash_history avec ton éditeur graphique de texte préféré
Ctrl f machin-truc et effacer ou ajouter ce qui te plaît.
3) Ne pas oublier d'enregistrer et de refermer le fichier !
C'est tout !
Ensuite, tu peux rouvrir un terminal.
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#13 Le 18/11/2019, à 17:51
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Kamaris:
Voici le retour :
~ jt'écoute :ls -l /usr/bin/awk
lrwxrwxrwx 1 root root 21 mai 21 2017 /usr/bin/awk -> /etc/alternatives/awk
~ jt'écoute :
Ce n'est ni un bug ni spécifique au terminal de mate, c'est très logique :
l'historique de commande est encore à l'oeuvre, puisque tous tes terminaux ne sont pas fermés.
Non je ferme bien tous mes terminaux ... L'effaçage n'est pris en compte que si je rajoute history -w après mon history -d
Ouvrir ~/.bash_history avec ton éditeur graphique de texte préféré
Je n'utilise que vim
J'utilise souvent contrôle f sur les pdf . C'est vraiment très utile
Le mode manuel n'est pas vraiment utilisable dans mon cas car je peux utiliser 30 fois par jour la commande trans (traducteur google), alors quand je faisais un tour dans mon history je ne voyais que ça .
#14 Le 18/11/2019, à 18:16
- kamaris
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Ah oui c'est vrai, il faut que tu fasses
update-alternatives --display awk
il me semble (n'étant pas sous ubuntu et ne pouvant pas lancer de vm, je ne peux pas vérifier dans l'immédiat).
Hors ligne
#15 Le 18/11/2019, à 18:25
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
C'est bien ça
~ jt'écoute :update-alternatives --display awk
awk - mode automatique
le meilleur lien est /usr/bin/gawk
le lien pointe actuellement sur /usr/bin/gawk
le lien awk est /usr/bin/awk
l'esclave awk.1.gz est /usr/share/man/man1/awk.1.gz
l'esclave nawk est /usr/bin/nawk
l'esclave nawk.1.gz est /usr/share/man/man1/nawk.1.gz
/usr/bin/gawk - priorité 10
lien secondaire awk.1.gz : /usr/share/man/man1/gawk.1.gz
lien secondaire nawk : /usr/bin/gawk
lien secondaire nawk.1.gz : /usr/share/man/man1/gawk.1.gz
/usr/bin/mawk - priorité 5
lien secondaire awk.1.gz : /usr/share/man/man1/mawk.1.gz
lien secondaire nawk : /usr/bin/mawk
lien secondaire nawk.1.gz : /usr/share/man/man1/mawk.1.gz
~ jt'écoute :
#16 Le 26/11/2019, à 20:32
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Bonsoir,
Pour compléter ma demande initiale, comment feriez vous en bash pour que l'on puisse effacer dans history les lignes contenant une commande précise quelque soit sa position ? comme par exemple après un pipe ...
Avec python ça pourrait se construire ainsi:
new = []
with open('/home/fabien/.bash_history','r') as fichier:
[new.append(i) for i in fichier if not 'CMD' in i]
with open('/home/fabien/.bash_history','w') as history:
[history.write(i) for i in new]
Dernière modification par Compte supprimé (Le 26/11/2019, à 20:34)
#17 Le 27/11/2019, à 00:49
- moko138
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
comment feriez vous en bash pour que l'on puisse effacer dans history les lignes contenant une commande précise quelque soit sa position ? comme par exemple après un pipe ...
En attendant les propositions des experts voici ma proposition :
cd; cp -v .bash_history .bashory && grep -Ev "la commande précise" .bashory > /tmp/tempory && mv -v /tmp/tempory .bash_history
Il manquera la dernière ligne dans .bash_history, mais si tu y tiens, tu pourras la rajouter aisément.
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#18 Le 27/11/2019, à 00:58
- kamaris
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Tu peux faire
sed -i '/CMD/d' ~/.bash_history
Hors ligne
#19 Le 27/11/2019, à 01:14
- Watael
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
ouais. plutôt que grep :
sed -i.$(date +%s) '/la commande précise/d' .bash_history
ah! grilled.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#20 Le 27/11/2019, à 08:33
- Lucie.Tri
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Bonjour, moi aussi j'utilise souvent la commande : trans -b et ce serait bien de l'effacer et d'effacer ce qu'elle me répond.
j'ai essayé ceci mais ça ne fait pas le boulot .
cd; cp -v .bash_history .bashory && grep -Ev "trans" .bashory > /tmp/tempory && mv -v /tmp/tempory .bash_history
Une explication ?
Hors ligne
#21 Le 27/11/2019, à 08:35
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
@moko138:
Je retiens l'utilisation de /tmp/tempory . Jusqu'à aujourd'hui j'aurais crée un fichier intermédiaire...
Par contre pourquoi passer par la création de .bashori ? J'imagine que c'est un oubli lors qui fait suite à l'élaboration de la ligne de commande...
grep -Ev "CMD" ~/.bash_history > /tmp/tempory && mv /tmp/tempory ~/.bash_history
@Watael:
à quoi sert la date? je ne vois pas de différence de fonctionnement avec la proposition de @kamaris
avec sed c'est quand même plus simple que la proposition en début de post
#22 Le 27/11/2019, à 08:52
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
Bonjour, moi aussi j'utilise souvent la commande : trans -b et ce serait bien de l'effacer et d'effacer ce qu'elle me répond.
j'ai essayé ceci mais ça ne fait pas le boulot .cd; cp -v .bash_history .bashory && grep -Ev "trans" .bashory > /tmp/tempory && mv -v /tmp/tempory .bash_history
Une explication ?
C'est fonctionnel chez moi . Peut être que dans ton essai, tu n'as pas refermé le terminal (pour que ton history soit enregistré) avant de passer la commande.. Les commandes anciennes ne sont pas effacées?
Qu'en est il?
Pour ce qui est d'effacer ce qu'elle te répond, ce n'est pas nécessaire puisque l'history concerne que les commande passées et non ce qu'elles retournent.
#23 Le 27/11/2019, à 10:00
- moko138
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
@moko138:
Je retiens l'utilisation de /tmp/tempory . Jusqu'à aujourd'hui j'aurais crée un fichier intermédiaire...
Je ne comprends pas ce que tu veux dire, puisque /tmp/tempory est un fichier intermédiaire créé par la commande.
- -
Par contre pourquoi passer par la création de .bashori ? J'imagine que c'est un oubli lors qui fait suite à l'élaboration de la ligne de commande...
grep -Ev "CMD" ~/.bash_history > /tmp/tempory && mv /tmp/tempory ~/.bash_history
.bashori permet de faire un test, et même plusieurs
cd; cp -v .bash_history .bashory && grep -v "la commande précise" .bashory > /tmp/tempory
sans modifier .bash_history (à part l'ajout de la commande testée elle-même).
Donc oui, après validation de tes tests, tu peux supprimer le détour par .bashori dans ta version définitive.
De même, l'option -E est inutile ici ; c'est un reste de mes tests sur plusieurs chaînes :
grep -Ev "la commande précise|ls -l|sudo"
Et en cas de distraction, on peut aussi tester :
grep -Ev "la commande précise|mon mot de passe"
%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel : À la découverte de dcraw
Hors ligne
#24 Le 27/11/2019, à 10:23
- Compte supprimé
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
pseudofab a écrit :@moko138:
Je retiens l'utilisation de /tmp/tempory . Jusqu'à aujourd'hui j'aurais crée un fichier intermédiaire...Je ne comprends pas ce que tu veux dire, puisque /tmp/tempory est un fichier intermédiaire créé par la commande.
En fait, cela vient d'une confusion de ma part . Je pensais que /tmp était monté en Ram, mais je m'aperçois que non
Edit:
Par d'ailleurs je me suis mal exprimé car au final je pensais que ce fichier intermédiaire n'utilise pas mon disque dur mais même dans ce cas il y a bien fichier intermédiaire
Dernière modification par Compte supprimé (Le 27/11/2019, à 10:30)
#25 Le 27/11/2019, à 10:38
- Lucie.Tri
Re : [Résolu]Effacer dans history les lignes contenant une cmd précise
@ pseudofab
J'ai fait un essai : traduction de "il fait beau" en russe
$ trans -b "il fait beau" -t ru
et l'ordinateur m'a répondu : это мило
J'ai donc fermé le terminal. J'ai ré-ouvert et j'ai fait :
cd; cp -v .bash_history .bashory && grep -Ev "trans -b" .bashory > /tmp/tempory && mv -v /tmp/tempory .bash_history
et oui, tu as raison, il a effacé ma commande trans -b "il fait beau" -t ru
Mais j'ai mis un texte plus long, comme ceci :
$ trans - b "Cette contribution de fonde sur trois grands axes :
Un état des lieux des mobilités en Pays de la Loire ;
Les enjeux auxquels le schéma doit permettre de répondre et les objectifs à fixer en conséquence
Les préconisations du CESER pour le futur schéma régional des mobilités" -t es
.
J'ai donc fermé le terminal. J'ai ré-ouvert et j'ai fait :
cd; cp -v .bash_history .bashory && grep -Ev "trans -b" .bashory > /tmp/tempory && mv -v /tmp/tempory .bash_history
et alors je constate qu'il a supprimé la première ligne : trans - b "Cette contribution de fonde sur trois grands axes :
mais qu'il a gardé le reste de la commande. Il a gardé ceci :
Un état des lieux des mobilités en Pays de la Loire ;
Les enjeux auxquels le schéma doit permettre de répondre et les objectifs à fixer en conséquence
Les préconisations du CESER pour le futur schéma régional des mobilités" -t es
.
et moi ça m'intéresserait qu'il efface tout car, lorsque je traduit toute un article ... ça fait beaucoup de lignes .
Voilà donc mon souci !
Hors ligne