mercredi 27 mai 2015

grep history

Nous avons l'habitude d'utiliser grep pour filtrer l'output de la commande history.
Mais cette fois, ça ne fonctionne pas:


Pour une raison inconnue grep considère que le flux reçu en input est un fichier binaire.
Bien sûr le problème peut être contourné avec la commande:

[root@rigel ~]# history | grep --binary-file=text restart

Voyons ça en image:


Pourtant auparavant, on n'avait pas besoin de cette option. De plus, cette fois nous sommes root, mais pour un utilisateur ordinaire rien n'est changé: ça fonctionne comme avant!
Quel est ce mystère?
Utilisons file pour déterminer le type du fichier .bash_history:

[root@rigel ~]# file .bash_history 
.bash_history: ISO-8859 text

La clef du mystère est là, car pour toto (utilisateur lambda):

[toto@rigel ~]$ file .bash_history 
.bash_history: UTF-8 Unicode text


Grâce à iconv, nous allons convertir le fichier .bash_history:

[root@rigel ~]# iconv -f ISO-8859-1 -t UTF-8 < .bash_history  > history

et vérifier que le résultat obtenu est celui que nous attendons:


Il reste à copier history dans .bash_history:

[root@rigel ~]# cp history .bash_history 
cp : voulez-vous écraser « .bash_history » ? o
[root@rigel ~]# 

Il faut se déconnecter pour que le changement soit pris en compte: exit puis de nouveau su (sudo -s pour Ubuntu)

Et voilà: