没有行号的 Bash 历史记录

Bash history命令非常酷。我理解它为什么显示行号,但是有没有办法可以调用 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-history-in-bash/

72473 次浏览

试试这个:

$ history | cut -c 8-

history命令没有禁止显示行号的选项。正如每个人所建议的那样,你必须将多个命令结合起来:

例如:

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

awk可以提供帮助:

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

如果你有很长的历史,这个回答 可能会失败。

或者,您可以使用 sed:

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

使用别名,您可以将其设置为标准(将其放在 bash _ profile 中) :

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

你可能想试试 https://github.com/dvorka/hstr,它允许对 Bash 历史记录进行“建议框式”过滤,并且(可选)基于排序的指标,也就是说,它在前进和后退方向上都更有效、更快:

enter image description here

它可以很容易地绑定到 Ctrl-r和/或 Ctrl-s

虽然与 -c选项削减工程最实际的目的,我认为管道的历史将是一个更好的解决方案。例如:

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

或者

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

这两种解决方案做同样的事情。历史的产物正在被灌输给人们。Awk 然后空出第一列,该列与 history 命令输出中的数字相对应。这里 awk 更方便,因为您不必关心输出的数字部分中的字符数。

print $0等价于 print,因为默认值是打印出现在行上的所有内容。键入 print $0更加明确,但是选择哪一个取决于您。如果使用 awk 打印文件,则 print $0和简单的 print的行为会更加明显(cat的输入速度会比 awk 更快,但这只是为了说明一个问题)。

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

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

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

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

[例]当历史线跨越多行时使用 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."

如果您愿意切换到 而不是 bash,那么 zsh 本地支持这一点(以及历史格式化的其他选项)

zsh> fc -ln 0

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

我在这个问题上迟到了,但是更简短的方法是在 ~/.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.

使用这个功能,一个聪明的黑客包括使变量“打印”回车(\r)和清除行(ANSI 代码 K) ,而不是实际的时间戳。

您可以使用命令 cut来解决这个问题:

从 STDIN 或文件中删除字段。

  • 删除 STDIN 每行的前16个字符: cut -c 1-16

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

  • 删除从第三个字符到每行结尾的所有内容: cut -c3-

  • 用冒号作为字段分隔符(默认的分隔符是 tab) ,去掉每行的第五个字段: cut -d':' -f5

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

  • 用一个空格作为分隔符,将每行中的3到7个字段剪掉: cut -d' ' -f3-7

history -w /dev/stdout

history --help的输出:

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

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

我知道我参加派对要迟到了,但是这个更容易记住:

cat ~/.bash_history

如果您试图发送您的历史没有行号到一个文件,并希望有以后的参考文件,请阅读以下内容:

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

上面的命令将把历史记录的内容读入一个名为 history 的文本文件中。它将允许您在项目进展过程中使用不同的版本。

我喜欢它,因为它帮助我在执行 bash 脚本(眨眼)时简化自动化