如何编辑 conky 模板以动态显示连接的 USB 设备?

问题描述

我遵循了 Casey's Conky Reference with Examples 中的示例。

修改了它


[conky config section]
 -- Format the storage information the same way for every device. Parameters: [human name] [path]
template3 = "\\1 [${fs_size \\2} ${fs_type \\2}]${alignr}${fs_used \\2} used ${fs_bar 10,60 \\2}\n${alignr}${voffset -15}${fs_used_perc \\2}%\nMount=${color3}\\2$color",[conky TEXT section]
${execpi 60 df -h -t ext4 -t vfat -t fuse.sshfs -t fuseblk -t hfsplus --output=source,target | grep  -ve "boot" -ve "nvme0"  -ve "sda"  | grep '^/dev/' | cut --characters=6- | sed 's/^/\$\{template3 /;s/$/\}/'}

哪个有效。

我想把USB设备的名字分开并显示出来,而不是显示挂载点的整个路径。

所以,我尝试了以下几行:

[conky config section]
template3 = "\\1 [${fs_size \\2} ${fs_type \\2}]${alignr}${fs_used \\2} used ${fs_bar 10,60 \\2}\n${alignr}${voffset -15}${fs_used_perc \\2}%\nName=${color3}\\$color",target | grep  -ve "boot" -ve "nvme0"  -ve "sda"  | grep '^/dev/' | awk -F/ '{printf "%s\t%s\n",$0,$NF}' | cut --characters=6- | sed 's/^/\$\$\{template3 /;s/$/$/\}/'}


我不知道如何让它发挥作用,可能是因为我不太擅长 sed

解决方法

您需要向模板添加第三个参数,并使用 \\3 引用它。所以你把它改成:

template3 = "...Name=${color3}\\3$color"

当实际使用模板时,第三个参数必须以空格分隔,而不是由您在添加的 \t 中使用的选项卡 awk 分隔。您不需要更改 sed,它只是用 ${template3 ... } 包围输出。

您可以更轻松地在 awk 中完成所有工作,而不是混合使用 grep、awk 和 sed。试试:

${execpi 60 df -h -t ext4 -t vfat -t fuse.sshfs -t fuseblk \
  -t hfsplus --output=source,target |
 awk -F/ '/boot|nvme0|sda/{ next }
          $0 ~ "^/dev/" { printf "${template3 %s %s}\n",substr($0,6),$NF }'}

原来的 grep -ve "boot" 表示匹配行包含“boot”。 awk 等价物将是 /boot/{ next },即:如果您匹配输入行中的正则表达式“boot”,则继续处理下一个输入行。正则表达式 /boot|nvme0|sda/ 表示 bootnvme0sda

原始的 grep '^/dev/' 使用正则表达式,这意味着只匹配以 ^ 开头的 (/dev/) 行。 awk 等价物可以是 /^\/dev\//{print},但由于正则表达式必须在 // 中,这意味着您需要转义 / 并且可能比替代方案可读性差一点: $0 ~ "^/dev/" {....},其中 $0 是整行,~ 表示匹配,您可以使用引号中的字符串作为正则表达式。

原来的 cut ... 表示从第 6 个字符开始,而 awk 有一个函数 substr(string,start,length) 来制作一个可以做到这一点的子字符串。如果没有给出长度,则返回整个字符串的其余部分。

您可以在 ${exec} 形式中换行,但您必须小心使用模板:使用技巧确保 ${template3 永远不会出现在字符串中。我在这里使用了 $\{