如何在指定目录的.cfg文件中提取含$DB_Connection=的行?
提取.cfg文件中含
$DB_Connection=行的正确命令 问题背景
需要从/usr/prod目录下的大量.cfg文件中提取所有包含$DB_Connection=的行,输出格式为「文件名:行号:完整行内容」,但原命令无有效输出:
find /usr/prod/*.cfg -type f -print0 | xargs -0 grep -Hn -A0 "$DB_Connection=" > /home/userId/outputconnections.txt
错误原因
- 特殊字符未转义:
$在Shell中是变量引用符号,双引号包裹的$DB_Connection=会被Shell解析为变量DB_Connection的值(未定义则为空),导致grep实际匹配的是=而非目标字符串。 - find语法错误:
find /usr/prod/*.cfg会让Shell先展开通配符,若文件数量过多会触发系统限制,且不符合find的标准用法。
正确命令
方式1:直接用grep(非递归,仅处理/usr/prod下的.cfg文件)
grep -Hn '$DB_Connection=' /usr/prod/*.cfg > /home/userId/outputconnections.txt
参数说明:
-H:强制显示文件名(即使只搜索单个文件)-n:显示匹配行的行号- 单引号包裹匹配模式,避免Shell解析
$符号
方式2:grep递归搜索(含子目录)
如果需要处理/usr/prod下所有子目录中的.cfg文件,添加递归参数:
grep -rHn '$DB_Connection=' /usr/prod --include="*.cfg" > /home/userId/outputconnections.txt
参数说明:
-r:递归搜索子目录--include="*.cfg":仅匹配.cfg后缀的文件,避免搜索其他类型文件
方式3:find+xargs组合(兼容特殊文件名)
如果文件名包含空格、换行等特殊字符,用find的-print0和xargs的-0处理:
find /usr/prod -type f -name "*.cfg" -print0 | xargs -0 grep -Hn '$DB_Connection=' > /home/userId/outputconnections.txt
输出效果
对示例文件执行后,会生成符合要求的输出:
/usr/prod/File1.cfg:2:$DB_Connection=ABC_DATABASE /usr/prod/File2.cfg:2:$DB_Connection=SAMPLE_DATABASE
空文件或不含目标字符串的文件会被自动忽略。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

