如何在使用grep时跳过第一行和最后一行?



我正在使用grep查找包含单词"hello"在当前目录下:

grep -l 'hello' *

给定这些文件:

test1

hello
hi
how are you
stuff

test2

welcome
hello
etc

test3

hey
there
hello

输出为:

test1
test2
test3
但是,我想在这些文件中搜索单词"hello",但要跳过第一行和最后一行,所以我的输出是:
test2

我知道我可以使用下面的命令来忽略第一行和最后一行:

sed '1d;$d' *

但是有什么方法可以在grep中使用它,从而忽略每个文件的第一行和最后一行吗?如果没有,我该如何使用grep跳过每个文件的第一行和最后一行呢?

这个任务更适合awk

awk 'FNR == 1 {p=""; next}
p ~ /hello/ {print FILENAME; nextfile}
{p = $0}' test*
test2

不需要在每次迭代中多次循环调用外部实用程序sed,grep

像这样:

for file in *; do sed '1d;$d' "$file" | grep -q hello && echo "$file"; done

这可能适合您(GNU sed):

sed -sn '1d;$d;/hello/{F;:a;n;ba}' test*

关闭隐式打印并分别处理每个文件

删除第一行和最后一行

如果找到匹配的hello,输出文件名并退出。

替代:

parallel -k 'tail -n+2 {} | head -n-1 | grep -qm1 hello && echo {}' ::: test*

或:

parallel -kq sed -n '1d;$d;/hello/{F;q}' {} ::: test*

您可以使用以下代码解决此问题:

grep 'hello' test* | tail -n +2 | head -n -1

假设每个文件都小于500 MB左右,只需一次性完成:

for __ in testfile_7000*txt; do
echo "n $__nn$( gcat -b "$__" |
gcat -n       )n"
done
echo " searching for "hello" .....nn$(
find . -maxdepth 1 -type f -name "testfile_7000*txt" -print0 |
xargs -0 mawk 'BEGIN { OFS = FS = RS; RS = "^$"
_ = "" 
} $!NF = $+($!_=$(NF-(_==$NF))=_)~"hello" ? FILENAME :_' | gcat -n )n"  

testfile_7000001.txt
1       1  000hello
2  
3       2  testhello
4       3   4355345

testfile_7000002.txt
1       1  000hell0
2       2  testhllo
3       3  84355345hello
searching for "hello" .....
1  ./testfile_7000001.txt
  • 第一个文件的第二行是空行""

最新更新