使用 find 和 grep 查找文件中包含某些字符串且不包含其他字符串的行

使用 find 和 grep 查找文件中包含某些字符串且不包含其他字符串的行

首先,我尝试以下代码

find . -name "*.cfg" | xargs grep "good"|grep -v "^\#"

在当前文件夹中,我得到文件名扩展名为“cfg”的列表。然后我想搜索内容以查找包含“good”但不以“#”开头的行。但我的代码不起作用。有什么不对?谢谢。

答案1

无用的 xargs 使用(如果你的 find 有 -exec):

find . -name "*.cfg" -exec egrep "^[^#]*good" {} +

插入符号不需要被屏蔽 - 我不知道在什么情况下它必须被屏蔽。但这没有什么害处,你的整个命令对我有用。

答案2

像下面这样的东西应该有效:

find . -name "*.cfg" -print0 | xargs -0 grep -E '^([^#].*|)good'

请注意,我切换到-print0以避免文件名包含空格的问题。

然后我过滤包含good但不以#单个正则表达式开头的行。左侧替代 ( [^#].*) 匹配以非字符开头的行#,右侧替代(空)允许匹配以 开头的行good

使用单个正则表达式,而不是您问题中的两个正则表达式,允许我们让 GNU grep 打印文件名(如果 提供了多个文件,它将执行此操作find)。添加grep -v ^...第二步将无法匹配文件行的开头。

相关内容