使用bash中的命令行utils解析变量数组

时间:2012-01-30 02:46:48

标签: linux bash parsing dbus

要在spotify中播放当前歌曲(使用DBus),我使用以下命令:

dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Get string:'org.mpris.MediaPlayer2.Player' string:'Metadata'

现在,下面命令的输出如下:(为了清晰起见,将其拆除)

variant       array [
     dict entry(
        string "xesam:artist"
        variant                array [
              string "The Black Keys"
           ]
     )

     dict entry(
        string "xesam:title"
        variant                string "Give Your Heart Away"
     )
     ]

输出有点长&我想解析标题,艺术家等的具体价值。

谷歌搜索说variant是组件对象模型中使用的一种流行数据类型,所以我得到的是更好的方式,而不是使用sed / awk来获取值。那么,我该怎么做呢?

2 个答案:

答案 0 :(得分:3)

试试这个

awk '
  /string  *"xesam:artist/{
    while (1) {
      getline line
      if (line ~ /string "/){
        sub(/.*string "/, "artist:", line)
        sub(/".*$/, "", line)
        print line
        break
      }
    }
  }
  /string  *"xesam:title/{
    while (1) {
      getline line
      if (line ~ /string "/){
        sub(/.*string "/, "title:", line)
        sub(/".*$/, "", line)
        print line
        break
      }
    }
  }
'  variantArraySample.txt

提供输出

artist:The Black Keys
title:Give Your Heart Away

这假设输入之间始终存在至少1行差异,即

    string "xesam:title"
    variant                string "Give Your Heart Away"

也就是说,如果您的数据全部汇总到一行,则需要进一步的逻辑,所以

    string "xesam:title" variant string "Give Your Heart Away"

(例如),需要更改上述脚本。

如果您需要帮助我根据需要进一步格式化输出,请告诉我。

我希望这会有所帮助。

答案 1 :(得分:1)

无论“标题”或“艺术家”的顺序是什么,以下情况都有效。唯一的限制是,在看到:title之后,包含string的下一行必须是标题字符串;尽管这条线有多远并不重要。同样对于艺术家

awk '
/:artist/{a=1;next}
/:title/{t=1;next}
a && /string/{
  sub(/^.*string /,"")
  artist=$0
  a=0; next
}
t && /string/{
  sub(/^.*string /,"")
  title=$0
  t=0;next
}
END{
  printf("artist:%s\n title:%s\n", artist,title)
}'

输出

artist:"The Black Keys"
 title:"Give Your Heart Away"