将历史反向行号添加到bash脚本中

时间:2018-04-12 14:31:09

标签: bash shell

我有以下漂亮的小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命令添加此列吗?

1 个答案:

答案 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的调用,因此负数仍然有意义。