2016-08-22 39 views
-2

這是如何在一個文件中grep命令查找特定字符串

<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> 

我想「多服務信用控制」

預期的結果後,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" 

在此先感謝

+5

你用'sed'此標記和'grep',但無論這些工具旨在處理結構化標記,對於標準的unix過濾器來說,這通常太複雜。雖然你的具體用例*可能是可行的,但我可能只是使用你最喜歡的語言的XML解析庫 – gardenhead

+2

到目前爲止,你嘗試過什麼嗎? SO不是我擁有這個的地方,我期待這一點,並等待它發生。「請張貼你已經嘗試過的東西。 –

+0

我試着用下面的cmd它工作正常,如果我grep單張消息會話,但我不能用於3會話 sed -n -e's /^.*多服務 - 信用控制// p' xml.txt | sed -n -e's /^.*結果代碼「value = // p'| cut -d'」'-f2 – velu

回答

0
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中的解決方案。如果您需要使用reg-ex的解釋,我會很樂意將其解讀。

+0

你能告訴我它是如何工作的.. @John – velu

+0

是的,腳本將從輸入文件中讀取每一行。之後它將搜索該模式。我使用團體來獲取信息,你在看到的內容中看到的是那些分組。 '$ _'將按照從左到右的順序存儲信息。 –

2

這是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 
+0

不錯。我正在使用這個問題中的「線路模式」,但這是在所有情況下都可行的。 –

+0

是的。我沒有降低它的效率,因爲它確實解決了這個問題,但我確信相信XML的再生會造成未來的問題。 – Sobrique

相關問題