没有行号的Bash历史记录


129

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

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

电流输出:

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

历史图形源。

所需输出:

man history
ls
ll
clear
cd ~
history

历史图形源。

感谢大家的出色解决方案。保罗(Paul)是最简单的人,将为我工作,因为我的bash历史记录大小设置为2000。

我还想分享今天早上发现的一篇很酷的文章。它现在有几个不错的选择,例如将重复的条目保留在bash历史记录之外,并确保多个bash会话不会覆盖历史记录文件:http : //blog.macromates.com/2008/working-with扑朔迷离的历史/


请问为什么cat ~/.bash_history要排除在外?
flow2k

Answers:


204

试试这个:

$ history | cut -c 8-

我们可以通过管道输入history命令的输出,而不是读取文件吗?
cwd

似乎可以工作!您能解释一下它在做什么吗?如果数字为1-10,000,是否可以使用?
cwd

29
man cut。它会删除history命令输出的每一行的前7个字符。如果数量超过99,999,这是我从来没有见过它应该只有问题(我用弹了很多)。但是,如果您担心这一点:history | sed 's/^ *[0-9]* *//'
Keith Thompson

1
我认为@Paul R的解决方案是我所需要的。起初我没有意识到history命令是用空格填充行号,现在cut语法更有意义了:)感谢@Keith Thompson提供的解决方案可用于> 100k个历史记录。
cwd

5
@cwd:如果您的历史记录中有100,000个命令,那么该是时候离开键盘并回家了。如果您已经在家,请出去。8-)}(是的,我知道历史可以在各个会话之间保留。)
Keith Thompson

22

awk 可以帮忙:

history|awk '{$1="";print substr($0,2)}'

如果您的历史悠久,此答案可能会失败。


哈哈,谢谢- substr非常简单,我一直在用history | awk '{for (i=2;i<=NF;i++) printf("%s ", $i);print("\r")}'我的!!
geedoubleya 2014年

17

我很清楚这个问题是针对bash的,许多人宁愿不切换到zsh(提示downvotes ...)

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

zsh> fc -ln 0

(请参阅/server/114988/removing-history-or-line-numbers-from-zsh-history-file


7
其实fc也是bash内置的。唯一的不同是,第一行是1,所以它将是fc -ln 1
wisbucky

//,对此表示敬意,因为我什至在最长的时间内都不知道有Bash的替代方案,直到有人在这样的环境中提出了替代方案。
弥敦道(Nathan Basanese)

11

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

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

从bash manpage

       历史记录格式
              如果设置了此变量且不为null,则将其值用作
              strftime(3)的格式字符串,以打印关联的时间戳
              内置的历史记录会显示每个历史记录条目。如果
              设置此变量后,会将时间戳记写入历史记录
              文件,以便可以在Shell会话之间保留它们。这使用
              历史注释字符,用于区分时间戳和
              其他历史记录。

使用此功能,聪明的技巧是使变量“ print”成为回车符(\r)并清除行(ANSI代码K),而不是实际的时间戳。


使用更晦涩的语法稍微简单一点:HISTTIMEFORMAT=$'\r\e[K'
wjandrea

5
和单行选项:HISTTIMEFORMAT=$'\r\e[K' history
wjandrea

5

或者,您可以使用sed:

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

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

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

1
\+基本正则表达式中的POSIX不兼容。使用\{1,\},如果您sed不支持非标准的\+扩展。
理查德·汉森

4

尽管使用该-c选项进行剪切可用于大多数实际目的,但我认为将历史记录传送到awk将是更好的解决方案。例如:

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

要么

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

这两种解决方案都做同样的事情。历史记录的输出被馈送到awk。然后,Awk会清空第一列,该列与历史命令输出中的数字相对应。在这里awk更方便,因为您不必担心输出数字部分中的字符数。

print $0等价于print,因为默认设置是打印行中显示的所有内容。键入print $0更为明确,但是您可以选择哪种。的行为print $0,只是print使用awk使用时,如果使用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."

4
history -w /dev/stdout

从输出history --help

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

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


3

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

范例:

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

3
如果仍然要运行它sed,则初始剪切是多余的-只需将其添加到表达式中即可。
moopet


1

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

从STDIN或文件中切出字段。

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

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

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

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

  • 使用分号作为定界符,切出每行的第二个和第十个字段: cut -d';' -f2,10

  • 使用空格作为定界符,切出每行的字段3至7: cut -d' ' -f3-7


0

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

cat ~/.bash_history

的确如此,但是OP的第二行:“这里的重点是使用history命令,所以请不要回复cat〜/ .bash_history”
Cireo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.