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
循环中,我们打印键在限制范围内的数组元素。
我想在不使用管道的情况下在文件的最后 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
循环中,我们打印键在限制范围内的数组元素。