Skip to content

Joe Del Rocco

Educator. Engineer. Experimenter.

Menu
  • About
  • Blog
  • CV / Resume
    • Summary
    • Teaching
    • Publications
  • Interests
    • Reading
    • Music
    • Sites / Casts
  • Contact
Menu

Edit UNIX Shell History

Posted on October 6, 2017July 19, 2021 by Joe Del Rocco

On a UNIX system (using bash, though this probably applies to other shells too), the history command not only displays your shell history for you, but it also comes with a suite of options for manipulating it. Though I’ve used UNIX systems here and there for years, I never really knew about this command, and I always figured you would just edit the .bash_history file manually if you needed to make changes. But when I tried to edit it or delete it, I found that it didn’t work the way I thought.

It turns out this is because your command history is actually stored as a working copy in memory, and that .bash_history is the final saved out transcript upon shell exit (or whenever you specify).

First of all, why would you ever want to edit your history, you ask? Well, say you su over to root (or any other shared user) and you’ve done a bunch of fumbling around to get something working. You may or may not want all that idiocy hanging around in the history. Or perhaps you made a typo, and every time you go back into your history, that glaring typo is waiting for you as click-bait. And so on…

Now it goes without saying that anything I’m about to post can be figured out from the man pages of the history command itself. But sometimes that can be overwhelming 😛 I had to Google around to figure out how to edit specific lines based on pattern matching.

Calling history shows your shell history:

[delrocco@localhost ~]$ history
    1  la
    2  cd ../etc/
    3  la
    4  cd profile.d/
    5  la
    6  less ldm.sh
    7  su - root
    8  sudo vi custom.conf
    9  less /etc/gdm/custom.conf
   10  less Init
   11  cd /etc/gdm
   12  cd Init/
   13  less Default
   14  cd ../PreSession/
   15  la
   16  less custom.conf
   17  la
   18  cd ldm/
   19  la
   20  sudo cd ldm

Now history does provide the option -d for removing a specific line by number:

[delrocco@localhost ~]$ history -d 19
[delrocco@localhost ~]$ history
    1  la
    2  cd ../etc/
    3  la
    4  cd profile.d/
    5  la
    6  less ldm.sh
    7  su - root
    8  sudo vi custom.conf
    9  less /etc/gdm/custom.conf
   10  less Init
   11  cd /etc/gdm
   12  cd Init/
   13  less Default
   14  cd ../PreSession/
   15  la
   16  less custom.conf
   17  la
   18  cd ldm/
   19  sudo cd ldm

But I couldn’t figure out how to remove, say, all of my annoying la commands (an alias I have).

What you can do is, call history -w (write) to save out any changes to the .bash_history file right then and there. Then you can edit the file to your hearts content using one of the many great text editing commands on UNIX (awk, sed, shell script, etc.), and then read the file back into the history in working memory. Use option -r to read in the current .bash_history file (and any file you want really) which will be appended to your current history. So if you want to replace it entirely (and not duplicate your history), use option -c first to clear your history.

[delrocco@localhost ~]$ history -w
[delrocco@localhost ~]$ sed -i '/^la/d' .bash_history
[delrocco@localhost ~]$ history -c
[delrocco@localhost ~]$ history -r .bash_history
[delrocco@localhost ~]$ history
    1  cd ../etc/
    2  cd profile.d/
    3  less ldm.sh
    4  su - root
    5  sudo vi custom.conf
    6  less /etc/gdm/custom.conf
    7  less Init
    8  cd /etc/gdm
    9  cd Init/
   10  less Default
   11  cd ../PreSession/
   12  less custom.conf
   13  cd ldm/
   14  sudo cd ldm
   15  history -d 19
   16  history -w
   17  history

Note: You can configure your history to ignore duplicate entries and ignore specific commands. But I haven’t yet figured out if you can ignore a regex pattern…

Note: Even though .bash_history is just a final saved out copy, I was able to delete the file (and not save out current working history) before exiting my session, and when I logged back on, my history was wiped. You would think that if .bash_history is just a dump of working memory, that it should have rewritten upon exit.

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Search

Follow

Subscribe to blog RSS feed View my profile on LinkedIn Visit our Cacti Council! View my profile on GitHub View my profile on Stackoverflow View my Sketchfab models View my ORCID

Tags

books computer science education engineering fish food fun game holiday music nature parks programming remodeling sailing science Star Trek stem travel volunteering
© 2023 Joe Del Rocco | Powered by Minimalist Blog WordPress Theme