【问题标题】:How to grep for specific string in a file如何grep文件中的特定字符串
【发布时间】:2023-03-27 04:36:01
【问题描述】:

这是我的输入文件

<MessageOut>
<Attribute name="Session-Id" value="22250"/><Attribute name="CC-Request-Type" value="2"/><Attribute name="CC-Request-Number" value="1"/><Attribute name="Origin-Host" value="indlnqw291"/><Attribute name="Origin-Realm" value="amdocs.com"/><Attribute name="Auth-Application-Id" value="4"/><Attribute name="Result-Code" value="5031"/><Attribute name="CC-Session-Failover" value="1"/><Attribute name="Low-Balance-Indication" value="0"/><Attribute name="Multiple-Services-Credit-Control"><Group><Attribute name="Result-Code" value="5031"/><Attribute name="Service-Identifier" value="0"/><Attribute name="Rating-Group" value="2"/></Group></Attribute></MessageOut>
<MessageOut>
<Attribute name="Session-Id" value="22250"/><Attribute name="CC-Request-Type" value="3"/><Attribute name="CC-Request-Number" value="2"/><Attribute name="Origin-Host" value="indlnqw291"/><Attribute name="Origin-Realm" value="amdocs.com"/><Attribute name="Auth-Application-Id" value="4"/><Attribute name="Result-Code" value="5031"/></MessageOut>
<MessageOut>
<Attribute name="Session-Id" value="22250"/><Attribute name="CC-Request-Type" value="1"/><Attribute name="CC-Request-Number" value="0"/><Attribute name="Origin-Host" value="indlnqw291"/><Attribute name="Origin-Realm" value="amdocs.com"/><Attribute name="Auth-Application-Id" value="4"/><Attribute name="Result-Code" value="5031"/><Attribute name="CC-Session-Failover" value="1"/><Attribute name="Low-Balance-Indication" value="0"/><Attribute name="Multiple-Services-Credit-Control"><Group><Attribute name="Result-Code" value="5031"/><Attribute name="Service-Identifier" value="0"/><Attribute name="Rating-Group" value="2"/></Group></Attribute></MessageOut>

我想要“Multiple-Services-Credit-Control”之后的 grep 结果代码

预期结果:

"CC-Request-Type" value="1"
"CC-Request-Number" value="0"
"Result-Code" value="5031"

"CC-Request-Type" value="2"
"CC-Request-Number" value="1"
"Result-Code" value="5031"

"CC-Request-Type" value="3"
"CC-Request-Number" value="2"
"Result-Code" value="5031"

提前致谢

【问题讨论】:

  • 您用sedgrep 标记了这个,但是这些工具都不是为处理结构化标记而设计的,这对于标准的unix 过滤器来说通常过于复杂。虽然您的特定用例可能可行,但我可能只使用您最喜欢的语言中的 XML 解析库
  • 到目前为止你有没有尝试过?所以不是我拥有这个的地方,我期待这个并等待它发生'。请发布您尝试过的内容。
  • 我尝试使用下面的 cmd,如果我 grep 单一消息输出会话,它工作正常,但我不能用于 3 个会话 sed -n -e 's/^.*Multiple-Services-Credit-Control //p' xml.txt | sed -n -e 's/^.*Result-Code" value=//p' | cut -d'"' -f2
  • 为什么不创建一个Perl脚本并逐行读取数据?
  • 其实我不知道 perl ,请建议我哪一个是最适合这项工作的 perl、unix 或 xmllint

标签: perl xml-parsing grep text-processing


【解决方案1】:

这是XMLIt's a bad idea to try and use regular expressions on XML,因为 XML 是上下文相关的,而正则表达式不是。

使用 XML 解析器。大多数将让您执行xpath,这与正则表达式相当——但专门设计用于处理XML 的上下文性质。

perl 有多个选项。我特别喜欢XML::Twig。:

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig -> parsefile ( 'your_file.xml' );

my @attributes = qw ( CC-Request-Type CC-Request-Number Result-Code );

foreach my $msg ( $twig -> get_xpath('//MessageOut') ) {
    foreach my $attribute ( @attributes ) {
        print "$attribute value=",$msg -> get_xpath("//Attribute[\@name=\'$attribute\']",0)->att('value'),"\n"; 
    }
    print "\n";
}

使用您的示例数据(稍作修改以包含根标签):

CC-Request-Type value=2
CC-Request-Number value=1
Result-Code value=5031

CC-Request-Type value=2
CC-Request-Number value=1
Result-Code value=5031

CC-Request-Type value=2
CC-Request-Number value=1
Result-Code value=5031

【讨论】:

  • 好回答。我使用的是问题中的“线条模式”,但这在所有情况下都有效。
  • 是的。我没有投反对票,因为它确实解决了问题,但老实说,我相信正则表达式 XML 会造成未来的问题。
【解决方案2】:
use strict;
use warnings;

my $filename = 'path_to_input_file\data.txt';
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";

while (my $row = <$fh>) {
    chomp $row;
    $row =~ /.*?("CC-Request-Type"\svalue="\d*").*?("CC-Request-Number"\svalue="\d*").*?("Result-Code" value="\d*")/;
    if ( (defined $1) and (defined $2) and (defined $3)){
        print "\n$1\n$2\n$3\n";
    }
}

这是 Perl 中的解决方案。如果您需要解释所使用的正则表达式,我很乐意解释它。

【讨论】:

  • 是的,脚本将从输入文件中读取每一行。之后它将搜索模式。我使用组来捕获信息,你在括号内看到的,那些是分组。 ` $_ ` 将按照括号从左到右的顺序存储信息。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多