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

如何让grep提取JSON文件指定字段时同步显示对应源文件名

解决提取JSON字段并关联源文件名的问题

你遇到的核心问题是原来的命令用cat把所有文件内容合并成了单一数据流,导致grep无法区分每行内容的来源文件。下面给你几个简单有效的解决方案:

方法1:用find + xargs + grep -H(最直接)

直接让grep逐个处理每个文件,并通过-H参数强制输出文件名(其实当grep处理多个文件时默认就会输出文件名,加上-H更稳妥):

find ./*/*/folderA/*DTI*.json -type f | xargs grep -i -H -E '(phaseencodingdirection|phaseencodingaxis)' > phase_direction

执行后,输出的phase_direction文件里每行格式会是:

./path/to/your/file.json:  "PhaseEncodingDirection": "RL",

方法2:用find -exec替代xargs

如果你的环境里xargs有兼容性问题,可以直接用find的-exec选项:

# 批量处理文件(更高效)
find ./*/*/folderA/*DTI*.json -type f -exec grep -i -H -E '(phaseencodingdirection|phaseencodingaxis)' {} + > phase_direction

# 逐个处理文件(适合小数量文件)
find ./*/*/folderA/*DTI*.json -type f -exec grep -i -H -E '(phaseencodingdirection|phaseencodingaxis)' {} \; > phase_direction

方法3:自定义输出格式(比如只显示文件名而非全路径)

如果不想输出完整路径,只需要文件名,可以用awk来实现,它的FILENAME变量会自动获取当前处理的文件:

# 输出格式:文件名: 匹配行内容
find ./*/*/folderA/*DTI*.json -type f -exec awk 'tolower($0) ~ /phaseencodingdirection|phaseencodingaxis/ {print gensub(/.*\//, "", 1, FILENAME) ": " $0}' {} + > phase_direction

这里gensub(/.*\//, "", 1, FILENAME)会把全路径里的目录部分去掉,只保留文件名。

为什么原来的命令不行?

你之前用cat $(find ...)把所有文件的内容拼接成了一个大的输入流,grep只能看到这个合并后的流,根本不知道每行来自哪个文件。而上面的方法都是让grep或awk直接处理单个文件,自然能关联上源文件名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:47:34