【问题标题】:How to extract values from text using multiple (nested) delimiters如何使用多个(嵌套)分隔符从文本中提取值
【发布时间】:2012-03-03 15:04:01
【问题描述】:

在日常工作中,我需要从各种混合格式的日志和其他文本数据中提取一些文本。是否有一个实用程序(如 awk、grep 等)我可以用来快速执行任务,而无需编写冗长的 bash/perl/python 脚本?

示例 1:对于下面的输入文本

mylog user=UserName;password=Password;other=information

我想提取用户名和密码值。伪实用程序最好看起来像这样(a la 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]"}'

将解析结果转成map,方便按键查找。

示例 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 中进一步处理。

如果有任何建议或cmets,将不胜感激。

【问题讨论】:

    标签: linux unix sed awk grep


    【解决方案1】:
    $ 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
    

    【讨论】:

    • 对于您的最后一个示例,您错过了作为字段分隔符的空格,并打印了 $4。
    • @glennjackman:不,我只是故意忽略它(但我不应该这样做)。我会把它添加到我的答案中。
    • +1 以获得很棒的提示。是否可以将其扩展为使用多个字符的字符串作为分隔符?例如。利用 ” ;” (space-colon) 作为分隔符,但避免自己分隔空格或冒号。
    • @rodion: ; 是分号,: 是冒号。是的,您可以使用字符串或正则表达式作为字段分隔符。 echo 'abc def;ghi ;jkl' | awk -F ' ;' '{print $2}' 输出“jkl”。
    • 谢谢!我认为这解决了我的问题。每天学习关于 awk 的新知识:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2015-10-11
    • 1970-01-01
    • 2017-06-25
    • 2016-01-03
    • 2016-06-03
    相关资源
    最近更新 更多