从 fs_usage 的输出中提取路径

Posted

技术标签:

【中文标题】从 fs_usage 的输出中提取路径【英文标题】:extract paths from output of fs_usage 【发布时间】:2015-10-07 12:06:34 【问题描述】:

我对 RegExp 和 sed 有点生疏(Mac 的版本与 GNU 的差异对我的尝试没有帮助),经过相当多的尝试 [几个小时],我还没有设法完成解析像这样输入:

16:32:07.961689  stat64                                 /System/Library/Frameworks/CoreBluetooth.framework/Versions/A/CoreBluetooth                                                                                           0.000007   JavaApplicationS.65394
16:32:07.961742  stat64                                 /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols                                                                                      0.000006   JavaApplicationS.65394
16:32:07.961764  stat64                                 /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication                                                                            0.000007   JavaApplicationS.65394
16:32:07.961785  stat64                                 /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication                                                                                    0.000007   JavaApplicationS.65394
16:32:07.961830  stat64                                 /System/Library/PrivateFrameworks/SpeechRecognitionCore.framework/Versions/A/SpeechRecognitionCore                                                                    0.000008   JavaApplicationS.65394
16:32:07.962321  open              F=3        (RW____)  /dev/dtracehelper                                                                                                                                                     0.000061   JavaApplicationS.65394
16:32:07.968239  stat64                 [  2]           /AppleInternal>>>>>>>>>>

并且只提取路径。请注意,列数会有所不同,我想我想要的是附加到 / 字符的任何内容,并且被空格包围。此外,有时同一行会出现多条路径,例如

16:32:06.706726    WrData[A]       D=0x13589148  B=0x100000 /dev/disk0s2  /private/var/folders/92/663yx9fn2036kz6pb3kr8z0r0000gp/0/com.apple.LaunchServices-107502.csstore~ 

在这些情况下,两者都很棒:同时输出 /dev/disk0s2 和 /private.. 或 只是 /private.. 也可以。

所以,基本上所有的文件都被写入或读取,正如 Mac OS X fs_usage 工具所报告的那样。该解决方案不必基于 sed,我也可以为此编写一些代码,但在此之前,我只想知道是否有“更简单”的方法。

谢谢!

【问题讨论】:

erm,对不起,如果这应该是超级用户,我确实在 *** 上找到了类似的帖子,我找不到任何关于哪个网站适合的信息 grep -o '/[^ ]*' 之类的东西可能对你有用。 也许这可以帮助sudo fs_usage | tr -s ' ' | cut -d' ' -f3 @microspino:NOze,因为列数不同,即某些列有时没有价值,这意味着我会打印出我期望的东西。然后可能会使用该输出的输出来允许进一步处理文件......但仍然不是解决方案,感谢您的贡献 @EtanReisner:谢谢伙计,我不知道 grep 可以做到这一点。它有效,仅针对某些文件具有 > 字符的细节,因此 I'L'I 的解决方案更完整。 【参考方案1】:

尝试使用egrep,可以处理正则表达式:

egrep -o '/[^ >]*' file

结果:

/System/Library/Frameworks/CoreBluetooth.framework/Versions/A/
...

【讨论】:

完美,不知道 grep 可以做到这一点,即在一行内过滤。对于那些像我一样想要确保没有重复条目的人,请执行egrep -o '/[^ >]*' file | sort | uniq > pathsFiltered之类的操作【参考方案2】:

请注意:fs_usage 会截断长路径(从开头,而不是结尾),即使使用 -w 运行,它们也不会全部以 / 开头。 我发现这个帖子有同样的问题要解决,我详细说明 egrep 解决方案:cut -c 57-222 file.txt | egrep -o '[^ ].*/[^>]+[^ ]' 这似乎也适用于截断的那些(但不要相信我的话)。

解释:cut 提取路径实际所在的列,然后egrep 粗略地提取其中至少有一个 / 的字符串(也允许路径名中有空格)。

TBH 我不确定我的解决方案是否 100% 正确(可能不是)。

顺便说一句,除了截断的应用程序之外,跟踪应用程序我还得到不以/ 开头的路径,这些路径结果是相对于应用程序包内的某个位置。 示例(使用 Xcode 7.3.1 作为测试对象):A/Resources/XCWelcome-NewCheckoutTemplate.pdf 实际上是 /Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Versions/A/Resources/XCWelcome-NewCheckoutTemplate.pdf 截断路径示例:ations/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/Library/GPUTools/PlugIns/GLToolsMobileAnalysis.gtplugin/Contents/Resources/PlugIn.plist

注意:fs_usage sources 确认截断。

【讨论】:

【参考方案3】:

如果您可以使用 PCRE/Perl,您将能够使用带有可选组的长正则表达式从此类日志中提取数据。

这是我想出的一个:

(\d2:\d2:\d2\.\d+)\s+(\S+)\s+(?:(F=\d+)\s+)?(?:(\[[^]]*\])\s+)?(?:(\S+)\s+)?((?:\/[^\/\n]*)*\/\S+)(?:\s+(\d\.\d+))?\s*(.*)

见demo

【讨论】:

好吧,为那个网站和努力+1,以后可能会派上用场,但是,我该如何测试它?我在 Perl 上为零

以上是关于从 fs_usage 的输出中提取路径的主要内容,如果未能解决你的问题,请参考以下文章

如何从文件路径中提取目录路径?

从 OpenFileDialog 路径/文件名中提取路径

从容器请求中提取路径参数

如何从 Python 中的文件路径中提取文件夹路径?

从 SVG 文件中提取路径的坐标

从路径中提取目录[重复]