“grep”来自“df”输出的可用空间

“grep”来自“df”输出的可用空间

你好,我需要 grep df 的输出。遗憾的是 awk 不是一个选项(尽管它是一个简单的选项),在这里我只能使用 grep。

Filesystem           1K-blocks      Used Available Use% Mounted on
none                         4         0         4   0% /sys/fs/cgroup
none                      5120         0      5120   0% /run/lock
none                   1981488       444   1981044   0% /run/shm
none                    102400        64    102336   0% /run/user
/dev/sda3            418176236 281033024 137143212  67% /media/mark/7EE21FBAE21F761D

例如,我想要以 /dev/sda3 开头的行的 $4 列

答案1

-P如果您有支持(perl 兼容正则表达式,PCRE)和-o(仅打印匹配字符串)的 grep 版本,您可以执行以下操作

df | grep -oP '/sda3.* \K\d+(?=\s+\d+%)' 

解释

在这里,我们匹配/sda3,然后匹配尽可能多的字符,直到找到一段数字 ( \d+),后跟一个或多个空格 ( \s+),然后是一个或多个数字 ( \d+) 和 a %。该foo(?=bar)构造是一个积极的前瞻foo,它允许您仅在后面跟着 string 的情况下搜索该字符串bar。这\K是一个 PCRE 技巧,意思是“丢弃到目前为止匹配的任何内容”。与 结合使用-o,它允许您使用模式前面的字符串来锚定您的匹配项,但不打印它们。

如果没有-P,事情会变得更加棘手。您需要多次通过。例如:

df | grep -o '/sda3.*%' | grep -Eo '[0-9]+ *[0-9]+%' | grep -Eo '^[0-9]+'

解释

在这里,第一个grep标识正确的行并打印直到%.第二个打印在空格之前的最长的数字,以及以 结尾的另一段数字%,最后一个打印在行开头找到的最长的数字。由于上一张只打印了可用空间和百分比,所以这是可用空间。

如果您grep甚至不支持-E,您可以这样做:

df | grep -o '/sda3.*%' | grep -o '[0-9]* *[0-9]*%' | grep -o '[0-9][0-9]* '

解释

在这里,我们不能使用+“一个或多个”,因此,对于最后一个grep,我们需要指定至少一个数字,后跟 0 个或多个 ( [0-9][0-9]*)。


当然,如果您可以使用其他工具,事情就会变得容易得多:

df | sed -n '/sda3/{s/  */ /gp}' | cut -d' ' -f4

解释

除非当前行匹配( ),否则不会sed打印任何内容( ),如果匹配,它将用一个空格替换所有连续空格,从而允许使用打印第四个字段。-nsda3/sda3/{}cut


或者

df | perl -lne 'm#/sda3.+\s(\d+)\s+\d+%# && print $1' 

解释

-l为每个打印调用添加一个换行符,这意味着-n“逐行读取输入”,并且-e允许您在命令行上传递脚本。脚本本身匹配sda3,然后是任意一段直到空格的字符,后跟一个或多个数字 ( \s(\d+)),然后是空格,后跟一段以%( \s+\d+) 结尾的数字。括号捕获我们感兴趣的部分,然后将其打印为$1


或者

df | tr -s ' ' $'\t' | grep sda3 | cut -f4

解释

这里,我们简单地使用tr将多个连续空格转换为制表符( 的默认分隔符cut),然后grep对于 sda3 并打印第 4 个字段。

答案2

如何使用 grep 按照你要求的方法解决它已经得到回答了;
这个答案是关于如何解决例子问题 - 从中​​获取单独的值 df:

GNU有一个选项dfcoreutils指定输出中显示的列:

$ df --output=avail /dev/sda3
  Avail
9816416

不幸的是,没有选项可以抑制列标题 - 因此需要在额外的步骤中将其丢弃,方法是tail

$ df --output=avail /dev/sda3 | tail -n 1
9816416

或者grep,如果您愿意的话:

$ df --output=avail /dev/sda3 | grep '[0-9]'
9816416

答案3

根据您的 grep 版本,您还可以使用-ofor only 和-Efor 扩展正则表达式。

所以你可以使用

df | grep /dev/sda3 | grep -E -o "[[:digit:]]+[[:space:]]+[[:digit:]]+%" | grep -E -o ".+\s"

这需要%char 作为第一个 grep 的锚点。之后,您将获得第一个字符,直到第二个 grep 的空格为止。

相关内容