你好,我需要 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
打印任何内容( ),如果匹配,它将用一个空格替换所有连续空格,从而允许使用打印第四个字段。-n
sda3
/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有一个选项df
来coreutils
指定输出中显示的列:
$ 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 版本,您还可以使用-o
for only 和-E
for 扩展正则表达式。
所以你可以使用
df | grep /dev/sda3 | grep -E -o "[[:digit:]]+[[:space:]]+[[:digit:]]+%" | grep -E -o ".+\s"
这需要%
char 作为第一个 grep 的锚点。之后,您将获得第一个字符,直到第二个 grep 的空格为止。