从文件中选择并输出特定字符串

从文件中选择并输出特定字符串

我有一个文件,其内容是

ae-scc-san-vserver01 /vol/ae_drac02_1_oradminvg_vol/ae_drac02_1_oradminvg_lun               hdisk0          fcs0       FCP        150g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_rootvg_vol/ae_drac02_1_rootvg_lun                     hdisk1          fcs0       FCP        100g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskcrs03SVC_vol/ae_drac02_1_2_hdiskcrs03SVC_lun   hdisk11         fcs0       FCP        16.0g   C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata01SVC_vol/ae_drac02_1_2_hdiskdata01SVC_lun hdisk12         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata02SVC_vol/ae_drac02_1_2_hdiskdata02SVC_lun hdisk13         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata03SVC_vol/ae_drac02_1_2_hdiskdata03SVC_lun hdisk14         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata04SVC_vol/ae_drac02_1_2_hdiskdata04SVC_lun hdisk15         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata05SVC_vol/ae_drac02_1_2_hdiskdata05SVC_lun hdisk17         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata06SVC_vol/ae_drac02_1_2_hdiskdata06SVC_lun hdisk18         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata12SVC_vol/ae_drac02_1_2_hdiskdata12SVC_lun hdisk19         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata13SVC_vol/ae_drac02_1_2_hdiskdata13SVC_lun hdisk20         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata14SVC_vol/ae_drac02_1_2_hdiskdata14SVC_lun hdisk21         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata15SVC_vol/ae_drac02_1_2_hdiskdata15SVC_lun hdisk22         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata16SVC_vol/ae_drac02_1_2_hdiskdata16SVC_lun hdisk23         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata17SVC_vol/ae_drac02_1_2_hdiskdata17SVC_lun hdisk24         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata18SVC_vol/ae_drac02_1_2_hdiskdata18SVC_lun hdisk25         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata19SVC_vol/ae_drac02_1_2_hdiskdata19SVC_lun hdisk26         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata20SVC_vol/ae_drac02_1_2_hdiskdata20SVC_lun hdisk27         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata21SVC_vol/ae_drac02_1_2_hdiskdata21SVC_lun hdisk28         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata22SVC_vol/ae_drac02_1_2_hdiskdata22SVC_lun hdisk29         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_swapvg_vol/ae_drac02_1_swapvg_lun                     hdisk3          fcs0       FCP        32.0g   C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskdata23SVC_vol/ae_drac02_1_2_hdiskdata23SVC_lun hdisk30         fcs0       FCP        250g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskfra01SVC_vol/ae_drac02_1_2_hdiskfra01SVC_lun   hdisk31         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskfra02SVC_vol/ae_drac02_1_2_hdiskfra02SVC_lun   hdisk32         fcs0       FCP        240.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_u01vg_vol/ae_drac02_1_u01vg_lun                       hdisk4          fcs0       FCP        170.0g  C
ae-scc-san-vserver01 /vol/ae_drac02_1_exportsvg_vol/ae_drac02_1_exportsvg_lun               hdisk5          fcs0       FCP        100g    C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskcrs01SVC_vol/ae_drac02_1_2_hdiskcrs01SVC_lun   hdisk6          fcs0       FCP        16.0g   C
ae-scc-san-vserver01 /vol/ae_drac02_1_2_hdiskcrs02SVC_vol/ae_drac02_1_2_hdiskcrs02SVC_lun   hdisk7          fcs0       FCP        16.0g   C

我需要捕获服务器名称。它以 开始hdisk并以 结束SVC。我尝试了以下方法:

sed 's/^*hdisk(.*)SVC.*/\1/' filename

我收到此错误:

sed: 1: "s/^*hdisk(.*)SVC.*/\1/": \1 not defined in the RE

有人可以帮我如何捕获它吗?

答案1

问题是hdisk...SVC出现了两次在行中,并且.*贪婪的

如果你有 GNU grep,你可以使用该-P选项来获得非贪婪匹配:

grep -oP '(?<=hdisk).+?(?=SVC)' file | sort -u

输出

crs01
crs02
crs03
data01
data02
data03
data04
data05
data06
data12
data13
data14
data15
data16
data17
data18
data19
data20
data21
data22
data23
fra01
fra02

答案2

您需要转义括号(并且您还需要使用星号或某种其他方法来匹配 hdisk 和 SVC 之间的多个字符)。例如:

sed 's/^hdisk\([^\/]*\)SVC.*/\1/' filename

答案3

您还可以使用awk基于 - 的方法:

使用 GNU Awk:

awk 'match($2,/^\/vol[[:print:]]*hdisk([^_]+)SVC/,v) {print(v[1])}' filename

将匹配第二列包含模式的任何行并打印和/vol<...>hdisk<...>SVC<...>之间的字符串hdisk首先 SVC,因为下划线_已被排除。

另一种方法(应该是可移植的)

awk 'split($2,v,/hdisk|SVC/)>1 {print v[2];next}' filename

将使用hdiskSVC作为字段分隔符将第二列拆分为多个字段,如果找到多个字段,则打印第二个字段。

相关内容