CSVファイルのシリアル番号のみを表示するGrep正規表現(定義された長さには文字と数字が含まれています)

CSVファイルのシリアル番号のみを表示するGrep正規表現(定義された長さには文字と数字が含まれています)

私は(Cisco)シリアル番号を含む(巨大で混乱している)CSVファイルをたくさん持っています。

私の目標はそれを抽出することです(btw:後でCisco APIを呼び出してサービス/サポート範囲のフィードバックを取得します)。

これで、このCSVファイルを処理する正しい方法を探しています。

他の方法があるのか​​、そして[:alpha:]と[:digit:]の組み合わせを含む名前付きクラスを使用する最初の「移動」方法が機能しないのはなぜですか?

シリアル番号を解読するための設定方法は次のとおりです。

Cisco S / N形式はLLLYYWWXXXXです。

LLL =位置コード(例:FOC = Foxconn China)

YY = 年コード (08 = 2004...09=2005...etc...)

WW =メインコード(注01〜52)

XXXX = Base-34英数字の一意の識別子(0〜9およびIとOを除く完全なアルファベットを含む)

源泉:https://community.spiceworks.com/how_to/96973-cisco-device-serial-number-explanation

# Doesn't Work

grep -E -o -w "[[:alnum:]]{11}" Inventory.csv | head
Description
UNIVERSALK9
techsupport
FCW203.....
UNIVERSALK9
techsupport
FCW203.....
UNIVERSALK9
techsupport
FDO201.....
[..]

# Does work

grep -o -w -P '([A-Z]){3}[0-9]{4}[[:alnum:]]{4}' Inventory.csv
FCW1234A1EF
FCW1234A1NG
FDO1234A1KB
FDO1234A103
FOC1234A137
FCW1234A10A
FOC1234A1GH
FOC1234A1GU
[..]

ベストアンサー1

正規表現のように、元のgrepは「緩すぎました」と言いました。[[:alnum:]]{11}シスコではなくシリアル番号の用語を許可する11の「英数字」を意味するように求められました。

  • 技術サポート
  • 説明する
  • ユニバーサルソルク9

2番目のgrepは「より制限的」です。言い換えれば、一致する項目はより制限的です。まだではないすごいただし、シスコのシリアル番号には 2 つのオプションがあります。

  • [0-9]{4}0から9までの4桁の数字を許可します。これにより、0899またはなどの誤った「メイン」データが許可されます0900
  • [[:alnum:]]{4}I禁止された合計を許可する4つの英数字を許可しますO

2 番目の grep はすべてのシスコのシリアル番号をキャプチャします。もっと必要以上のものですが、間違ったシリアル番号を許可するように欺くこともできます。

私はおそらく強力なパターンマッチングと文字列操作を可能にするので、汚れたファイルにawkを使用します。次のawkスクリプトは、高レベルで2つのことを行います。

  1. 各入力行を繰り返しながら、シスコのシリアル番号である可能性がある項目を見つけます。
  2. これらの入力ラインで各潜在的な一致を探します。一致があるたびにシリアル番号が抽出され、追加のテストが実行されます(「メイン」値が有効であることを確認)。これらの値が何を期待しているのかを詳しく知っている場合は、ここで「年」テストを実行できます。より小さな場所のセットを表示したい場合は、場所コードにも同様に適用されます。

私がした唯一のことは、正規表現をBase-34部分とより密接に整列させるように調整することでした。

スクリプトは次のとおりです。

awk '
        BEGIN {
                recisco="[A-Z]{3}[0-9]{4}[0-9ABCDEFGHJKLMNPQRSTUVWXYZ]{4}"
        }
        $0 ~ recisco {
                while(match($0, recisco) > 0) {
                        week=substr($0, RSTART+5, 2);
                        if (week > 1 && week < 54) {
                                print "Found: "substr($0,RSTART,RLENGTH)
                        }
                        $0=substr($0, RSTART+RLENGTH);
                }
        }'

おすすめ記事