外壳上的正则表达式?

外壳上的正则表达式?

我想做一些简单的正则表达式,所以我试图得到 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

答案1

awk 非常适合这项任务:

df | awk 'NR > 1 {print $5, $6;}'

表示跳过第一行NR > 1 ,然后在所有其他行上打印第 5 和第 6 个空格分隔的字段。结果如下:

65% /
1% /dev
1% /dev/shm

添加以回应评论:

抱歉,演示站点与您的描述不符。虽然有更简单的方法可以做到这一点,但以下是相同的链,但tr添加了一个,以便您的工具箱中多了一个工具:

df | awk 'NR > 1 {print $5;}' | tr -d '%'

如果你只想要它用于(例如)/dev/shm,那么:

df | awk '/\/dev\/shm$/ {print $5;}' | tr -d '%'

或根:

df | awk '/\/$/ {print $5;}' | tr -d '%'

答案2

您不需要使用某些工具来改变的输出df,而只需使用df--output选项来限制输出以满足您的需要:

df --output=pcent,target

仅获取%值:

df --output=pcent | tail -n+2 | tr -d '[% ]'

为了获得相同的结果/

df --output=pcent / | tail -n+2 | tr -d '[% ]'

答案3

默认情况下,grep)打印与正则表达式匹配的整行,但你可以告诉它用选项仅打印匹配的字符串--only-matching

df -h | egrep --only-matching '[[:digit:]]+%' | tr -d '%'

注意:

  1. grep/egrepregexp 语法与您发布的 PERL 样式的 regexp 语法略有不同。此外,grep 支持的 regexp 语法(称为“POSIX 基本 regexp”)与egrep(扩展正则表达式)。

  2. 没有办法告诉 egrep 输出匹配的某个子表达式:整个匹配都会被打印出来,包括符号%。但你可以用tr

答案4

只是为了好玩,您可以使用 Python 来检索磁盘使用情况。

以下代码片段将显示模式第一次出现时的值(在您的例子中16):

import subprocess
import re
print re.search('(\d+)% /', subprocess.Popen(["df"], stdout=subprocess.PIPE).communicate()[0]).group(1)

如果你想从每一行检索值,那么稍长一点的代码就可以了:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import subprocess
import re

p = subprocess.Popen(["df"], stdout=subprocess.PIPE)
for line in p.stdout:
    usage = re.search('(\d+)% /', line.rstrip())
    if usage != None:
        print usage.group(1)

基本上,它的工作方式相同,只是它逐行读取输出,而不是Popen.communicate()一次性检索整个输出的调用。

相关内容