我只想列出使用 grep 的文本或使用 shell 脚本的任何其他选项

我只想列出使用 grep 的文本或使用 shell 脚本的任何其他选项

我有一个名为 的文件夹rules/resources,因为我有子文件夹,可以说ABC。每个子文件夹包含constraint.yaml.

现在我想要包含字符串的grep文件。我尝试使用如下:constraint.yamlassetTypegrep

grep -rIih assetType rules/resources/

我得到这个输出:

assetType: cloudfunctions.googleapis.com/CloudFunction
assetType: cloudfunctions.googleapis.com/CloudFunction
assetType: cloudfunctions.googleapis.com/CloudFunction
assetType: cloudfunctions.googleapis.com/CloudFunction
assetType: cloudfunctions.googleapis.com/CloudFunction
assetType: bigquery.googleapis.com/Dataset
assetType: artifactregistry.googleapis.com/Repository
assetType: composer.googleapis.com/Environment
assetType: composer.googleapis.com/Environment
assetType: composer.googleapis.com/Environment
assetType: apigateway.googleapis.com/Gateway
assetType: apigateway.googleapis.com/Gateway

但我不想显示该assetType字符串,它也应该删除重复的值。所需的输出如下所示:

cloudfunctions.googleapis.com/CloudFunction
bigquery.googleapis.com/Dataset
artifactregistry.googleapis.com/Repository
composer.googleapis.com/Environment
apigateway.googleapis.com/Gateway

答案1

如果你的grep(似乎是 GNU grep,因为它使用-r, -I-h所有这些都是非标准 GNU 扩展)是使用 PCRE 支持构建的,你可以这样做:

grep -rIihPo 'assetType:\s*\K.*' rules/resources/

我们用来输出由正则表达式匹配的文本的地方-oo切换-P到类似 perl 的正则表达式,说明匹配中\K要隐藏的内容。K

通过管道来sort -u排序并删除重复项。

答案2

根据规则/资源尝试以下操作:

fgrep -Rh assetType `find ./ -name constraint.yaml.`|uniq

fgrep-Rswitch 将确保您的搜索是递归的,-H将抑制输出中文件名的前缀,寻找顶端之间的部分将负责喂养fgrep与文件内容,最后 独特的将删除重复项。此外,无论目录树的深度如何,这都应该有效。

相关内容