0

コマンドを解析して作成する必要があるタイプのルールベースを持つ複数の CSV があり、複数の問題が発生しています。

始める前に、レイアウト方法と外観の例を次に示します。

$1 = Rule number
$3 = Source
$4 = Destination
$5 = Service
$6 = Action
$7 = Track
$10 = Comments

.

Security Policy: Blahblahblah,,,,,,,,,
12,,host_A,net-B,https,drop,Log,Any,Any,comments
13,,host_A,net-B,smtp,drop,Log,Any,Any,comments
14,,host_A,net-B,http,accept,Log,Any,Any,comments 
,,net-C,,,,,,,
,,net-D,,,,,,,
15,,host_A,net-B,http,accept,Log,Any,Any,comments
,,host_B,net-C,service_X,,,,,
,,host_C,net-D,service_y,,,,,
,,host_D,,,,,,,
,,host_E,,,,,,,

問題 #1: ループ内で列 1 (ルール番号) を調整する必要があります。正しい数に等しくなるように、そこから変数を減算する必要があります (シフトする必要があります)。たとえば、最初のルール #12 は、ループ内で #1 になる必要があります。

これを使用して、連続する行ごとに元の行から減算する必要がある変数を作成します (最初の行から 1 を減算します)。

`awk -F, 'NR==2 {print $1 -1 }'

問題 #2: Rule# のすべてのインスタンスに対してこのループを繰り返す必要があります。IE: 各ルールは複数のソース/宛先/サービスを持つことができ、新しいオブジェクトを正しいルールにリンクできる必要があります。

$1 のエラー チェックも実行する必要があります。これは、「disabled」などで始まるスキップする必要のあるフィールド/ルールがいくつかあるためです。これはトリックを行うようです:

awk -F, '$1 ~ "^[0-9]*$" {print $1}

全体として、最終的な出力は次のようになります。

(すべて echo'd/awk print'd など):

if new rule # is found in $1:
create rule security_rule
create action $rule_number $action
create comment $rule_number $comment
create source $rule_number $source <--- iterate as many times as required
create destination $rule_number $destination <--- iterate as many times as required
create service $rule_number $service <--- iterate as many times as required
create track $rule_number $track

等...

あなたができるどんな助け/提案もいただければ幸いです。

ありがとうございました、

編集: より良い例 (ルール 1 = CSV のルール 12 - これらはまだ大まかな印刷ステートメントであり、後で正しい印刷値を入力できます):

if new rule # is found in $1:
create rule security_rule
create action rule 1 drop
create comment rule 1 "This is a comment"
create source rule 1 host_A
create destination rule 1 net-B
create service rule 1 https
create track rule 1 Log

複数のソース/宛先/サービスを持つものは、次のように「create source rule x」行を追加するだけです:

if new rule # is found in $1:
create rule security_rule
create action rule 3 accept
create comment rule 3 "This is a comment"
create source rule 3 host_A
create source rule 3 net-C
create source rule 3 net-D
create destination rule 3 net-B
create service rule 3 http
create track rule 3 Log
4

2 に答える 2

1

awk はこれを行うことができますが、少し扱いに​​くいです。基本的に、情報を 1 つの大きな文字列に集めて、それぞれの処理が終わったら出力します。(最後のものも忘れずに印刷してください)

少し省略しましたif new rule # is found in $1:...それがどのように機能するのか完全には理解していないためです。「追跡」行を最後に表示する必要がある場合は、$3、$4、$5 の行を $7 に複製します。

BEGIN{
    FS=",";recNum=0;curLine=""
}

$1 ~ /^Security Policy/ {next}

$1!="" {
    print curLine,"\n"
    recNum++;
    $1=recNum;
    curLine=sprintf("create rule security_rule\ncreate action rule %d %s\n",$1,$6);
    curLine=curLine sprintf("create comment rule %d \"%s\"\n",$1,$10);
    curLine=curLine sprintf("create track rule %d %s\n",$1,$7);
}
$1=="" {
    $1=recNum;
}

$3!=""{
    curLine=curLine sprintf("create source rule %d %s\n",$1,$3);
}
$4!=""{
    curLine=curLine sprintf("create destination rule %d %s\n",$1,$4);
}
$5!=""{
    curLine=curLine sprintf("create service rule %d %s\n",$1,$5);
}
END {print curLine}

上記の入力については、次のようになります。

create rule security_rule
create action rule 1 drop
create comment rule 1 "comments"
create track rule 1 Log
create source rule 1 host_A
create destination rule 1 net-B
create service rule 1 https


create rule security_rule
create action rule 2 drop
create comment rule 2 "comments"
create track rule 2 Log
create source rule 2 host_A
create destination rule 2 net-B
create service rule 2 smtp


create rule security_rule
create action rule 3 accept
create comment rule 3 "comments"
create track rule 3 Log
create source rule 3 host_A
create destination rule 3 net-B
create service rule 3 http
create source rule 3 net-C
create source rule 3 net-D


create rule security_rule
create action rule 4 accept
create comment rule 4 "comments"
create track rule 4 Log
create source rule 4 host_A
create destination rule 4 net-B
create service rule 4 http
create source rule 4 host_B
create destination rule 4 net-C
create service rule 4 service_X
create source rule 4 host_C
create destination rule 4 net-D
create service rule 4 service_y
create source rule 4 host_D
create source rule 4 host_E
于 2013-04-03T16:38:03.860 に答える
0

質問については完全にはわかりませんが、@Charles Duffyが述べたように、ネイティブbashを使用しないのはなぜですか。サンプルファイルとその出力を提供できますか?質問から要件を分解しようとしましたが、迷子になりました. とにかく、以下は小さな例です。要件に合わせて変更を試みることができます。よりエレガントな awk を介して同じことを行うことができます (私は awk にあまり慣れていないのではないかと恐れています)。列 1 を強制的に配列インデックス、3 番目の値を「hello」に保持し、空の場合は古い値を保持します。

[bash]$ cat example;echo "##################################################"; ./tmp.sh < example ;echo "##################################################"; cat tmp.sh
12,,host_A,net-B,https,drop,Log,Any,Any,comments
13,,host_A,net-B,smtp,drop,Log,Any,Any,comments
14,,host_A,net-B,http,accept,Log,Any,Any,comments
,,net-C,,,,,,,
,,net-D,,,,,,,
15,,host_A,net-B,http,accept,Log,Any,Any,comments
,,host_B,net-C,service_X,,,,,
,,host_C,net-D,service_y,,,,,
,,host_D,,,,,,,
,,host_E,,,,,,,
##################################################
0 host_A hello https drop Log Any Any comments
1 host_A hello smtp drop Log Any Any comments
2 host_A hello http accept Log Any Any comments
3 net-C hello http accept Log Any Any comments
4 net-D hello http accept Log Any Any comments
5 host_A hello http accept Log Any Any comments
6 host_B hello service_X accept Log Any Any comments
7 host_C hello service_y accept Log Any Any comments
8 host_D hello service_y accept Log Any Any comments
9 host_E hello service_y accept Log Any Any comments
##################################################
#!/bin/bash
oldarr=();
oldarr[3]="hello"
index=0
while IFS=',' read -ra newarray
#do any rule which is iteration over data
do
  for (( i = 0; i < ${#newarray[@]}; i++))
  do
    if [ "${newarray[$i]}" ]
    then
#put any exceptional case
      if [ "$i" != "3" ]
      then
      oldarr[$i]=${newarray[$i]}
      fi
    fi
  done
#put anything which is independent of iteration
  oldarr[0]=$index
  ((index++))
  echo ${oldarr[*]}
done
于 2013-04-03T18:22:28.930 に答える