Bash 根据分隔符打印所有信息

Bash 根据分隔符打印所有信息,bash,shell,unix,scripting,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

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

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循环将输出重定向到temp file naming per switch


因此,每次在文件中找到主机时,它都会像上面那样打印:)

如果您同意
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的评论更改代码以查找多个主机(尚未测试)


请给艾克打一针。以下内容应与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为非零,则打印该行,否则不执行任何操作

为了清楚起见,您希望它能够有效地打印从上一个/当前ID到不包含下一个ID的所有内容?@gafm,通过查看您的个人资料,您知道您没有选择正确答案,所以请在某个时候给出答案,当您有一些答案时,尝试选择其中任何一个作为正确答案。你也可以对前面的所有问题都这样做(以防你也从中找到答案)。@RavinderSingh13,对不起,我的错。将查看我的所有帖子并选择答案。对不起,我试过了,但它没有打印出我想要的所有信息。正如vintnes所说,数据部分是动态的。@gafm,我刚刚添加了运行代码后得到的输出,它看起来与您显示的一样,请更清楚预期的输出?基本上,此部分可以小于或大于4
5001438024D29646 0:2:2 5001438024D29644 1:2:1 5001438024D29644 0:2:1 5001438024D29646 1:2
。我想捕获的是关于主机的信息,不管iscsi是少还是多。@gafm,它肯定会打印所有行,直到出现一行a,这行a不是从空格开始的,所以匹配后打印4行不是硬编码的,如果有任何疑问,请告诉我。顺便说一句,我有一个输入选项来搜索主机<代码>读取主机。。当我将主机更改为search时,它不会打印超过4个datagood catch@vintnes的所有
-WWN/iSCSI\u Name-
。万岁!但是,我在搜索其他主机时遇到问题。有没有办法像在
grep-i
中那样忽略大小写区分?@gafm请参阅更新的脚本以了解大小写不敏感;使用正则表达式匹配,您还可以在提示符处指定GLOB-A2-WST,它将匹配2和3。如果您阅读Thank@vintnes,每个自愿在此花费时间的人都会非常感激。添加了IGNORECASE,现在工作正常。非常感谢你的帮助<代码>awk-vm=$host'BEGIN{IGNORECASE=1}$2==m{p=1}NF>2&&$2=m{p=0}p'${temp}/*Hi vintnes,因此我能够显示主机并忽略大小写区别。多亏了你的帮助。但是,不会打印找到主机/字符串的文件名。我怎样才能做到呢?我编辑了我的作品。你能检查一下吗?@gafm这可能是一个单独的问题。我给你两个提示。当前文件名存储在一个特殊变量
FILENAME
,您可以用分号
分隔
{action}
中的命令。祝你好运
read -p "Match: " match
awk -v IGNORECASE=1 -v m="$match" '$2~m {p=1} NF>2 && $2!~m {p=0} p' file