我有一个看起来像的输出文件。
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循环将输出重定向到每个开关的临时文件命名。
因此,每次在文件上找到主机时,它将像上面一样打印:)
答案 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