Arrays 在Bash中使用数组、Sed和Awk解析文本文件

Arrays 在Bash中使用数组、Sed和Awk解析文本文件,arrays,bash,awk,sed,xargs,Arrays,Bash,Awk,Sed,Xargs,我有一个复杂的文本文件,包含大约300个条目。 我不知道如何解析这个文件以获得我想要的输出。 我的每个网络用户在文件中都有一个条目。因此,在文本文件中,每个用户名称以以下开头: USER:martha USER:Othello USER:darwin 在文件中的每个用户条目下面都有我需要的大量信息,但一个用户可以有一个条目,另一个用户可以有多个条目。下面是3个此类条目的示例 USER:martha POSITION: 170.198.82.13 [VLT(304394),PT(FULL

我有一个复杂的文本文件,包含大约300个条目。 我不知道如何解析这个文件以获得我想要的输出。 我的每个网络用户在文件中都有一个条目。因此,在文本文件中,每个用户名称以以下开头:

USER:martha
USER:Othello
USER:darwin
在文件中的每个用户条目下面都有我需要的大量信息,但一个用户可以有一个条目,另一个用户可以有多个条目。下面是3个此类条目的示例

USER:martha
    POSITION: 170.198.82.13 [VLT(304394),PT(FULL)]
            CLIENT: jcrm19.1.p2ps -258-
            ACCESSPOINT: 170.198.82.13/net
            APPLICATION: 91

USER:othello 
    POSITION: 170.198.80.212 [VLT(307571),PT(FULL)]
            CLIENT: jcrm15.1.p2ps -258-
            ACCESSPOINT: 170.198.80.212/net
            APPLICATION: 256

            CLIENT: jcrm15.1.p2ps -258-
            ACCESSPOINT: 170.198.80.212/net
            APPLICATION: 256

    POSITION: 170.198.80.209 [VLT(306561),PT(FULL)]
            CLIENT: jcrm14.1.p2ps -258-
            ACCESSPOINT: 170.198.80.209/net
            APPLICATION: 256

            CLIENT: pwrm14.1.p2ps -258-
            ACCESSPOINT: 170.198.80.209/net
            APPLICATION: 256

            CLIENT: pwrm14.1.p2ps -258-
            ACCESSPOINT: 170.198.80.209/net
            APPLICATION: 256


USER:darwin
    POSITION: 170.198.19.102 [VLT(297987),PT(FULL)]
            CLIENT: jcrm16.1.p2ps -258-
            ACCESSPOINT: 170.198.19.102/net
            APPLICATION: 91
最终输出应如下所示:

USER        Position           Client     Application 

Martha      170.198.82.13       jcrm19      91
Othello     170.198.80.212      jcrm15      256
Othello     170.198.80.209      jcrm14      256
Martin      170.198.19.102      jcrm16      91
我有一些数组方面的经验,我可以grep出一些信息,分配给变量并打印它们。但我不知道如何将信息作为每个用户下的条目读入数组,因为它们的长度和内容不同

那么我如何阅读用户:玛莎,然后跳转到用户:奥赛罗?另外,在用户:Otherlo下,我需要抓住两个“位置”。我只是不知道如何将我正在寻找的内容放入数组变量或正则变量中。我从来没有解析过一个每次使用都有不同长度和内容数据的文件。不确定在开始读取并为数组赋值或为下一个用户赋值之前,我必须读取多少行>您能提供一些提示或一段代码吗


感谢您在
列中使用
awk

awk -F '[: ]+' 'BEGIN{print "USER", "Position", "Client", "Application"} 
  $1=="USER"{u=$2} $2=="POSITION"{p=$3}$2=="CLIENT"{c=$3}
  $2=="APPLICATION"&&p{print u, p, c, $3; p=""}' file | column -t

USER     Position        Client         Application
martha   170.198.82.13   jcrm19.1.p2ps  91
othello  170.198.80.212  jcrm15.1.p2ps  256
othello  170.198.80.209  jcrm14.1.p2ps  256
darwin   170.198.19.102  jcrm16.1.p2ps  91

我手头没有Mac电脑,所以这是未经测试的

awk -F: '/^USER:/{u=$2} /POSITION:/{p=$2} /CLIENT:/{c=$2} /APPLICATION:/{print u,p,c,$2}' yourfile

您可以将标题和管道添加到
列-t
,以获得更好的格式

这假设字段始终按照示例中的顺序排列。这可能是正确的,但应该指出。您好,谢谢。。我试过这个。是的,字段始终按此顺序排列。它适用于我提供的示例,而不是我拥有的文本文件。。不知道为什么。我必须再看一次日志文件。Thx用于快速响应。我得晚点再看,因为我又要跑去赶火车了!!anubhavaSure如果您需要进一步的帮助,请告诉我。OP只想选择带有
位置的块
,您将为每个块打印条目block@Kent哦,是的,你说得对,谢谢。我会让他在你和阿努巴瓦的答案之间做出选择。嗨,马克。我试过你的一句台词,效果很好。不知道它是如何工作的,但它是工作的。谢谢你。我真的必须了解这个职位的工作原理。另外,当我对原始日志文件运行它时,它生成了额外的数据列。。但是那很好。/嗨,肯特。谢谢你的回复。对不起,我没能绕过这个帖子。我尝试了你的代码,但它没有任何作用。它不产生错误,也不产生任何输出?
awk -v RS="" -F'[:\n ]*' '/^USER/{u=$2}
 /POSI/{p=/^USER/?$4:$3
 for(i=1;i<=NF;i++)
     if($i=="CLIENT"){sub(/\..*/,"",$(i+1))
                      print u,p,$(i+1),$NF;break}}' file
martha 170.198.82.13 jcrm19 91
othello 170.198.80.212 jcrm15 256
othello 170.198.80.209 jcrm14 256
darwin 170.198.19.102 jcrm16 91