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
设置为1p
-如果有两个以上的字段,而第二个字段与NF>2&&2美元~m{p=0}
不匹配,则将m
设置为0p
-如果p为非零,则打印该行,否则不执行任何操作p
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