将输出文件拆分为不同的子文件

时间:2017-03-15 07:48:26

标签: linux shell split

我有一个输出文件,其数据为:

 -> Added to botcc.rules (2)

 alert tcp any any -> any any (msg:"testing rule 1";sid:1323;rev:1;)

 alert tcp any any -> any any (msg:"testing rule 2";sid:1323;rev:1;)

 -> Added to compromised.rules (1)

 alert tcp any any -> any any (msg:"testing rule for comp";sid:1323;rev:1;)

我需要shell脚本,它应该将上述输出拆分为不同的子文件,其名称为botcc.rulescompromised.rules具有各自的规则(数据以下)。

1 个答案:

答案 0 :(得分:0)

使用强大的awk语言的解决方案:
我们会在每次出现模式> Added to时将输入文件拆分为多个文件。但是包含该模式的行不应该在新文件中。

awk '/> Added to/{ x=$4;next }{ print > x }' inputfile

此命令包含2组花括号:
只有在遇到包含模式> Added to的行时,控件才会转到第一组括号。由于next命令,包含> Added to的行进入第一个花括号,然后由于next命令立即开始读取下一行。因此,> Added to行不会到达第二个花括号,因此> Added to不会出现在拆分文件中。
由于没有条件,所以每一行都会遇到第二组,因此总是如此。

x=$4 - x变量分配了第四个字段值$4(“”(空格)是默认的 awk 字段分隔符,因此,第4个字段将包含文件名,例如botcc.rules

botcc.rules内容的输出:

$ cat botcc.rules
alert tcp any any -> any any (msg:"testing rule 1";sid:1323;rev:1;)

alert tcp any any -> any any (msg:"testing rule 2";sid:1323;rev:1;)

compromised.rules内容的输出:

$ cat compromised.rules

alert tcp any any -> any any (msg:"testing rule for comp";sid:1323;rev:1;)