You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用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

逻辑说明:

  1. 先获取每个文件的总行数
  2. 过滤掉行数过少的文件
  3. 用grep -n输出带行号的匹配结果,再通过awk判断匹配行既不是首行(行号1)也不是末行(行号等于总行数),满足条件就输出文件名并终止当前文件的处理

内容的提问来源于stack exchange,提问作者nightmare637

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:50:32