Fzf命令简介
1. 简介
在本教程中,我们将学习如何使用fzf命令在文本、文件列表等中执行模糊搜索。我们还将探索fzf实用程序的一些基本和高级应用程序,以提高我们的生产力。
2. 关于fzf
模糊搜索通过应用近似字符串匹配技术 而不是精确匹配来工作。然后按其排名分数对结果进行排序。
fzf是一个交互式命令行过滤器,它从stdin读取行,使用模糊搜索过滤行,并将过滤后的行转发到stdout。它支持脚本和交互模式。在交互模式下,fzf提供了一个接口来读取搜索参数并在运行时过滤输入。
fzf的工作方式与grep 和find 不同,因为它执行模糊搜索而不是正则表达式或 glob 搜索。
3. 安装
我们可以在大多数软件包存储库中找到fzf 。在基于 Debian 的发行版上,我们可以使用apt安装fzf :
$ sudo apt install 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 的三个键绑定:
- CTRL-R :根据$HISTFILE搜索最近的历史记录,然后将选定的条目返回到终端
- CTRL-T:递归搜索$PWD下的文件名,然后将选定的条目返回到终端
- 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 页面 上找到大量高级应用程序列表。