gpt4 book ai didi

linux - CSV 上的复杂 awk 循环

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:20 26 4
gpt4 key购买 nike

我有多个 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。

我用它来创建我需要从每个连续行的原始变量中减去的变量(取第一行,减去一个):

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

问题 #2:我需要在 Rule# 的每个实例上迭代此循环。 IE:每个规则“可以”有多个源/目标/服务,我需要能够将新对象与正确的规则链接起来。

还需要对 $1 进行错误检查,因为有一些字段/规则需要跳过,这些字段/规则以“禁用”或类似内容开头。这似乎可以解决问题:

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

总的来说,我希望最终输出看起来像下面这样:

(所有回显/awk 打印等):

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

具有多个源/目标/服务的那些将简单地添加额外的“创建源规则 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

最佳答案

Awk 可以做到这一点,但有点笨拙。您基本上将信息收集在一个大字符串中,然后在完成每个信息后将其打印出来。 (只记得也打印最后一个)

我省略了 if new rule # is found in $1: 位...因为我不完全理解它应该如何工作。如果您绝对需要在末尾显示“track”行...只需复制 $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

关于linux - CSV 上的复杂 awk 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15790315/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com