2
在日常工作中,我需要从各种混合格式的日志和其他文本数据中提取一些文本。是否有一个实用程序(如awk,grep等)可以用来快速执行任务,而不必诉诸写长bash/perl/python脚本?如何使用多个(嵌套)分隔符从文本中提取值
实施例1:对于以下
mylog user=UserName;password=Password;other=information
输入文本我想提取用户名和密码值。伪实用程序将优选地是这样的(一拉awk
):
cat input-text.txt | magic --delimit-by=";" --then-by="="
'{print "The username is $values[0][1] and password is $values[1][1]"}'
凡;
限定的输入字符串被置于$values
阵列,并且该阵列中的每个值被进一步限定由=
以形成一个嵌套数组。
更妙的是,将是不错的有这样的事情:
cat input-text.txt | magic --map-entry-sep=";" --map-key-val-sep="="
'{print "The username is $[user] and password is $[password]"}'
其中解析的结果是通过键转换成地图,便于查找。
例2:也很好解析三重嵌套元素。考虑像
mylog mylist=one,two,three;other=information
我想现在使用类似提取列表mylist
的第二个元素输入文本:
cat input-text.txt | magic --delimit-by=";" --then-by="=" --and-then-by=","
'{print "The second element of mylist is: $values[0][1][1]}'
当然,我宁愿使用某种类型的JSON解析器和转换输入数据分为相应的对象/地图/列表格式以便于提取,但这是不可能的,因为我正在处理不同格式的数据。
我通常使用awk,grep,cut和sed组合使用多个管道,并一次提取每个感兴趣的值(列),但这很乏味,需要稍后将不同的列合并为一个。通常,我需要CSV格式的所有提取列以供Excel中的进一步处理。
将不胜感激的任何建议或意见。
对于您的最后一个示例,您错过了作为字段分隔符的空间,并且打印了$ 4。 – 2011-03-15 13:25:58
@glennjackman:不,我只是故意忽略它(但我不应该)。我会将其添加到我的答案。 – 2011-03-15 14:09:19
+1提示。是否可以将它扩展为使用多个字符的字符串作为分隔符?例如。使用 ” ;” (空格冒号)作为分隔符,但避免自行分隔空格或冒号。 – rodion 2011-03-16 03:42:20