没有行号的Bash历史记录

时间:2011-08-18 15:37:39

标签: linux bash

bash history命令非常酷。我理解为什么它显示行号,但有没有办法可以调用历史命令并抑制行号?

这里的要点是使用历史命令,所以请不要回复cat ~/.bash_history

当前输出:

  529 man history
  530 ls
  531 ll
  532 clear
  533 cd ~
  534 history

Historical graphic source.

期望的输出:

man history
ls
ll
clear
cd ~
history

Historical graphic source.

感谢大家的出色解决方案。保罗是最简单的,并且对我有用,因为我的bash历史大小设定为2000.

我还想分享今天早上发现的一篇很酷的文章。它有几个很好的选项,我现在正在使用,比如保留bash历史记录中的重复条目,并确保多个bash会话不会覆盖历史文件:http://blog.macromates.com/2008/working-with-history-in-bash/

11 个答案:

答案 0 :(得分:168)

试试这个:

$ history | cut -c 8-

答案 1 :(得分:17)

awk可以提供帮助:

history|awk '{$1="";print substr($0,2)}'
如果您的历史很长,

This answer可能会失败。

答案 2 :(得分:11)

我非常清楚这个问题是针对bash而且很多人宁愿不切换到zsh(cue downvotes ...)

但是,如果您愿意切换到 zsh ,则zsh本机支持此功能(以及其他历史记录格式选项)

zsh> fc -ln 0

(见https://serverfault.com/questions/114988/removing-history-or-line-numbers-from-zsh-history-file

答案 3 :(得分:10)

我迟到了,但更短的方法是在~/.bashrc~/.profile文件中添加以下内容:

HISTTIMEFORMAT="$(echo -e '\r\e[K')"

来自bash manpage

       HISTTIMEFORMAT
              If this 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 history entry displayed by the history builtin.  If
              this variable is set, time stamps are written to the history
              file so they may be preserved across shell sessions.  This uses
              the history comment character to distinguish timestamps from
              other history lines.

使用此功能,智能黑客包括使变量“print”成回车(\r)并清除行(ANSI代码K)而不是实际时间戳。

答案 4 :(得分:5)

或者,您可以使用sed:

history | sed 's/^[ ]*[0-9]\+[ ]*//'

使用别名,您可以将其设置为标准(将其粘贴在bash_profile中):

alias history="history | sed 's/^[ ]*[0-9]\+[ ]*//'"

答案 5 :(得分:3)

history命令没有禁止行号的选项。你必须按照每个人的建议组合多个命令:

示例:

history | cut -d' ' -f4- | sed 's/^ \(.*$\)/\1/g'

答案 6 :(得分:2)

$ hh -n

您可能想尝试https://github.com/dvorka/hstr,它允许使用(可选)基于排序的指标对Bash历史记录进行“建议框样式”过滤,即在前向和后向方向上效率更高,速度更快:

enter image description here

可以轻松绑定到 Ctrl-r 和/或 Ctrl-s

答案 7 :(得分:2)

虽然使用-c选项进行剪切可以用于大多数实际目的,但我认为awk的管道历史将是更好的解决方案。例如:

history | awk '{ $1=""; print }'

OR

history | awk '{ $1=""; print $0 }'

这两种解决方案都做同样的事情。历史的输出正在被输入awk。然后awk会清空第一列,它对应于history命令输出中的数字。这里awk更方便,因为您不必关心输出数字部分中的字符数。

print $0相当于print,因为默认设置是打印行上显示的所有内容。键入print $0更明确,但您选择哪一个取决于您。如果您使用awk打印文件,那么print $0和简单print与awk一起使用时的行为会更明显(cat会更快输入而不是awk,但这是为了说明一点)。

[Ex]使用awk显示$ 0的文件内容

$ awk '{print $0}' /tmp/hello-world.txt
Hello World!

[Ex]使用awk显示文件内容而不显式$ 0

$ awk '{print}' /tmp/hello-world.txt
Hello World!

[Ex]当历史记录行跨越多行时使用awk

$ history
   11  clear
   12  echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

$ history | awk ' $1=""; {print}'
 clear
 echo "In word processing and desktop publishing, a hard return or paragraph break indicates a new paragraph, to be distinguished from the soft return at the end of a line internal to a paragraph. This distinction allows word wrap to automatically re-flow text as it is edited, without losing paragraph breaks. The software may apply vertical whitespace or indenting at paragraph breaks, depending on the selected style."

答案 8 :(得分:1)

您可以使用命令cut来解决它:

剪切STDIN或文件中的字段。

  • 剪掉每行STDIN的前16个字符: cut -c 1-16

  • 剪下给定文件每行的前16个字符: cut -c 1-16 file

  • 剪切从第3个字符到每行结尾的所有内容: cut -c3-

  • 使用冒号作为字段分隔符(默认分隔符为制表符),剪切每行的第五个字段: cut -d':' -f5

  • 使用分号作为分隔符,剪切每行的第2和第10个字段: cut -d';' -f2,10

  • 使用空格作为分隔符,剪切每行的字段3到7: cut -d' ' -f3-7

答案 9 :(得分:0)

history -w /dev/stdout

来自history --help的输出:

  

-w将当前历史记录写入历史记录文件

它将当前历史记录写入指定的文件-在这种情况下为/dev/stdout

答案 10 :(得分:0)

我知道我参加晚会很晚,但这很容易记住:

cat ~/.bash_history