从多行输出中提取字符串

时间:2014-08-28 03:34:00

标签: php regex bash

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

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”,但在其他情况下可能会有所不同。什么是理想的PHP或BASH命令行使用像grep,stripos等的东西来获得正确的主磁盘路径?谢谢!

3 个答案:

答案 0 :(得分:0)

你去吧

<强>正则表达式

(?<!\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

答案 1 :(得分:0)

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

正则表达式:

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

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

匹配1:/dev/vda

请参阅第一场比赛:http://regexr.com/39d8j

答案 2 :(得分:0)

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

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

您可以使用以下grep命令

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