Contenu | Rechercher | Menus

Annonce

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.

À propos de l'équipe du forum.

#1 Le 17/11/2019, à 23: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, à 15:55)

#2 Le 18/11/2019, à 00: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.

Hors ligne

#3 Le 18/11/2019, à 01: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  wink

Je reviendrais vers toi si demain les yeux grands ouverts, un truc m'échappe ...
J'édite en résolu

#4 Le 18/11/2019, à 15: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 neutral
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, à 15: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.

Hors ligne

#6 Le 18/11/2019, à 15:41

Compte supprimé

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

Yes ça fonctionne  smile
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, à 15:52)

#7 Le 18/11/2019, à 15: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.

Hors ligne

#8 Le 18/11/2019, à 15:54

Compte supprimé

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

Merci. Tout est clair maintenant wink

#9 Le 18/11/2019, à 16:35

kamaris

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

pseudofab a écrit :

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, à 17:11

Compte supprimé

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

Merci pour ces précisions Kamaris wink
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, à 17: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, à 18:13

moko138

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

pseudofab a écrit :

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 neutral
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 !  smile

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, à 18: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 :
moko138 a écrit :

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

moko138 a écrit :

Ouvrir ~/.bash_history avec ton éditeur graphique de texte préféré

Je n'utilise que vim cool
J'utilise souvent contrôle f sur les pdf . C'est vraiment très utile wink
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 hmm .

#14 Le 18/11/2019, à 19: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, à 19:25

Compte supprimé

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

C'est bien ça wink

~ 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, à 21: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, à 21:34)

#17 Le 27/11/2019, à 01:49

moko138

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

pseudofab a écrit :

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, à 01: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, à 02: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. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 27/11/2019, à 09: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, à 09:35

Compte supprimé

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

smile
@moko138:
Je retiens l'utilisation de /tmp/tempory wink . 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, à 09:52

Compte supprimé

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

Lucie.Tri a écrit :

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, à 11:00

moko138

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

pseudofab a écrit :

@moko138:
Je retiens l'utilisation de /tmp/tempory wink . 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"

smile


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#24 Le 27/11/2019, à 11:23

Compte supprimé

Re : [Résolu]Effacer dans history les lignes contenant une cmd précise

moko138 a écrit :
pseudofab a écrit :

@moko138:
Je retiens l'utilisation de /tmp/tempory wink . 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 wink
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, à 11:30)

#25 Le 27/11/2019, à 11: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