我有一个名为 的文件夹rules/resources
,因为我有子文件夹,可以说A
,B
和C
。每个子文件夹包含constraint.yaml
.
现在我想要包含字符串的grep
文件。我尝试使用如下:constraint.yaml
assetType
grep
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/
我们用来输出由正则表达式匹配的文本的地方-o
,o
切换-P
到类似 perl 的正则表达式,说明匹配中\K
要隐藏的内容。K
通过管道来sort -u
排序并删除重复项。
答案2
根据规则/资源尝试以下操作:
fgrep -Rh assetType `find ./ -name constraint.yaml.`|uniq
在fgrep这-Rswitch 将确保您的搜索是递归的,-H将抑制输出中文件名的前缀,寻找顶端之间的部分将负责喂养fgrep与文件内容,最后 独特的将删除重复项。此外,无论目录树的深度如何,这都应该有效。