【问题标题】:Print all the information based from the separator打印基于分隔符的所有信息
【发布时间】:2019-07-02 14:15:18
【问题描述】:

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

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 循环将输出重定向到每个开关的临时文件命名。

所以每次在文件中找到主机时,它都会像上面一样打印:)

【问题讨论】:

  • 为了清楚起见,您希望它有效地打印从上一个/当前 ID 到不包含下一个 ID 的所有内容?
  • @gafm,通过查看您的个人资料,您知道您没有选择一个答案作为正确答案,因此请在某个时间给出它,当您有一些答案时,请尝试选择其中任何一个作为正确答案。你也可以对之前的所有问题都这样做(如果你也能在其中找到答案)。
  • @RavinderSingh13,对不起。将审查我的所有帖子并选择一个答案。对不起。

标签: bash shell unix scripting


【解决方案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 不为零,则打印该行,否则什么也不做

【讨论】:

  • 好消息@vintnes。欢呼!但是,我在搜索另一台主机时遇到问题。有没有办法像grep -i 一样忽略大小写区别?
  • @gafm 请查看更新后的脚本以了解不区分大小写;使用正则表达式匹配,您还可以在提示符处指定 GLOB-A2-WST,它将匹配 2 和 3。如果您阅读 What should I do when someone answers my question?
  • 谢谢@vintnes。添加了 IGNORECASE,它现在工作正常。非常感谢你的帮助。 awk -v m=$host 'BEGIN{IGNORECASE = 1} $2==m {p=1} NF>2 && $2!=m {p=0} p' ${temp}/*
  • 嗨 vintnes,所以我能够显示主机并忽略大小写区别。感谢您的帮助。但是,未打印找到主机/字符串的文件的名称。我该怎么做呢?我编辑了我的 OP。请检查一下。
  • @gafm 这应该是一个单独的问题。我给你两个提示。当前文件名存储在特殊变量FILENAME 中,您可以使用分号; 分隔{action} 中的命令。祝你好运!
【解决方案2】:

如果您对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 的 cmets 查找多个主机(尚未测试)。

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

【讨论】:

  • 试过了,它并没有打印出我想要的所有信息。就像 vintnes 所说,数据部分是动态的。
  • @gafm,我刚刚添加了运行代码后得到的输出,它看起来与您显示的相同,请更清楚预期的输出?
  • 基本上,这部分可以少于或多于4个5001438024D29646 0:2:2 5001438024D29644 1:2:1 5001438024D29644 0:2:1 5001438024D29646 1:2:2。我要捕获的是有关主机的信息,无论该 iscsi 是少还是多。
  • @gafm,它肯定会打印所有行,直到出现一行不是从空格开始的行,所以在匹配后打印 4 行并不是硬编码,请让我知道以防万一有什么疑问吗?
  • 顺便说一句,我有一个输入选项来搜索主机..read host.. 当我将主机更改为搜索时,它不会打印所有超过 4 个的 -WWN/iSCSI_Name-数据
猜你喜欢
  • 2016-03-07
  • 2019-03-06
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 2021-12-31
  • 2015-07-11
相关资源
最近更新 更多