从一个文件中提取数据并保存到另一个文件
Extract data from one file and save to another
我是 运行 ansible playbook 任务,使用 shell 命令根据正则表达式匹配从文件中提取数据并将其保存到另一个文件。
我尝试使用 awk 和 sed,但无法使正则表达式正常工作。
awk '$NF == "-m.comment.*\""' iptable.txt" > file1.txt
sed 's/\/.*' iptable.txt > file2.txt
我需要保存从 -m comment
到双引号的任何内容。至 file1.txt,其余内容至 file2.txt。如果该行没有注释字段,那么它应该只保存到 file2.txt.
-P INPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m state --state NEW -m comment --comment "Echo Request" -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m comment --comment "tcp" -j ACCEPT
预期输出:
猫 file1.txt
-m comment --comment "Echo Request"
-m comment --comment "tcp"
猫file2.txt
-P INPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j ACCEPT
使用 GNU awk 匹配第三个参数():
awk 'match([=10=],/(.*)(-m.comment.*")(.*)/,a) {
print a[2] " > foo"
print a[1] a[3] " > bar"
}' file
-m comment --comment "Echo Request" > foo
-A INPUT -p icmp -m state --state NEW -j ACCEPT > bar
使用任何 awk:
awk 'match([=11=],/-m.comment.*"/) {
print substr([=11=],RSTART,RLENGTH) " > foo"
print substr([=11=],1,RSTART-1) substr([=11=],RSTART+RLENGTH) " > bar"
}' file
只需将 " > foo"
更改为 > "foo"
并同上 bar 即可真正写入新文件。
如果这不是您所需要的,请编辑您的问题以阐明您的要求并提供更具代表性的示例 input/output。
哦,当你写道:
$NF == "-m.comment.*\""
-m.comment.*\"
作为正则表达式本身没有任何问题,但是 ==
告诉 awk 进行文字字符串比较,而不是正则表达式比较。
鉴于您更新的问题,只需将以上内容调整为:
awk 'match([=13=],/(.*)(-m.comment.*")(.*)/,a) {
print a[2] " > foo"
print a[1] a[3] " > bar"
next
}
{ print [=13=] " > bar" }' file
-P INPUT ACCEPT > bar
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT > bar
-m comment --comment "Echo Request" > foo
-A INPUT -p icmp -m state --state NEW -j ACCEPT > bar
-m comment --comment "tcp" > foo
-A INPUT -p tcp -m state --state NEW -j ACCEPT > bar
我是 运行 ansible playbook 任务,使用 shell 命令根据正则表达式匹配从文件中提取数据并将其保存到另一个文件。
我尝试使用 awk 和 sed,但无法使正则表达式正常工作。
awk '$NF == "-m.comment.*\""' iptable.txt" > file1.txt
sed 's/\/.*' iptable.txt > file2.txt
我需要保存从 -m comment
到双引号的任何内容。至 file1.txt,其余内容至 file2.txt。如果该行没有注释字段,那么它应该只保存到 file2.txt.
-P INPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m state --state NEW -m comment --comment "Echo Request" -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m comment --comment "tcp" -j ACCEPT
预期输出: 猫 file1.txt
-m comment --comment "Echo Request"
-m comment --comment "tcp"
猫file2.txt
-P INPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p icmp -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j ACCEPT
使用 GNU awk 匹配第三个参数():
awk 'match([=10=],/(.*)(-m.comment.*")(.*)/,a) {
print a[2] " > foo"
print a[1] a[3] " > bar"
}' file
-m comment --comment "Echo Request" > foo
-A INPUT -p icmp -m state --state NEW -j ACCEPT > bar
使用任何 awk:
awk 'match([=11=],/-m.comment.*"/) {
print substr([=11=],RSTART,RLENGTH) " > foo"
print substr([=11=],1,RSTART-1) substr([=11=],RSTART+RLENGTH) " > bar"
}' file
只需将 " > foo"
更改为 > "foo"
并同上 bar 即可真正写入新文件。
如果这不是您所需要的,请编辑您的问题以阐明您的要求并提供更具代表性的示例 input/output。
哦,当你写道:
$NF == "-m.comment.*\""
-m.comment.*\"
作为正则表达式本身没有任何问题,但是 ==
告诉 awk 进行文字字符串比较,而不是正则表达式比较。
鉴于您更新的问题,只需将以上内容调整为:
awk 'match([=13=],/(.*)(-m.comment.*")(.*)/,a) {
print a[2] " > foo"
print a[1] a[3] " > bar"
next
}
{ print [=13=] " > bar" }' file
-P INPUT ACCEPT > bar
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT > bar
-m comment --comment "Echo Request" > foo
-A INPUT -p icmp -m state --state NEW -j ACCEPT > bar
-m comment --comment "tcp" > foo
-A INPUT -p tcp -m state --state NEW -j ACCEPT > bar