2

以下のようなトレース ファイルから特定の行を抽出しようとしています。

- 0.118224 0 7 ack 40 ------- 1 2.0 7.0 0 2
r 0.118436 1 2 tcp 40 ------- 2 7.1 2.1 0 1
+ 0.118436 1 2 ack 40 ------- 2 3.1 2.1 0 3
- 0.118436 1 2 ack 40 ------- 2 4.1 2.1 0 3
r 0.120256 0 7 ack 40 ------- 1 2.0 7.0 0 2

次の行を抽出したい:

r x.xxxxx 1 2 xxx xx ------- x numbers.x 2.x x x.

注:xは任意の値を意味しnumbers、3 ~ 7 の間である可能性があります。

ここに私の試みがあります-それは機能しません!!:

if {[regexp \r+ ([0-9.]+) 1 2.*-  ([3-7.]+) 2.*- ([0-9.]+) $line -> time]} 

なにか提案を??

4

2 に答える 2

0

別のアプローチは次のとおりです。比較に使用するフィールドを抽出します

while {[gets $f line] != -1} {
    lassign [split $line] a - b c - - - - d e - -
    if {
            $a eq "r"  && 
            $b == 1    && 
            $c == 2    && 
            3 <= floor($d) && floor($d) <= 7  && 
            floor($e) == 2
    } {
        puts $line
    }
}
于 2013-04-19T17:38:58.227 に答える
0

でエスケープする必要が.あり\ます。正規表現で「任意の文字」を意味します。

したがって、正規表現は次のようになります。

if {[regexp {r \d\.\d{5} 1 2 \d{3} \d{2} ------- \d [3-7]\.\d 2\.\d \d \d} $line -> time ]} {
   # ...
}

次に、必要な()部分の周りに配置する必要があります。

ところで:一致させたいものの説明に次の変換を使用しました:

set input {r x.xxxxx 1 2 xxx xx ------- x numbers.x 2.x x x}
set re [subst [regsub -all {x{2,}} $data {\\\\d{[string length \0]}}]]
set re [string map {. {\.} x {\d} numbers {[3-7]}} $re]
于 2013-04-19T16:39:56.107 に答える