Как ускорить grep для большой истории?

Большое спасибо за ваши комментарии. Возиться с приведенным выше (лучшим описанием этого, основанным на моем недостатке знаний ), это то, что я считаю поведением:

  • Приведенный выше сценарий Eval/gdp, похоже, работает на docker.service. Это приводит к завершению процесса dockerd и его перезапуску. В /var/log/messages не записывается сообщение о том, что процессы завершились со статусом Zero. Если я изменю сценарий, чтобы использовать статус выхода 1, это записывается в файл журнала сообщений как статус = 1, и служба также перезапускается
  • SIGTERM также вызывает остановку docker.service, отсутствие записи кода выхода в /var/log/messages и перезапуск процесса
  • systemctl stop docker.service вызывает остановку процесса и не перезапускает его
  • systemctl stop systemd -udevd останавливает процесс и не перезапускает его, т.е. это похоже на SIGSTOP

Последнее замечание, по-видимому, предполагает, что команда STOP не поддерживает перезапуск=всегда.

2
19.10.2020, 19:18
4 ответа

Вы можете попробовать ripgrep(https://github.com/BurntSushi/ripgrep)На самом деле быстрее и имеет много полезных параметров фильтрации :страница github имеет длинный список функций.

Он есть в репозиториях многих дистрибутивов.

-2
18.03.2021, 23:23

Время от времени можно запускать history >~/.zsh_history.cache. Затем вы можете просмотреть этот файл, а также вывод historyдля тех команд, которые отсутствуют в этом файле.

Я не знаком с zshи поэтому не могу предоставить код для объединения содержимого файла с выводом команды.

-2
18.03.2021, 23:23

Во-первых, если вы не делаете ничего более сложного, чем grep, ограничение совпадений с помощью history -m PATTERNможет быть быстрее, чем grep. Даже если впоследствии вы применяете сложные фильтры, попробуйте добавить простой фильтр с помощью -m, который избавится от большинства нежелательных строк.

Если ограничивающим фактором является время, затраченное на распечатку всей истории с помощью history, существует хакерский способ распечатать часть истории, выбранную с помощью grep (или другого фильтра ). Используйте fc -p, чтобы начать новую историю и заставить ее читать выбранную часть истории. Не проверено:

function format_history {
  fc -p -a =(cat)
  fc -l 1
}
history 1 | grep curl | format_history

Это не очень удобно использовать (вам нужно что-то с обеих сторон конвейера, поэтому вы не можете просто иметь префикс magic_history_filter). И какую скорость он выиграет, если не форматирует всю историю, он может потерять из-за более хитрой сантехники и необходимости использования временного файла (zsh может читать историю только из доступного для поиска файла, а не из конвейера ).

1
18.03.2021, 23:23

Вот простая функция, которая позволит вам быстро найти любую строку в вашей истории:

histgrep() {
  fc -lm "*${1}*" 1 -1
}

или даже быстрее:

histgrep() {
  zmodload -i zsh/parameter
  print -raC2 ${(kv)history[(R)*$1*]}
}

Любой из них выводит номер строки истории перед каждой строкой, поэтому вы можете выполнить нужную строку с помощью !<number>. Например, чтобы вставить номер строки истории 2596 в вашу командную строку, выполните

!2596

, затем нажмите Tab или Введите .

У меня около 3400 строк истории. Выполнение histgrep cdдает мне более 220 строк, но занимает всего около 0,004 секунды с первой версией функции и вдвое меньше со второй версией.

0
18.03.2021, 23:23

Теги

Похожие вопросы