3

这是感兴趣的文本文件的 4 行示例

EnumerateKey,explorer.exe,HKCR\\Directory\\shellex\\ContextMenuHandlers,NOMORE
CreateSec,explorer.exe,\\WINDOWS\\system32\\verclsid.exe,SUCCESS
QueryKey,AcroRd32.exe,HKCU\\Control Panel\\International,BUFOVRFLOW       
QueryValue,AcroRd32.exe,HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRecentDocsHistory,NOTFOUND

我想通过附加 K 字段/列(例如K=3下面)来增加行,这些字段/列包含在 $3 中找到但被解析的路径的元素\\

这是 4 行所需的输出。

EnumerateKey,explorer.exe,HKCR\\Directory\\shellex\\ContextMenuHandlers,NOMORE, Directory, shellex, ContextMenuHandlers
CreateSec,explorer.exe,\\WINDOWS\\system32\\verclsid.exe,SUCCESS, WINDOWS, system32, verclsid.exe
QueryKey,AcroRd32.exe,HKCU\\Control Panel\\International,BUFOVRFLOW, Control Panel, International,
QueryValue,AcroRd32.exe,HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRecentDocsHistory,NOTFOUND, Software, Microsoft, Windows

经过更多研究,这里有两个细微差别:

有些路径以 HK** 开头,有些则不是。但是,在这两种情况下,我只关心在初始\\. 这种差异体现在第 1 行和第 2 行之间。因此,如果可能,我相信解析必须锚定在\\而不是简单地 $3 上。(我是否正确使用了该术语?)

其次,路径的深度不同。为了保持列/字段的一致性,我愿意丢失一些信息(第 4 行)以及为短路径(第 3 行)保留空白字段以保持这一点。

4

2 回答 2

1

这是一种使用方法GNU awk

awk 'BEGIN { FS=OFS="," } { split($3,a,"\\\\\\\\"); print $0, a[2], a[3], a[4] }' file

结果:

EnumerateKey,explorer.exe,HKCR\\Directory\\shellex\\ContextMenuHandlers,NOMORE,Directory,shellex,ContextMenuHandlers
CreateSec,explorer.exe,\\WINDOWS\\system32\\verclsid.exe,SUCCESS,WINDOWS,system32,verclsid.exe
QueryKey,AcroRd32.exe,HKCU\\Control Panel\\International,BUFOVRFLOW,Control Panel,International,
QueryValue,AcroRd32.exe,HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoRecentDocsHistory,NOTFOUND,Software,Microsoft,Windows
于 2012-11-27T06:27:18.677 回答
0

使用一些丑陋的 Perl:

perl -lane '{$l=$_;s/.*?\\\\([^,]*),.*/$1/;@v=split(/\\\\/,$_); print "$l,".join(",",@v[0,1,2]);}' input
于 2012-11-27T06:43:51.440 回答