从一个文件提取数据并保存到另一个文件

时间:2019-08-30 13:15:47

标签: regex awk sed text-parsing

我正在使用shell命令运行ansible playbook任务,以基于正则表达式匹配从文件中提取数据并将其保存到另一个文件中。

我尝试使用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"

cat 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

1 个答案:

答案 0 :(得分:1)

使用GNU awk将第三个参数匹配():

awk 'match($0,/(.*)(-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($0,/-m.comment.*"/) {
    print substr($0,RSTART,RLENGTH) " > foo"
    print substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH) " > bar"
}' file

只需将" > foo"更改为> "foo"并同上,以使bar真正写入新文件。

如果这不是您真正需要的,请编辑您的问题以阐明您的要求并提供更真实的代表性示例输入/输出。

哦,当你写的时候:

$NF == "-m.comment.*\""

-m.comment.*\"没什么问题,因为正则表达式本身是==告诉awk进行文字字符串比较,而不是正则表达式比较。

给出您的更新问题,只需将以上内容调整为:

awk 'match($0,/(.*)(-m.comment.*")(.*)/,a) {
    print a[2] " > foo"
    print a[1] a[3] " > bar"
    next
}
{ print $0 " > 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