Bash - tìm kiếm lịch sử gia tăng (ctrl + r) - khớp với nhiều từ không liền kề


8

Khi sử dụng Ctrl+ Rđể tìm kiếm lịch sử bash, có một số cách để khớp hai từ không nằm cạnh nhau. Ví dụ: giả sử tôi muốn tìm lệnh cuối cùng có httpdawkkhông nằm cạnh nhau. Có một số tùy chọn tốt hơn so với việc sử dụng để ghi lại lịch sử bash để khớp cả hai hoặc nhấn Ctrl+ Rđể chuyển qua các mục khớp với một từ khóa cho đến khi tìm thấy lệnh mong muốn?

Câu trả lời:


3

Tài liệu tham khảo Bash nói :

Readline cung cấp các lệnh để tìm kiếm trong lịch sử lệnh cho các dòng chứa một chuỗi được chỉ định

Bạn muốn một biểu thức chính quy thay vì chuỗi cố định.

Hãy thử hstr :
1. Cài đặt
2. Cấu hình

Bạn sẽ thấy một cái gì đó như thế này với hstr:
nhập mô tả hình ảnh ở đây

Cập nhật :
Một công cụ khác là fzf .

  1. Cài đặt : git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf && ~/.fzf/install

  2. Nguồn lại của bạn ~/.bashrc:source ~/.bashrc

Bạn sẽ thấy một cái gì đó như thế này với fzf: nhập mô tả hình ảnh ở đây


2

Tôi không biết cách tích hợp nào để thực hiện việc này, nhưng bạn có thể viết một hàm nhỏ để thực hiện grep và chỉnh sửa tệp lịch sử của mình để kết quả xuất hiện ở cuối và sau đó bạn có thể dễ dàng chọn một trong các kết quả khớp chỉ bằng cách di chuyển lên qua lịch sử mới. (Điều này không thay đổi thứ tự các lệnh trong lịch sử của bạn).

Đây là một chức năng như vậy. Tôi giả sử bạn muốn tìm 2 (hoặc nhiều hơn) bất kể chúng xuất hiện theo thứ tự nào. Bạn có thể đặt số lượng tối đa các trận đấu bạn muốn chấp nhận; đây là 10. Tôi cũng giả sử rằng grep ban đầu không trả về một chuỗi hài hước, hoặc bạn sẽ cần sử dụng các tệp tạm thời thay vì các chuỗi bash.

hist(){
    local maxmatches=10 word=$1 matches new nummatches
    shift
    history -w # write out history to HISTFILE
    matches=$(grep -e "$word" $HISTFILE)
    for word
    do   new=$(echo "$matches" | grep -e "$word")  || return # if str too big
         matches=$new
    done
    nummatches=$(echo "$matches" | wc -l)
    echo "$nummatches matches"
    if [ $nummatches -gt 0 -a $nummatches -le $maxmatches ]
    then echo "$matches" >>$HISTFILE # add matches to end of file
         history -c # clear history
         history -r # read history from file
         history $nummatches # show last few lines
    else echo "zero or too many matches. (max $maxmatches)"
    fi
}

Nếu bạn không muốn kết hợp mô hình regrec cho các từ của mình, hãy sử dụng fgrep thay vì grep. Nếu bạn chỉ muốn thứ tự nhất định, hãy sử dụng một từ như "httpd. * Awk". Bạn cũng có thể xóa vòng lặp for nếu chỉ sử dụng một từ theo cách này.


Không chính xác những gì tôi đã hy vọng, nhưng tôi sẽ cho nó +1 cho sự sáng tạo
sa289
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.