You input command in your linux terminal which is very long and hard to remember. It is needed to input the command again to the terminal. You find it hard to search for the command that is needed. You keep pressing up arrow again and again until the required command is found. Time is wasted during this process.
This is where history
command comes in. Go to your linux terminal and type the command history. You will find the list of commands you previously used like this.
In the above image you can see all the previous commands you have used along with their respective numbers. Now let's assume you have to use the command git clone https://github.com/asimdahall/wethanks/
which is number 56
. Now you can execute the command by typing ```
asims-MacBook-Pro:~ !56
which will execute the command on number 56.
Now let'say we have to search the previous command that we have used. For that, we can combine grep with the history command. Let's take a case here. I have to search for the command
```xcrun
simctl shutdown all
``` which I have used before but I don't remember the full command and only remember `xcrun`. So for searching the command, we can combine the `history` and `grep` command like this:
asims-MacBook-Pro:~ asim$ history|grep xcrun
after that you will get the following output
422 xcrun simctl shutdown all
452 xcrun simctl shutdown all
454 xcrun simctl shutdown all
502 history|grep xcrun
you get all the commands where `xcrun` command is used with their respective numbers. Now you can execute the command like this:
asims-MacBook-Pro:~ asim$ !422
which will then execute the needed command.
I am sorry for the bad grammar. Feedbacks and suggestions are kindly welcome. Thank you.
You can follow me on [Twitter](https://twitter.com/asimdahall)
Top comments (4)
If you know the command you're trying to repeat, then
!<starting-string>
is great. Similarly, if you know the command you're trying to repeat, but you need to modify it,!<starting-string>:s/<SEARCH>/<REPLACE>
or even!<starting-string>:gs/<SEARCH>/<REPLACE>
are freaking awesome.Note: This type of advanced command-history usage works in BASH and CSH-derived shells. Dunno about other shell-families.
Big fan of using history, I'd be lost if I didn't have it. My personal way of accessing it on Macs is by using Ctrl + R and that let's you do pretty much the same thing as the grep method and you don't have to do the second line to execute the expression. Give it a try!
If your
.bash_history
file is large (as mine is), piping the output of thehistory
command togrep
can be very slow. For example, my current history file is over 100k lines, and it takes 10+ seconds (on my machine) for the command to complete.A faster method is to simply grep the file directly, which takes under 1 second:
Or, even better, set up a function to do this:
then:
Or if you use Ripgrep (As I do):
super useful,thanks for sharing