0

Linux と bash を使用しています。他のプログラムによって実行時に生成されたコンテキストを含むテキスト ファイルがあります。テキスト ファイルの長さ、行数、内容は随時変更されます。しかし、テキストには変更されていないパターンがいくつかあります.1つの典型的な例は

123098230984LD#2e3 123098230984LD#23234 XER_3424324_23424 33: 34: 35: ノード:9-72-1408 &82 &34 $1231313 *3435322 ポートへのリンク:323 3424242424LD#22424#3342

ここでは、「node:NUMBER-NUMBER-NUMBER」と「port:NUMBER」というパターンを抽出したいと思いますが、テキスト内で出現する場所も時々異なります。今、私は手動で情報を抽出します。情報を自動的に抽出する方法があるかどうか疑問に思っています。本当に難しいのは、ファイルが生成されるたびに内容が変わることです。

4

1 に答える 1

0

sed不要なビットを取り除くことにより、目的のフィールドを抽出するために使用できます。

pax> echo 'junk node:9-72-1408 more junk port:323 last junk'
     | sed -E 's/^.*(node:[0-9]+-[0-9]*-[0-9]*).*(port:[0-9]+).*$/\1 \2/'
node:9-72-1408 port:323

ビットは.*単にジャンクを表し、括弧は一致するテキストを「キャプチャ」するために使用されるため、置換(as\1および\2)で使用できます。


サイドバー:

お使いのバージョンが拡張正規表現をsedサポートしていない場合、GNUの特定のバージョンと同様に、をサポートしている可能性があります。-E-rsed

+それ以外の場合は、括弧と文字をエスケープする必要があります。

pax> echo 'junk node:9-72-1408 more junk port:323 last junk'
     | sed  's/^.*\(node:[0-9]\+-[0-9]\+-[0-9]\+\).*\(port:[0-9]\+\).*$/\1 \2/'
node:9-72-1408 port:323

GNU sedのソースコードには、次の小さなスニペットが含まれています。

/* Undocumented, for compatibility with BSD sed.  */
    case 'E':
    case 'r':

しかし、これは4.2で導入されたようです(つまり、4.2にはありますが、4.1シリーズの最後の4.1.5にはありません)。詳細はこちらをご覧ください。


また、変数に実際の値が必要な場合は、次のようなものを使用できます。

pax> inpstr='junk-here node:9-72-1408 more-junk port:323 last-junk'

pax> node=$(echo "$inpstr" | sed -E 's/^.*node:([0-9]+-[0-9]+-[0-9]+).*$/\1/')

pax> port=$(echo "$inpstr" | sed -E 's/^.*port:([0-9]+).*$/\1/')

pax> echo $inpstr
junk-here node:9-72-1408 more-junk port:323 last-junk

pax> echo $node
9-72-1408

pax> echo $port
323

(「より少ない」実装-rのためのエスケープの使用または追加に関する以前のコメントを考慮に入れて)。sed

于 2012-07-24T02:10:05.787 に答える