如何让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
相关产品推荐
相关产品推荐

