Grep 在不使用管道的情况下获取文件中的字符串

Grep for a string in file without using pipe

我想在不使用管道的情况下在文件的最后 n 行中 grep 查找一个词。

grep <string> filename

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

使用 perl oneliner:

perl -0777 -wlnE 'my @all = split("\n",$_); my $t = scalar @all; for my $l(@all[$t-50 .. $t]) {print $l if $l =~ /word/;} filename'

使用 Process Substitution 仅在最后 5 行中搜索字符串:

grep string <(tail -n 5 filename)

在我脑海中,shell 命令:

ed input <<EOF
$
1,-50d
v/pattern/d
w output
q
EOF

会起作用。为简洁起见,错误指示只有一个字符 ?。当然,每次参数更改时,您都必须根据所需的尾行数 (-50)、模式以及输入和输出文件名来更改 HERE 文档。而且你有点必须有一台仍然运行的机器 ed 但至少你不必使用管道。

这是一个简单的 Awk 脚本,它可以找到所有匹配项,但最终只打印距文件末尾 50 行以内的匹配项。

awk -v pattern='foo' -v limit=50 '[=10=] ~ pattern { a[NR]=[=10=] }
    END { for (n in a) if (n >= NR-limit) print a[n] }' file

数组a存储每个匹配项,并以行号为键;在 END 循环中,我们打印键在限制范围内的数组元素。