Contents

Fzf命令简介

1. 简介

在本教程中,我们将学习如何使用fzf命令在文本、文件列表等中执行模糊搜索。我们还将探索fzf实用程序的一些基本和高级应用程序,以提高我们的生产力。

2. 关于fzf

模糊搜索通过应用近似字符串匹配技术 而不是精确匹配来工作。然后按其排名分数对结果进行排序。

fzf是一个交互式命令行过滤器,它从stdin读取行,使用模糊搜索过滤行,并将过滤后的行转发到stdout。它支持脚本和交互模式。在交互模式下,fzf提供了一个接口来读取搜索参数并在运行时过滤输入

fzf的工作方式与grepfind 不同,因为它执行模糊搜索而不是正则表达式或 glob 搜索。

3. 安装

我们可以在大多数软件包存储库中找到fzf 。在基于 Debian 的发行版上,我们可以使用apt安装fzf

$ sudo apt install fzf

要从源代码安装它,请参阅GitHub 上的 fzf

四、基本用法

**通常,fzf是从另一个程序的标准输出中通过管道传输的,**例如ps 或apt-cache search。当fzf没有通过管道传输时,它调用find以递归方式列出当前目录下的所有非隐藏文件,并开始在文件名列表中搜索:

$ fzf

程序界面默认以全屏模式启动,搜索从底部开始。我们可以使用参数来改变行为:

--reverse 
        Display from the top of the screen 
--height N% 
        Use only N% height instead of full screen. 
--query PARAM 
        Begin search with PARAM as the initial query 
--multi 
        Enable multi-select with tab/shift-tab. 
-f, --filter PARAM
        Show matches for PARAM without the interactive finder

以 50% 的高度启动fzf finder 并显示以.md结尾的文件:

$ fzf --reverse --multi --height 50% --query=.md$

要在脚本模式下运行fzf并禁用交互式查找器:

$ fzf -f .md$

我们可以在手册页 中找到所有可用的选项。

4.1. Shell 键绑定

在安装过程中,fzf启用了与 shell 的三个键绑定:

  1. CTRL-R 根据$HISTFILE搜索最近的历史记录,然后将选定的条目返回到终端
  2. CTRL-T:递归搜索$PWD下的文件名,然后将选定的条目返回到终端
  3. ALT-C:递归搜索$PWD下的目录名称,然后cd 进入所选条目

4.2. 文件名自动完成

在终端中,我们可以触发fzf自动完成文件名,方法是输入 ** ,然后在术语后面按 TAB 键来查找:

$ ls /etc/sorce**<TAB>
> source
  64/3158
> /etc/apt/sources.list
  /etc/apt/sources.list.d
  /etc/apt/sources.list.save

请注意,ls的参数一开始是不正确的,但fzf返回正确的文件路径。

4.3. 杀死命令自动完成

使用kill 和fzf,我们可以轻松选择要向其发送信号的进程。在kill -SIGNAL之后,按 TAB 键以显示fzf进程查找器,然后选择所需的进程以自动完成pid值:

$ kill -18 <TAB>
> gedit<ENTER>
  55/295
> user     8841     1  0 09:03 ?        00:00:01 gedit
$ kill -18 8841

4.4. 使用不同的搜索模式

fzf支持多种搜索模式。要查看fzf在每种模式下的运行方式,让我们创建一个纯文本文件:

$ tee /tmp/fzf.in <<EOF
I mean to confound these bungers
I swallowed a bug
Was that the Primary Buffer Panel?
Captain Reynolds
EOF

fzf默认以模糊模式搜索。当我们搜索*“bug”*这个词时,heredoc的第2行匹配度比第1行高,第3行和第4行没有匹配:

$ cat /tmp/fzf.in | fzf -f bug
I swallowed a bug
I mean to confound these bungers

代替模糊模式,我们可以在关键字前面加上撇号以在精确模式下匹配:

$ cat /tmp/fzf.in | fzf -f \'bug 
$ #cat /tmp/fzf.in | fzf -f "'bug"
I swallowed a bug

第 1 行和第 2 行是等效的。所有在 shell 中具有特殊含义的字符如果没有用引号括起来,则必须进行转义。 **否定模式以精确模式匹配关键字并过滤掉匹配的行。我们可以在关键字前面加上! 否定:

$ cat /tmp/fzf.in | fzf -f  \!bug
I mean to confound these bungers
Was that the Primary Buffer Panel?
Captain Reynolds

***我们还可以分别使用^$*指定子字符串是出现在开头还是结尾。**这称为锚定匹配:

$ cat /tmp/fzf.in | fzf -f s$
Captain Reynolds
I mean to confound these bungers
$ cat /tmp/fzf.in | fzf -f \^c
Captain Reynolds

我们可以组合多个由空格分隔的过滤器。**管道分隔符充当 OR 运算符。**以下命令过滤所有以“I”开头并在模糊模式下匹配“man”或“ban”的行。

$ cat /tmp/fzf.in | fzf -f "^i ban | man"
I mean to confound these bungers

请注意,我们可以使用*+i*标志来启用区分大小写的匹配。

5. 应用示例

由于fzf擅长提供交互界面,我们可以将它作为不同场景下的浏览器使用,并利用其模糊搜索能力以高容错性缩小搜索范围。

** preview选项在选定行的预览窗格中显示指定命令的**输出。

在嵌入preview标志的命令中,表达式*{}扩展为整行,而{1}扩展为当前行的第 1 列,{2}扩展为第 2 列,依此类推。{n}*扩展行的从零开始的索引:

$ cat /tmp/fzf.in | fzf --preview 'echo line# {n}. first word: {1}. total words: `wc -w <<< {}`'

让我们通过在*–preview* 标志中嵌入ps命令以交互方式查看进程的线程:

$ ps axo pid,rss,comm --no-headers | fzf --preview 'ps o args {1}; ps mu {1}'

同样,我们可以浏览包依赖关系,例如,在基于 Debian 的 Linux 中:

$ apt-cache search . | fzf --preview 'apt-cache depends {1}' 

我们还可以浏览 git 提交历史并查看有关每个提交的最少信息:

$ git log --oneline | fzf --preview 'git show --name-only {1}'

fzf的 vim 插件也可用。可以在官方wiki 页面 上找到大量高级应用程序列表。