是否可以在一堆档案中使用正则表达式来查找它们所包含的文件名和这些文件的内容?我想知道哪些档案中的哪些文件与模式匹配。我使用的是 OS X,如果有的话。
答案1
如果您需要使用更具表现力的grep
-style 文件模式:
tar -OT <(tar -tf /path/to/file.tar | grep 'FILE_PATTERN') -xf /path/to/file.tar \
| grep 'CONTENT_PATTERN'
-O
与 结合使用时,将输出指定为stdout
,并指定包含要提取的名称的文件。-T
-x
如果简单一点路径名扩展已经足够好了,您可以<( ... )
用更简单的行替换进程替换 ( ) ,这可以避免在文件上echo
读取运行两次:tar
tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
| grep 'CONTENT_PATTERN'
如果您还想查看文件名,请添加该-v
标志(我个人会选择-xvf
),但是您还需要CONTENT_PATTERN
再次修改为 grep 来获取文件名。我将把这个作为练习留给读者......
它变得有点棘手,您可能需要使用awk
更多的输出处理...匹配的文件名将每行显示,所以不幸的是这里没有明确的分隔符。假设文件名不会重复作为内容:
tar ... | awk '/^FILLE_AWK_PATTERN$/{f=$0;next}...'
这将awk
变量设置f
为遇到的每个新文件名并跳到下一行。然后,
tar ... | awk '...$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'
一旦我们看到匹配的行,我们就打印$f
并重置我们的文件名直到“遇到”下一个文件。
把它放在一起:
tar -OT <(echo 'FILE_PATTERN') -xf /path/to/file.tar \
| awk '/^FILLE_AWK_PATTERN$/{f=$0;next};$f&&/CONTENT_AWK_PATTERN/{print $f;$f=""}'