9

Using bash, I save my history with the timestamp.

How do print the history omitting the timestamp?

alias h=history
alias g=grep -i

To find lines that I used for heroku, I type:

> h | g heroku

I'd like to unique the results without the time-stamp, naturally.

This question is somewhat related: How to avoid duplicate entries in .bash_history

However, sometimes I want to see the duplicate in the history to see the context under which a command was run.

  • 3
    history | cut -d " " -f7-1000 | sort | uniq | grep heroku try this out. – devav2 Oct 24 '12 at 01:58
  • Awesome -- I was hoping that history had an option to do what the cut command does. Only issue with the above is that all entries get sorted alphabetically. I'd rather the results get sorted such that the most recently used commands are last, as I'm more likely to use more recently used commands. – justingordon Oct 24 '12 at 09:31

6 Answers6

2

Addition to answer by @devav2

Clear/nullify the history timestamp environment variable

HISTTIMEFORMAT="";

Export the following command,

export HISTCONTROL=ignoredups --> This will ignore the duplicates that are executed in sequence

Zanna
  • 70,465
GC 13
  • 291
  • ignoredups makes up error work poorly, because if the recent command is further up in the list, it doesn't get added again. – justingordon Feb 28 '14 at 17:27
  • @justingordon, Yes, using above comment by devav2, I have just added few information useful towards it. – GC 13 Mar 02 '14 at 06:37
  • I'd still like to see the most recent time used, as well as remove any of the older duplicates, not just ones used twice. – justingordon Mar 02 '14 at 18:09
  • @justingordon for your 1st commment, ignoredups will remove duplicates that are in sequence

    so if you want your history in timeline order, use following command

    export HISTCONTROL=ignoredups

    history | cut -d " " -f7-1000 | grep heroku

    further, if you want to see timestamp of a particular command,

    export HISTTIMEFORMAT=" %F %T "

    Hope this seems to be helpful

    – GC 13 Mar 03 '14 at 12:36
  • Raj, this does what I need: "history | cut -d " " -f7-1000 | sort | uniq | grep heroku", but the uniq command only removes duplicate lines adjacent. A simple program could substitute for sort | uniq and do the trick. Just wondering if there was a clever built-in way to do this. – justingordon Mar 03 '14 at 18:05
  • @justingordon sort command will break the relevance which can be useful for finding the context where a command was run. – GC 13 Mar 04 '14 at 11:01
  • To make this work in TTY terminal, remove the space between HISTTIMEFORMAT and =""; i.e. run HISTTIMEFORMAT=""; – dc95 Oct 05 '16 at 01:37
2

Simply, history | sed 's/.[ ]*.[0-9]*.[ ]*//' | uniq | grep -i "heroku"

the sed will remove the any [spaces][numbers][spaces] at the start of each line

for optimization make it

history | grep -i "heroku" | sed 's/.[ ]*.[0-9]*.[ ]*//' | uniq

  • that will only take the history entry number - if there are actually timestamps like 2 2016-10-05 00:26:00 vim .bashrc this is not going to remove them. – Zanna Oct 05 '16 at 07:00
1

The timestamp can be suppressed (or modified) on a per-command basis:

If the HISTTIMEFORMAT variable is set and not null, its value is used as a format string for strftime(3) to print the time stamp associated with each displayed history entry. No time stamps are printed otherwise.

That just leaves the line numbers, which can't be suppressed, but which are padded to a fixed width (for line numbers < 100,000):

printf("%5d%c %s%s\n", line_number, modified ? '*' : ' ', timestamp, line);

Thus, to remove the prefix from each line, we need to snip the first 7 characters (5 digits, 1 marker character, and 1 space) e.g.:

$ HISTTIMEFORMAT= history 10 | cut -c8-

This can easily be added to an alias:

$ alias h='HISTTIMEFORMAT= history | cut -c8-'

Then invoked with e.g.:

$ h | grep whatever
$ h | head -n 10
0

Show unique lines of the command history sorted.

history | sed 's/.[ ]*.[0-9]*.[ ]*//' | sort -u

then add a keyword grep to find a specific keyword,

history | sed 's/.[ ]*.[0-9]*.[ ]*//' | sort -u | grep -w "keyword"

such as this -- if you are looking, say, for all of your unique "ls" commands.

history | sed 's/.[ ]*.[0-9]*.[ ]*//' | sort -u | grep -w "ls"
warrens
  • 111
0

You can also temporarily disable timestamps

HISTTIMEFORMAT="" history

To just list the actual commands, do

HISTTIMEFORMAT="" history | sed 's@ *[0-9]* *@@'

You can make this a function

history-raw() { HISTTIMEFORMAT="" history | sed 's@ *[0-9]* *@@'; }
CervEd
  • 172
  • 7
-1

use simpel:

history | cut -b 28-