问题描述
我遵循了 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/
表示 boot
或 nvme0
或 sda
。
原始的 grep '^/dev/'
使用正则表达式,这意味着只匹配以 ^
开头的 (/dev/
) 行。 awk 等价物可以是 /^\/dev\//{print}
,但由于正则表达式必须在 //
中,这意味着您需要转义 /
并且可能比替代方案可读性差一点:
$0 ~ "^/dev/" {....}
,其中 $0
是整行,~
表示匹配,您可以使用引号中的字符串作为正则表达式。
原来的 cut ...
表示从第 6 个字符开始,而 awk 有一个函数 substr(string,start,length)
来制作一个可以做到这一点的子字符串。如果没有给出长度,则返回整个字符串的其余部分。
您可以在 ${exec}
形式中换行,但您必须小心使用模板:使用技巧确保 ${template3
永远不会出现在字符串中。我在这里使用了 $\{
。