【问题标题】:Extracting a string from multiline output从多行输出中提取字符串
【发布时间】:2014-08-28 03:34:00
【问题描述】:

我有一个命令输出系统中所有磁盘的列表,例如:

Real file                      Device on system     Type       Size      
------------------------------ -------------------- ---------- ----------
/dev/vg/newsystem_canada       /dev/vda             Device     19.53 GB  
/dev/vg/newsystem_canada       /dev/vdb             Device     1.50 GB

现在,我需要从所有这些行中提取到主磁盘的路径,在本例中为“/dev/vda”,但在其他情况下可能会有所不同。在每种情况下,使用 grep、stripos 等获取正确主磁盘路径的理想 PHP 或 BASH 命令行是什么?谢谢!

【问题讨论】:

  • 我们如何知道哪个是主磁盘?是不是总是出现在顶部?
  • 我想是的,主要的总是出现在顶部。但更好的主磁盘标识符是字母“a”。因为在不同的系统中,主磁盘总是以“a”结尾:/dev/sda 或 /dev/vda

标签: php regex bash


【解决方案1】:

您可以使用以下 awk 命令,该命令仅打印以字母 a 结尾的磁盘路径,

command | awk '/^\/dev/{if($2 ~ /a$/) {print $2};}'

你可以使用下面的 grep 命令,

command | grep -oP '\/\S+\s*\K\/dev\/.*?a(?= )'

【讨论】:

  • 我认为这是正确的道路,但是这两种情况都返回“/dev/vg/newsystem_canada”而不是“/dev/vda”。我真的只需要“/dev/**a”部分。
  • 只需将 grep 命令更改为 grep -oP '\/\S+\s*\K\/dev\/.*?a(?= )' 并将 awk 打印语句中的 $1 更改为 $2
  • grep -oP '\/\S+\s*\K\/dev\/.*?a(?= )' 就像一个魅力!谢谢!
【解决方案2】:

如果输出顺序不同,则使用已知的磁盘大小进行匹配

正则表达式:

([\w\/]+)\s+\w+\s+19.53 GB

正则表达式匹配:/dev/vda Device 19.53 GB

匹配 1:/dev/vda

查看第一场比赛:http://regexr.com/39d8j

【讨论】:

  • 大小可能不同,所以这不是我想要的。
  • 比第一个条目?使用其他正则表达式
【解决方案3】:

给你

正则表达式

(?<!\n)(?<=\s)(\/[^\s]*)

测试字符串

Real file                      Device on system     Type       Size      
------------------------------ -------------------- ---------- ----------
/dev/vg/newsystem_canada       /dev/vda             Device     19.53 GB  
/dev/vg/newsystem_canada       /dev/vdb             Device     1.50 GB

结果

  • 匹配 1
      1. [179-187]/dev/vda
  • 比赛 2
      1. [253-261]/dev/vdb

演示

试试demo here


编辑

您可能想要获取磁盘的大小以确定它是否是主磁盘

正则表达式

(?<!\n)(?<=\s)(\/[^\s]*).*?([\d\.]++\s\w+)

测试字符串

Real file                      Device on system     Type       Size      
------------------------------ -------------------- ---------- ----------
/dev/vg/newsystem_canada       /dev/vda             Device     19.53 GB  
/dev/vg/newsystem_canada       /dev/vdb             Device     1.50 GB

结果

  • 匹配 1
      1. [179-187]/dev/vda
      2. [211-216]19.53 GB
  • 比赛 2
      1. [253-261]/dev/vdb
      2. [285-289]1.50 GB

演示

试试demo here


编辑 2

如果磁盘以a 结尾,那么识别相同就变得非常简单

磁盘名称

(?<!\n)(?<=\s)(\/[^\s]*a)

demo

磁盘名称和大小

(?<!\n)(?<=\s)(\/[^\s]*a).*?([\d\.]++\s\w+)

demo

【讨论】:

  • 他不想要一个正则表达式,而且他只想要他的主磁盘的路径。
  • @AvinashRaj 确实如此,我从您在问题中的评论中读到了同样的内容。我更新了它以返回磁盘大小,可能会成为相同的标识符。也许vda 似乎更符合逻辑。
  • 很好,但是如何只为主磁盘获得一个结果?
  • 磁盘大小可能因情况而异,因此唯一的标识符将是字母“a”,因为在不同的系统中,主磁盘总是以“a”结尾:/dev/sda 或 /dev/ vda
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 2017-02-16
  • 1970-01-01
  • 2013-10-30
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多