egrepでワイルドカードの入ったOR検索


以下のファイルから、egrepでサーバ名を抜きだそうとしました。

[code]

    ===test.txt===
    tokyoAAsv01
    tokyoBBsv01
    tokyoCCsv01
    tokyoAAsv02
    tokyoBBsv02
    =====end====
    
    cat /tmp/test.txt | egrep '*sv01|*sv02'
    
[/code]

これは上手くいくのですが、

[code]

    cat /tmp/test.txt | egrep 'tokyo*sv01|tokyo*sv02'
    
[/code]

とやると失敗します。  
さらに test.txt から、AA,CCのつく行だけを抜き出したい場合、どのように書いたら良いでしょうか。

よろしくお願いします。

追記：  
すみません、最後の、AA、CCのつく行だけを〜のところなのですが、説明不足でした。

[code]

    ===test.txt===
    tokyoAAsv01
    tokyoBBsv01
    tokyoCCsv01
    tokyoAAsv02
    tokyoBBsv02
    osakaAAsv01
    osakaBBsv01
    osakaCCsv01
    =====end====
    
[/code]

のように、他の拠点のサーバも混ざっており、AA、BBのパターンも10以上あります。  
そこで、`tokyo` の `AA,CC,FF,HH` だけ、のような書き方をしたいのですが、  
その場合、OR条件を入れ子にすることは難しいのでしょうか？  
以下のようにやってみたのですが上手くいきませんでした。

[code]

    cat /tmp/test.txt | egrep 'tokyo|AA|CC|FF|HH|sv01|tokyo|AA|CC|FF|HH|sv02'
    
[/code]

後出しで申し訳ございません。




>
[code]

>     cat /tmp/test.txt | egrep 'tokyo*sv01|tokyo*sv02'
>  
[/code]

おそらく、`tokyo` の後に `sv01` または `sv02` が来る行を検索したいのだと思います。`*` は直前の正規表現 (単なる文字も含む)
の0回以上の繰り返しですから、`tokyo*sv01` は `tokysv01`, `tokyooooooosv01` などにはマッチしますが
`tokyoAAsv01` などにはマッチしません。

任意の文字列を表すには、`.` (任意の1文字) の後に `*` を置いて次のようにします。

[code]

     egrep 'tokyo.*sv01|tokyo.*sv02' /tmp/test.txt
    
[/code]

または

[code]

     egrep 'tokyo.*sv0[12]' /tmp/test.txt
    
[/code]

> さらに test.txt から、AA,CCのつく行だけを抜き出したい場合、どのように書いたら良いでしょうか。

つぎのように、`|` で繋げると、OR の意味になります。

[code]

    egrep 'AA|CC' /tmp/test.txt
    
[/code]

**追記**

> `tokyo` の `AA`, `CC`, `FF`, `HH` だけ、のような書き方をしたい

`(` ... `)` で括ることでグループ化することができます。

[code]

    egrep 'tokyo(AA|CC|FF|HH)sv0[12]' /tmp/test.txt
    
[/code]

