从 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 的输出中提取路径的主要内容,如果未能解决你的问题,请参考以下文章