我想做一些简单的正则表达式,所以我想得到 16。我试过 grep 但我不知道如何写 \1 或 $1 只输出捕获数据,我试过 sed 但我认为我做错了由于转义我不熟悉。反正我的正则表达式是这个
(\d+)\%\s*/$
字符串是
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/xvda 15997904 2404540 12943248 16% /
tmpfs 252456 0 252456 0% /lib/init/rw
tmpfs 252456 36 252420 1% /dev/shm
在这个网站上,输出正是我想要的(将鼠标移到查看组匹配)http://regexr.com?2sd12
awk 非常适合这项任务:
说跳过第一行
NR > 1
,然后在所有其他行上打印第 5 和第 6 个空格分隔的字段。它产生:添加以回应评论:
演示站点与您的描述不符,抱歉。尽管有更简单的方法可以做到这一点,但这里
tr
添加了相同的链,因此您的框中还有一个工具:如果你只想要它(例如) /dev/shm 那么:
或根:
而不是使用某些工具来更改 的输出
df
,您应该简单地使用df
'--output
选项来限制输出以满足您的需要:要仅获取 % 值:
要获得相同的结果
/
:默认情况下,grep ) 打印与正则表达式匹配的整行,但您可以使用 option 告诉它仅打印匹配的字符串
--only-matching
:注意:
grep/ egrep正则表达式语法与您发布的 PERL 风格的正则表达式语法有点不同。此外,grep 支持的正则表达式语法(称为“POSIX 基本正则表达式”)与egrep中使用的正则表达式语法(扩展正则表达式)之间存在差异。
没有办法告诉 egrep 输出匹配的某个子表达式:将打印整个匹配,包括
%
符号。但是你可以用tr 去掉它。只是为了好玩,您可以使用 Python 来检索磁盘使用情况。
以下代码片段将显示模式第一次出现时的值(在您的情况下为16):
如果您想从每一行中检索值,那么更长的代码就可以了:
基本上它的工作方式相同,只是它逐行读取输出,而
Popen.communicate()
不是一次检索整个输出的调用。