2011-03-15 27 views
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中的进一步处理。

将不胜感激的任何建议或意见。

回答

3
$ echo 'mylog user=UserName;password=Password;other=information' | 
    awk -F '[ ;]' -v keysep="=" \ 
     '{ 
       for (i=1; i<=NF; i++) { 
        split($i, t, keysep); 
        a[t[1]] = t[2] 
       }; 
     print "The username is " a["user"] " and password is " a["password"] 
     }' 
The username is UserName and password is Password 

$ echo 'mylog mylist=one,two,three;other=information' | awk -F "[ =,;]" '{print $4}' 
two 
+0

对于您的最后一个示例,您错过了作为字段分隔符的空间,并且打印了$ 4。 – 2011-03-15 13:25:58

+0

@glennjackman:不,我只是故意忽略它(但我不应该)。我会将其添加到我的答案。 – 2011-03-15 14:09:19

+0

+1提示。是否可以将它扩展为使用多个字符的字符串作为分隔符?例如。使用 ” ;” (空格冒号)作为分隔符,但避免自行分隔空格或冒号。 – rodion 2011-03-16 03:42:20

相关问题