twi*_*igg 2 grep disk-usage text-processing
您好,我需要 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
Run Code Online (Sandbox Code Playgroud)
因此,例如我想要以 /dev/sda3 开头的行的 $4 列
如果您的 grep 版本支持-P(与 perl 兼容的正则表达式、PCRE)和-o(仅打印匹配的字符串),则可以执行
df | grep -oP '/sda3.* \K\d+(?=\s+\d+%)'
Run Code Online (Sandbox Code Playgroud)
在这里,我们匹配/sda3,然后匹配尽可能多的字符,直到找到一串数字 ( \d+),其后跟一个或多个空格 ( \s+),然后是一个或多个数字 ( \d+) 和 a %。该foo(?=bar)构造是正向前瞻,它允许您foo仅在字符串后面跟着字符串时搜索该字符串bar。这\K是一个 PCRE 技巧,意思是“丢弃任何匹配到这一点的东西”。与 结合使用-o,它允许您使用位于模式之前的字符串来锚定您的匹配项,但不打印它们。
没有-P,事情就更棘手了。您将需要多次通过。例如:
df | grep -o '/sda3.*%' | grep -Eo '[0-9]+ *[0-9]+%' | grep -Eo '^[0-9]+'
Run Code Online (Sandbox Code Playgroud)
在这里,第一个grep标识正确的行并将所有内容打印到%. 第二个打印空格前最长的一段数字,另一段以 结尾的数字%,最后一个打印在该行开头找到的最长一段数字。由于前一个只打印了可用空间和百分比,因此这是可用空间。
如果你grep甚至不支持-E,你可以这样做:
df | grep -o '/sda3.*%' | grep -o '[0-9]* *[0-9]*%' | grep -o '[0-9][0-9]* '
Run Code Online (Sandbox Code Playgroud)
在这里,我们不能使用+“一个或多个”,因此,对于最后一个grep,我们需要指定至少一个数字,然后是 0 个或多个 ( [0-9][0-9]*)。
当然,如果您可以使用其他工具,事情就会变得容易得多:
df | sed -n '/sda3/{s/ */ /gp}' | cut -d' ' -f4
Run Code Online (Sandbox Code Playgroud)
该sed不会打印任何东西(-n),除非当前行的比赛sda3(/sda3/{}),如果这样做,替换所有连续的空格用一个单一的一个,允许使用的cut打印第四场。
或者
df | perl -lne 'm#/sda3.+\s(\d+)\s+\d+%# && print $1'
Run Code Online (Sandbox Code Playgroud)
在-l增加了一个新行每个打印调用,-n意思是“逐行读取输入线”和-e让你通过一个脚本的命令行上。脚本本身匹配sda3,然后是任何一段直到空格后跟一个或多个数字 ( \s(\d+)) 的字符,然后是空格后跟以%( \s+\d+)结尾的一段数字。括号捕获我们感兴趣的部分,然后将其打印为$1。
或者
df | tr -s ' ' $'\t' | grep sda3 | cut -f4
Run Code Online (Sandbox Code Playgroud)
在这里,我们只是使用tr将多个连续空格转换为制表符(默认分隔符cut),然后grep用于 sda3 并打印第 4 个字段。
怎么用 grep 你问的解决方法已经回答了;
这个答案是关于如何解决示例问题 - 从 df以下获取单独的值:
GNU dffromcoreutils有一个选项来指定输出中显示的列:
$ df --output=avail /dev/sda3
Avail
9816416
Run Code Online (Sandbox Code Playgroud)
不幸的是,没有选项可以抑制列标题 - 因此需要在额外的步骤中将其丢弃,使用tail:
$ df --output=avail /dev/sda3 | tail -n 1
9816416
Run Code Online (Sandbox Code Playgroud)
或者grep,如果您愿意:
$ df --output=avail /dev/sda3 | grep '[0-9]'
9816416
Run Code Online (Sandbox Code Playgroud)