在不使用管道的情况下对文件中的字符串进行 Grep

Kai*_*Kai 3 command-line grep pipe search

我想在不使用管道的情况下在文件的最后 n 行中搜索一个单词。

grep <string> filename
Run Code Online (Sandbox Code Playgroud)

允许在文件名中搜索字符串。但是,我想在文件的最后 N 行中搜索一个字符串。有什么命令可以在不使用管道的情况下搜索它吗?

小智 7

如果您的 shell 支持它(zsh, bash, 的某些实现ksh),您可以使用进程替换

grep <pattern> <(tail -n5 yourfile.txt)
Run Code Online (Sandbox Code Playgroud)

其中 -n5 表示获取最后五行。

相似地,

grep <pattern> <(head -n5 yourfile.txt)
Run Code Online (Sandbox Code Playgroud)

将搜索 yourfile.txt 的前 5 行。

解释

简单来说,被替换的进程伪装成一个文件,这正是grep所期待的。进程替换的一个优点是您可以将多个命令的输出作为其他命令的输入提供,就像diff在这个例子中一样。

diff -y <(brew leaves) <(brew list)
Run Code Online (Sandbox Code Playgroud)

这摆脱了管道 ( |) 字符,但每个替换实际上都在创建管道1


1请注意,与ksh93在Linux至少,|不能同时使用管道而是一个套接字对进程替换确实使用管(因为它无法将open一个插座):

$ ksh93 -c 'readlink <(:)'
管道:[620224]
$ ksh93 -c ': | readlink /proc/self/fd/0'
插座:[621301]