打印来自分隔符的所有信息

时间:2019-07-02 14:15:18

标签: bash shell unix scripting

我有一个看起来像的输出文件。

Id Name            Persona       -WWN/iSCSI_Name- Port
73 GLOB-A2-WST2   WindowsServer 5001438036830FDE 0:2:4
                                 5001438036830FDC 0:2:3
                                 5001438036830FDE 1:2:4
                                 5001438036830FDC 1:2:3
74 GLOB-A2-WST3   WindowsServer 5001438036830FEE 0:2:2
                                 5001438036830FEC 1:2:1
                                 5001438036830FEC 0:2:1
                                 5001438036830FEE 1:2:2
56 GLOBBACDB01      Generic       50014380073051CC ---
                                 50014380073051CE ---
64 GLOBCIBSSLRDB01  Generic-ALUA  5001438024D29646 0:2:2
                                 5001438024D29644 1:2:1
                                 5001438024D29644 0:2:1
                                 5001438024D29646 1:2:2
65 GLOBCIBSSLRDB02  Generic-ALUA  5001438024D293C6 0:2:4
                                 5001438024D293C4 1:2:3
                                 5001438024D293C4 0:2:3
                                 5001438024D293C6 1:2:4
57 GLOBCRMDB01      WindowsServer 5001438026EDA668 ---
                                 5001438026EDA66A ---
44 GLOBETEBPIDB01   WindowsServer 50014380296B9B86 1:2:4
37 GLOBVMWBCKHS01   WindowsServer 10000090FA371A09 1:2:4
                                 10000090FA371A08 1:2:3
                                 10000090FA371A08 0:2:3
                                 10000090FA371A09 0:2:4
17 S5POC           Generic-ALUA  21000024FF4D665E 1:2:4
                                 21000024FF4D6660 1:2:3
                                 21000024FF4D6660 0:2:3
                                 21000024FF4D665E 0:2:4
34 SOXICS50        Generic       210100E08BB0EE80 ---
                                 210100E08BB2C145 ---
                                 10000000C94A7EC7 ---
                                 210000E08B92C145 ---
59 UNISI279        AIX-legacy    10000000C944BBF0 ---
                                 10000000C944C29F ---
55 VMX01          VMware        10000000C9D09728 ---
                                 10000000C9D09ADC ---
58 VMX02          VMware        10000000C9D0AC2B ---
                                 10000000C9D0AC27 ---

如果我尝试grep,例如GLOBCIBSSLRDB01,

我的输出将只打印与之关联的行。

$ cat p | grep -i GLOBCIBSSLRDB01
64 GLOBCIBSSLRDB01  Generic-ALUA  5001438024D29646 0:2:2

如何使它看起来似乎包含有关主机的所有信息。

Name of the file where the host is found 
64 GLOBCIBSSLRDB01  Generic-ALUA     5001438024D29646 0:2:2
                                     5001438024D29644 1:2:1
                                     5001438024D29644 0:2:1
                                     5001438024D29646 1:2:2
echo (space)

Name of the file where the host is found 
64 GLOBCIBSSLRDB01  Generic-ALUA     5001438024D29646 0:2:2
                                     5001438024D29644 1:2:1
                                     5001438024D29644 0:2:1
                                     5001438024D29646 1:2:2

文件名是开关名,因为我使用for循环将输出重定向到每个开关的临时文件命名。

因此,每次在文件上找到主机时,它将像上面一样打印:)

2 个答案:

答案 0 :(得分:1)

请给Awk一个机会。以下应符合POSIX。

read -p "Match: " match
awk -v IGNORECASE=1 -v m="$match" '$2~m {p=1} NF>2 && $2!~m {p=0} p' file
  • $2~m {p=1}-如果第二个字段与m匹配,请将p设置为1
  • NF>2 && $2!~m {p=0}-如果有两个以上字段,而第二个字段不匹配m,则将p设置为0
  • p-如果p不为零,则打印该行,否则不执行任何操作

答案 1 :(得分:0)

如果您对awk表示满意,请尝试以下。

awk -v string="GLOBCIBSSLRDB01" '!/^ +/{flag=""} $2==string{flag=1} flag' Input_file

您可以在上面的代码中更改字符串-v string="GLOBCIBSSLRDB01"的值,以进行不同的字符串搜索。同样,代码正在将其与第二行字段进行比较(如果它是不同的字段),则可以对其进行更改。

输出如下。

64 GLOBCIBSSLRDB01  Generic-ALUA  5001438024D29646 0:2:2
                                 5001438024D29644 1:2:1
                                 5001438024D29644 0:2:1
                                 5001438024D29646 1:2:2

从@vintnes那里获取灵感,并根据OP的注释(未经测试)更改代码以寻找多个主机。

awk -v hosts="globcibsslrdb01,xyz,abc" '
BEGIN{
  split(hosts,array,",")
}
{
  val=tolower($2)
}
(val in a){
  flag=val
  p=1
}
NF>2 && val!=flag{
  p=0
}
p
'  Input_file