如何在使用grep时跳过文件的首行和末行进行搜索?
问题描述
我用grep -l 'hello' *命令在当前目录查找包含"hello"的文件,当前目录的文件内容如下:
- test1:
hello hi how are you stuff
- test2:
welcome hello etc
- test3:
hey there hello
当前命令输出为:
test1 test2 test3
但我希望跳过每个文件的首行和末行进行搜索,仅得到结果:
test2
已知sed '1d;$d' *可以忽略首末行,想问能否将它与grep结合实现需求?若不能,如何只用grep实现跳过首末行搜索?
解决方案
方法一:结合sed与grep实现
完全可以结合两者实现需求,但要注意保留文件名信息(直接管道会丢失文件名),推荐用以下方式逐个处理文件:
ls * | xargs -I {} sh -c "sed '1d;$d' {} | grep -q 'hello' && echo {}"
这个命令会遍历每个文件,先用sed去掉首末行,再通过grep -q静默检查是否包含"hello",如果匹配就输出文件名,刚好符合你的需求。
方法二:仅用grep实现
如果只想依赖grep,可以结合行号匹配与文件总行数判断,用脚本遍历处理:
for file in *; do total_lines=$(wc -l < "$file") [ "$total_lines" -le 2 ] && continue # 行数≤2的文件,去掉首末行后无内容,直接跳过 grep -n 'hello' "$file" | awk -v total="$total_lines" '$1 != 1 && $1 != total {print FILENAME; exit}' done
逻辑说明:
- 先获取每个文件的总行数
- 过滤掉行数过少的文件
- 用
grep -n输出带行号的匹配结果,再通过awk判断匹配行既不是首行(行号1)也不是末行(行号等于总行数),满足条件就输出文件名并终止当前文件的处理
内容的提问来源于stack exchange,提问作者nightmare637
相关产品推荐
相关产品推荐

