Баш, с mapfile
, упоминаемым в комментариях к фиксиману, и на самом деле возможно лучшей версией:
# last [LINES=50]
_last_flush(){ BUF=("${BUF[@]:$(($1-LINES)):$1}"); } # flush the lines, can be slow.
last(){
local LINES="${1:-10}" BUF
((LINES)) || return 2
mapfile -C _last_flush -c $(( (LINES<5000) ? 5000 : LINES+5 )) BUF
BUF=("${BUF[@]}") # Make sure the array subscripts make sence, can be slow.
((LINES="${#BUF[@]}" > LINES ? LINES : "${#BUF[@]}"))
for ((i="${#BUF[@]}"; i>"${#BUF[@]}"-LINES; i--)); do echo -n "${BUF[i]}"; done
}
Его производительность в основном сравнима с решением sed
, и становится быстрее по мере уменьшения количества запрашиваемых строк.
-121--16995-
airodump-ng
помещает фразу «WPA handshake:» в правую верхнюю часть окна терминала, когда оно захватило рукопожатие.
Для получения подтверждения см. данное учебное пособие .
-121--243465-
Вы ищете что-то вроде «userland exec». Реализация здесь . В основном, это включает загрузку в память некоторого позиционно-независимого кода, который не имеет внешних ссылок, и маркировку его исполняемого файла. Эта позиция независимый код удаляет ранее запущенный исполняемый файл и перезагружает его. Похоже, вам придется изменить пользователя exec, который я написал хотя бы немного.
Для поиска foo
в начале или конце строки:
/^foo\|foo$
Редактировать :Во избежание повторного ввода foo
,вы также можете использовать обратную ссылку (, предложенную @StéphaneChazelas):
/\v(foo)&(^\1|\1$)
Объяснение :Для поиска foo
в начале строки используйте /^foo
, а для поиска в конце строки используйте /foo$
.(Подробнее читайте здесь . )Экранированный разделитель "или"(|
)проверяет любое совпадение.
Используйте / и соответствующее регулярное выражение.
^string
. string$
. Символы ^
и $
привязывают выражение к началу и концу строки соответственно.