有什么建议么?我读到:转义序列(GNU Awk 用户指南)
代表例
$ Filesystem='/dev/mapper/vgubuntu-Media'
$ FilesystemRegex="$(echo "${Filesystem}" | sed "s~/~\\\/~g")"
$ echo "$FilesystemRegex"
\/dev\/mapper\/vgubuntu-Media
$ df -H "${Filesystem}" | awk -v Regex="${FilesystemRegex}" '/$Regex/{print $5}'
awk: warning: escape sequence `\/' treated as plain `/'
$ df -H "${Filesystem}" | awk '/\/dev\/mapper\/vgubuntu-Media/{print $5}'
62%
/$Regex/
Regex
是一个正则表达式,在主语 ( ) 结尾之后查找,$
因此显然永远不会匹配。要将
awk
变量用作正则表达式,您不能使用/.../
不支持嵌入变量的运算符,您需要:相反(还要记住,
$
运算符 inawk
是取消引用字段,而不是像 shell 中那样引用变量)。awk
要基于 shell 变量定义该变量,请勿-v
使用-v
mangles blackslashes 。相反,使用环境变量:
但在这里,看起来你更想要:
-H
毫无意义,因为第五个字段²是百分比。或者演示
$
操作符的用法:这里
$
应用于 awk 变量以检索相应的字段,空格是可选的,您可以使用$fs_field
or$ ( fs_field )
或$(fs_field * 1 + 0)
...无论如何,
/
在正则表达式中并不特殊,也不需要转义。仅当它字面出现在运算符内部时才需要转义,否则它将被视为该运算符的/.../
结束。/
df
您建议您可能使用的GNU 实现-H
也支持指定要在输出中包含哪些字段。所以你可以这样做:
如果在基于 Linux 的系统上,另请参阅:
1 通过解释和替换
\x
转义序列,与它自己(或 C 的)语法的字符串相同。GNU 的最新版本awk
还破坏以@/
和开头的字符串/
。出于类似的原因,不要使用echo
² 虽然这不能保证是第五列,因为第一列很可能包含空白。
-你可以这样做!
其中 $5 是显示文件系统已用空间百分比的字段,$6 是显示文件系统名称的字段,$1 是已验证设备的名称!在最后一个选项之后,“grep nvme0n1p4”就是我们要验证可用空间的设备的名称,好吧!所有这一切只是向我们展示了这样的东西: