Посмотреть диапазон истории bash

30

Команда historyвыводит всю историю текущего сеанса. Подобно:

1 ls 
2 cd /root
3 mkdir something
4 cd something
5 touch afile
6 ls
7 cd ..
8 rm something/afile
9 cd ..
10 ls
11 history

Для того, чтобы искать предметы, представляющие интерес, я могу труба historyс grepкак

history | grep ls
1 ls
6 ls
10 ls

Я также могу просмотреть последние 3 команды, такие как:

history 3
11 history
12 history | grep ls
13 history 3

Но как мне получить определенный диапазон истории? Например что-то вроде:

history range 4 7
4 cd something
5 touch afile
6 ls
7 cd ..
Слартибартфаст
источник
Вы могли бы перечислить последние xкоманды, а затем передать head.
Братчли
@Bratchley: Для этого мне нужно знать, сколько последних команд нужно выполнить. Примите во внимание, что мои history | grep somethingрезультаты команд, пронумерованных 123 234 345в истории , показаны, и я могу не знать номер последней выполненной команды ( historyв данном случае). Моя последняя команда может быть пронумерована 400, 500 или как угодно. Итак, сначала я должен проверить это число, выяснить разницу, перечислить последние xкоманды, а затем передатьhead
Slartibartfast

Ответы:

52

Вместо этого historyвы можете использовать fc, что позволит вам выбрать диапазон:

fc -l 4 7
cuonglm
источник
4
Он даже принимает отрицательные числа для подсчета с конца, как fc -l -16 -10.
Франклин Ю
хм, удивляюсь, зачем нам нужна целая новая команда, а не просто аргументы для настоящей команды ...
Ринго
10

Если вы должны использовать команду history, направьте ее через sed или awk:

history | sed -n '10,20p'

history | awk 'NR >= 10 && NR <= 20'

В противном случае ответ cuonglm является лучшим вариантом.

G.Gabunia
источник
6
Поскольку у нас плохие альтернативы, комбинация headи tailрешит эту проблему еще менее изящно. Для диапазона 10-> 25 вам придется использовать history | head 25 | tail 15.
Аарон
1

Использование истории с grep в числах строк вокруг команды, которую я ищу, работает лучше всего для меня.

Например, я ищу то, что я сделал ping mybox, более или менее 20 строк.

$ history | grep "ping mybox" 20325 ping mybox

Это строка, 20325поэтому мне просто нужно отобразить строки, начинающиеся с номера в [20320..20339]диапазоне.

$ history | grep ^203[2-3][0-9]

Люк Ириарте
источник
(1) Вы говорите «более или менее 20», но ваш пример показывает -5 и +14. (2) Это не работает для меня, потому что номера истории, кажется, имеют начальные пробелы.
Скотт