我正在使用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
- 第一个文件的第二行是空行
""