Rosie模式语言,一种更好的挖掘数据的方式

你好RPL,再见regex!Rosie使得在数据大海捞针中找到数据针变得容易多了。

我们都有过这样的经历:你有大量的非结构化或半结构化数据需要筛选,就像任何一个有头脑的书呆子一样,你知道人工筛选会违背所有好的和神圣的东西。排队播放“不可能完成的任务”音乐]。您必须接受的问题是,如何高效地、有效地自动化提取过程。作为数字领域的老手,您可能会使用您熟悉的工具,例如grep它是实现正则表达式的好工具。假设您想在一个文本文件中找到所有的IPv4地址。你可以使用:

grep oe " \ b ([0 - 9] {1,3} \) {3} [0 - 9] {1,3} \ b”datafile.txt

这个正则表达式并不难理解,但它并不完美,因为它会同时打印有效和无效的IPv4地址,因为它非常简单地识别0.0.0.0到999.999.999.999的字符串。所以,让我们收紧这个正则表达式,这样只有有效的IPv4地址才会被打印出来:

grep - e - o”(25 (0 - 5) | 2 [0 - 9] [0 - 4] | [01] ? [0 - 9] [0 - 9] ?) \。(25 (0 - 5) | 2 [0 - 9] [0 - 4] | [01] ? [0 - 9] [0 - 9] ?) \。(25 (0 - 5) | 2 [0 - 9] [0 - 4] | [01] ? [0 - 9] [0 - 9] ?) \。(25 (0 - 5) | 2 [0 - 9] [0 - 4] | [01] ? [0 - 9] [0 - 9] ?)“datafile.txt

瞧!任务完成了,但那是一个丑陋的regex,更可怕的是IPv6地址的regex(道具在RegExLib.com上mij):

grep oe”(:: | (((a-fA-F0-9) {1 4}):) {7} (((a-fA-F0-9) {1 4})) | (:: (((a-fA-F0-9) {1 4})) {1,6}) | ((((a-fA-F0-9) {1 4}):) {1,6}:) | ((((a-fA-F0-9) {1 4}):) (: ([a-fA-F0-9] {1 4})) {1,6}) | ((((a-fA-F0-9) {1 4}):) {2} (: ([a-fA-F0-9] {1 4})) {1, 5}) | ((((a-fA-F0-9) {1 4}):) {3} (: ([a-fA-F0-9] {1 4})) {1 4}) | ((((a-fA-F0-9) {1 4}):) {4} (: ([a-fA-F0-9] {1 4})) {1,3}) | ((((a-fA-F0-9) {1 4}):) {5} (: ([a-fA-F0-9] {1 4})) {1,2}))”datafile.txt

与所有有用的regex,进行修改时一个复杂的正则表达式输入格式发生变化是忧郁的秘诀,厄运,不眠之夜,因为重建正则表达式的逻辑导致的问题通常是重要的(我是指它是一个工作没有一个头脑清醒的人会想解决)。

可是等等!这还不是全部这是有问题的!正则表达式可以很容易变得狰狞的计算,因为它很容易地创建一个正则表达式是下降到灾难性的回溯借此大肆消耗的处理器周期(见的好文章失控的正则表达式:灾难性回溯)。换句话说,预测和优化正则表达式是困难的、不可预测的,而且非常非常恼人。

那么,书呆子会做什么呢?忍受可恶的正则表达式的攻击,或者使用其他工具来对付大量可恶的模式,通过编码结束它们:不再进行测试!是的!但我跑题了……

有一个更好的方法,我的朋友:它叫做罗西模式语言它很优雅,功能强大,允许我们永远丢弃正则表达式。

罗西1 杰米·詹宁斯/ IBM

罗西是由杰米·a·詹宁斯(Jamie A. Jennings)开发的,詹宁斯称自己“以前是个学者,现在在工业界工作(他们有饼干)”。詹宁斯女士是IBM的高级技术人员,也是IBM云部门一个高级技术团队的成员。她的自传中写道:“在业余时间,她会玩冰球和写编译器。”

尽管如此,Rosie模式语言和Rosie模式引擎在2016年初发布Git存储库,系统说明如下:

Rosie是正则表达式(regex)的超级替代品,可以根据任何输入文本匹配模式。Rosie提供了数百个时间戳、网络地址、电子邮件地址、CSV文件等示例模式。

与大多数regex工具不同,Rosie可以生成结构化(JSON)输出。而且,Rosie有一个交互式模式开发模式来帮助编写和调试模式。

Rosie模式引擎占用不到400KB(是的,是千字节)的磁盘空间和大约20MB的内存。在我4岁的MacBook Pro上,典型的日志文件解析速度约为每秒40,000行,而其他(流行的)解决方案不能达到每秒10,000行。

Rosie模式语言是大数据分析的理想选择,因为Rosie速度快,具有可预测的性能(不像大多数regex引擎),并为下游分析生成json输出。

想要了解更多关于罗西的“原因”,请看詹宁斯女士的文章为什么是Rosie模式语言

安装罗西是相当容易(在macOS通过家酿这是小菜一碟),还有安装在RHEL 7、Ubuntu 16、Windows 10周年纪念版和Docker上的提示。安装后,您可以检查Rosie的配置如下:

本地安装信息:ROSIE_HOME = /usr/local/Cellar/rosie/current/share/rosie ROSIE_VERSION = 0.99i主机名= RedQueen。当前调用:当前工作目录= /Users/mgibbs调用命令= bash /usr/local/bin/ Rosie -info Rosie home脚本值= /usr/local/ cellar / Rosie /current/share/rosie环境变量$ROSIE_HOME未设置

罗西有通常的帮助输出:

RedQueen:罗茜mgibbs $罗西-help这是罗西v0.99i说明:用法:bash中的/ usr / local / bin目录/罗茜-help *有效期为:-help -patterns -verbose  - 所有-repl -grep -eval -wholefile  -信息-manifest -f -e -encode -help打印可用模式此消息-patterns打印列表-verbose输出警告和其他信息的消息 - 所有的写场比赛,stdout和不匹配的行到stderr -repl在交互模式下启动罗西(读取 - 求值 - 输出循环)-grep模拟grep的(弱),但与RPL,通过搜索在输入输出-eval所有出现的图案如何处理的输入了详细的“迹线”的评价;此功能生成输出的手,所以最好由线-info打印信息使用它在一行输入-wholefile读取整个输入文件到存储器中作为一个单独的字符串,代替线有关本地罗茜安装-manifest加载所述清单文件,而不是从$ SYS清单(罗茜的安装目录);使用单一的破折号“ - ”加载没有清单文件-f加载RPL文件,清单后(如果有的话)被加载-e编译RPL陈述中,清单和文件RPL(如果有的话)之后是加载-encode编码输出在格式:其中最后的颜色(默认),NOCOLOR,全文,或JSON RPL的表达,这可能是一个定义的模式的名称,对各线将被匹配+的一个或多个文件名的方法,可以是dash "-" to read from standard input Notes: (1) lines from the input file for which the pattern does NOT match are written to stderr so they can be redirected, e.g. to /dev/null (2) the -eval option currently does not work with the -grep option RedQueen:rosie mgibbs$

为了显示Rosie是如何工作的,请考虑ifconfigcommand(来自macOS Sierra):

RedQueen:罗西mgibbs $ ifconfig lo0:旗帜= 8049 <回环,跑步,多播> mtu 16384选项= 1203 < RXCSUM、TXCSUM TXSTATUS, SW_TIMESTAMP > inet 127.0.0.1子网掩码0 xff000000 inet6:: 128 prefixlen inet6 fe80:: 1% lo0 prefixlen 64 scopeid 0 x1 nd6选项= 201 < PERFORMNUD,爸爸> gif0:旗帜= 8010 < POINTOPOINT,多播> mtu 1280 stf0:旗帜= 0 < > mtu 1280 en0:旗帜= 8963 <,广播,聪明,跑步,PROMISC,单纯形,多播> mtu 1500选项= 10 b < RXCSUM、TXCSUM VLAN_HWTAGGING, AV >乙醚交流:87:a3:31:87:8b inet6 fe80:: 425:850:43a6:5863%en0 prefixlen 64担保scopeid 0 x4 inet6 2605: e000:6a0b: 2500:86d: 8286: ca88:9f8 prefixlen 64 autoconf获得inet 192.168.0.180子网掩码0 xffffff00广播192.168.0.255 inet6 2605: e000:6a0b: 2500:18f1: f5df: 7 ef9:2fa4 prefixlen 64弃用autoconf临时inet6 2605: e000:6a0b: 2500:38b4: ea13: fff3:9698 prefixlen 64不赞成使用autoconf临时inet6 2605: e000:6a0b: 2500: b49e: ab54: bc4:5717 prefixlen 64弃用autoconf临时inet6 2605: e000:6a0b: 2500:9831:439f: f75:7a40 prefixlen 64弃用autoconf临时inet6 2605: e000:6a0b: 2500:18a4:3d38:7395:5c5a prefixlen 64弃用autoconf临时inet6 2605: e000:6a0b: 2500:3188:37ce: a627: b276 prefixlen 64弃用autoconf临时inet6 2605: e000:6a0b: 2500: dd77:14e: 2011:634 prefixlen 64 autoconf临时nd6选项= 201 < PERFORMNUD,爸爸>媒体:自动选择(1000 baset <全双工、流控制、energy-efficient-ethernet >)状态:积极en1:旗帜= 8823 <,广播,聪明,单纯形,多播> mtu 1500醚b8:09:8a: cf: 83:8f nd6选项= 201 < PERFORMNUD,爸爸>媒体:自动选择()状态:不活跃en2:旗帜= 963 <,广播,聪明,跑步,PROMISC,单工> mtu 1500选项= 60 0 < TSO4 TSO6 >醚:00:00:78:3d: 10媒体:自动选择状态:积极en3:旗帜= 963 <,广播,聪明,跑步,PROMISC,单工> mtu 1500选项= 60 0 < TSO4 TSO6 >醚:00:00:78:3d: 11媒体:自动选择状态:不活跃bridge0:旗帜= 8863 <,广播,聪明,跑步,单纯形,多播> mtu 1500选项= 63 < RXCSUM、TXCSUM TSO4, TSO6 >乙醚0 a: 00:00:78:3d: 11 inet6 fe80:: 1493:92de: 58 ee: 96 eb % bridge0 prefixlen 64担保scopeid 0×8 inet 169.254.239.110子网掩码0 xffff0000广播169.254.255.255配置:id 0:0:0:0:0:0优先hellotime 0 fwddelay 0 maxage 0 holdcnt 0原型stp maxaddr 100超时1200根id 0:0:0:0:0:0端口优先级0 ifcost 0 0 ipfilter禁用标记0 x2成员:en3旗帜= 3 <学习,发现> ifmaxaddr端口优先级7 0路径成本0成员:en2旗帜= 3 <学习,发现> ifmaxaddr 0 6号端口优先级0路径成本0 nd6选项= 201 < PERFORMNUD,爸爸>媒体:自动选择状态:积极p2p0:旗帜= 8802 <广播、单纯形、多播> mtu 2304醚0 a: 09:8a: cf: 83:8f媒体:自动选择状态:不活跃awdl0:旗帜= 8902 <广播、PROMISC、单纯形,多播> mtu 1484醚1 e: bb: 87:15:37: c8 nd6选项= 201 < PERFORMNUD,爸爸>媒体:自动选择状态:不活跃utun0:旗帜= 8051 < POINTOPOINT,跑步,多播> mtu 2000 inet6 fe80:: 42 fb: 52 c5: cff7:807e % utun0 prefixlen 64 scopeid 0 xb = 201 < PERFORMNUD,爸爸> vboxnet0 nd6选项:旗帜= 8842 <广播、跑步、单纯形、多播> mtu 1500醚0 a: 00:27:00:00:00 vboxnet1:旗帜= 8842 <广播、跑步、单纯形、多播> mtu 1500醚0 a: 00:27:00:00:01 vboxnet2:旗帜= 8842 <广播、跑步、单纯形、多播> mtu 1500醚0 a: 00:27:00:00:02 utun1:旗帜= 8051 < POINTOPOINT,跑步,多播> mtu 1380 inet6 fe80:: 37 b0: cdae: 5 ad4:4f0e % utun1 prefixlen 64 scopeid 0 xf nd6选项= 201 < PERFORMNUD,爸爸> utun2:mtu 1380 inet6 fe80::8e14:3930:f5f9:ae9c%utun2前缀64 scopeid 0x10 nd6 options=201 RedQueen:rosie mgibbs$

让我们把它保存到一个文件:

RedQueen:rosie mgibbs$ ifconfig > ifconfig.txt

我们将使用预定义模式的默认集合来分析这些数据。属性定义这些模式罗西模式语言您可以探索以交互方式使用交互式读-评价-打印循环(repl)。现在,让我们让Rosie分析一下我们的测试数据:

罗西2 马克·吉布斯

命令行,罗西基本。matchall ifconfig.txt指导罗西使用这个模式basic.matchall在RPL文件中指定,basic.rpl像这样:

basic.matchall= ( basic.datetime_patterns / basic.network_patterns / basic.element / basic.element_quoted / basic.element_bracketed / [:space:]+ / basic.punctuation / basic.unmatched )+

如你所见,basic.matchall模式是由许多其他模式构建而来的,而这些模式又是由其他模式构建而来的……正是这些模式使得从现有模式构建自己的模式变得更加容易添加新的模式来执行您需要的特定数据提取任务。

相关:
12 第1页
第1页共2页
工资调查:结果在