我有以下漂亮的小bash函数来在我的历史记录中进行搜索(例如,查找ls命令):
history | grep --color=always ls | sort -k2 | uniq -f 1 | sort -n
我将它打包成一个bash脚本,链接到一个别名( histg )并且效果很好:
#!/bin/bash
if [ "$1" == "-h" ]; then
echo "A bash script to find patterns in history, avoiding duplicates (also non consecutive)"
echo "expands to: XX"
exit 0
fi
HISTSIZE=100000 # need this, because does not read .bashrc so does not know how big a HISTSIZE
HISTFILE=~/.bash_history # Or wherever you bash history file lives
set -o history # enable history
OUTPUT="$(history | grep --color=always $1 | sort -k2 | uniq -f 1 | sort -n)"
echo "${OUTPUT}"
通常,我会得到这种输出:
$ histg SI
16424 git commit -m "working on SI"
16671 git commit -m "updated SI"
17782 cd SI/
但是我想再做一次改进,我不知道如何继续。我希望能够再次快速调用这些命令,但是如您所见,我有一个很大的组织,因此键入!17782
有点长。如果我的历史记录的当前大小是例如17785(我的最大历史记录大小为100000),我希望看到:
$ histg SI
16424 -1361 git commit -m "working on SI"
16671 -1114 git commit -m "updated SI"
17782 -3 cd ~/Desktop/crrt/wrk/SI/
这样我就可以输入-3
知道如何调整我的bash命令添加此列吗?
答案 0 :(得分:1)
第一次尝试时,我的代码没有按预期工作,因为负数不匹配:当前会话历史记录未被考虑在内。所以我将脚本更改为一个函数(添加到.bashrc
)。棘手的部分由awk
处理:
function histg() {
history | grep --color=always $1 | sort -k2 | uniq -f 1 | sort -n \
| awk '
BEGIN { hist_size = '$(history|wc -l)' }
{
n = $1; $1 = ""
printf("%-7i %-7i %s\n", n, n - hist_size, $0)
}'
history -d $(history 1)
}
最后一行删除了历史记录中对histg
的调用,因此负数仍然有意义。