-2

我有一个包含以下信息的日志文件:

    <msisdn>37495989804</msisdn>
    <address>10.14.14.26</address>
    <msisdn>37495371855</msisdn>
    <address>10.14.0.172</address>
    <msisdn>37495989832</msisdn>
    <address>10.14.14.29</address>
    <msisdn>37495479810</msisdn>
    <address>10.14.1.11</address>
    <msisdn>37495429157</msisdn>
    <address>10.14.0.213</address>
    <msisdn>37495275824</msisdn>
    <msisdn>37495739176</msisdn>
    <address>10.14.2.86</address>
    <msisdn>37495479840</msisdn>
    <address>10.14.1.12</address>
    <msisdn>37495706059</msisdn>
    <msisdn>37495619889</msisdn>
    <address>10.14.1.198</address>
    <msisdn>37495574341</msisdn>
    <address>10.14.1.148</address>
    <msisdn>37495391624</msisdn>
    <address>10.14.0.188</address>
    <msisdn>37495989796</msisdn>
    <address>10.14.14.24</address>
    <msisdn>37495835940</msisdn>
    <address>10.14.2.164</address>
    <msisdn>37495743249</msisdn>
    <address>10.14.2.94</address>
    <msisdn>37495674117</msisdn>
    <address>10.14.1.236</address>
    <msisdn>37495754536</msisdn>
    <address>10.14.2.120</address>
    <msisdn>37495576434</msisdn>
    <msisdn>37495823889</msisdn>
    <address>10.14.2.159</address>

有些行的“msisdn”行后面没有“地址”行,如下所示:

<msisdn>37495576434</msisdn>
<msisdn>37495823889</msisdn>

我想编写一个脚本,它只输出不带“地址”的行(“msisdn”行)。预期输出:

<msisdn>37495275824</msisdn>
<msisdn>37495706059</msisdn>
<msisdn>37495576434</msisdn>

如果它可以与 awk/sed 配合使用,那将是完美的。谢谢。

4

4 回答 4

2

One way with awk:

awk '/address/{p=0}p{print a;p=0}/msisdn/{a=$0;p=1}' log
于 2013-07-04T06:38:35.793 回答
0

这可能对您有用(GNU sed):

sed -r '$!N;/(<msisdn>).*\n.*\1/P;D' file

这会将 2 行读入模式空间并尝试匹配<msisdn>这两行中的模式。如果模式匹配,它会打印出第一行。然后删除第一行并重新开始该过程,但是由于模式空间包含第二行(现在是第一行),因此放弃了对一行的自动读取,并且该过程从 开始$!N

于 2013-07-04T08:14:41.317 回答
0

您可以使用 pcregrep 匹配下一行不是地址并使用 awk 显示它

pcregrep -M '(.*</msisdn>)\n.*<msi' | awk 'NR % 2 == 1'
于 2013-07-04T06:33:33.943 回答
0

Perl 有它自己的方式来做到这一点:

perl -lne 'if($prev && $_!~/\./){print $prev}unless(/\./){$prev=$_}else{undef $prev}' your_file

测试如下:

> perl -lne 'if($prev && $_!~/\./){print $prev}unless(/\./){$prev=$_}else{undef $prev}' temp
<msisdn>37495275824</msisdn>
<msisdn>37495706059</msisdn>
<msisdn>37495576434</msisdn>
> 
于 2013-07-04T08:32:28.993 回答