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