根据输入文件内容创建多个命名管道(fifo)

时间:2013-10-23 14:10:29

标签: python perl shell awk mkfifo

脚本将一个日志文件拆分为一些较小的文件:

#!/bin/awk -f
/topic = / { topic = $NF }    
/ : / { print $3 >> topic "___" $1 }   # $1 is the field name

输入文件示例:

topic = foo
A   : 23
BB  : Text1
Zz  : 77

topic = bar
A   : 88
B   : 66

topic = foo
A   : 25
B   : 12
BB  : Text2

生成的输出文件名示例:

foo___A
foo___B
foo___BB
foo___Zz
bar___A
bar___B

但是现在,我想创建输出 fifo而不是常规文件

fifo(命名管道)应使用与当前常规文件相同的文件名。例如,可以使用工具编写shell脚本,如下所示:

mkfifo foo___A
mkfifo foo___B
mkfifo foo___BB
mkfifo foo___Zz
mkfifo bar___A
mkfifo bar___B    

常识:

  • 脚本不应该知道所有可能的主题和字段
  • 脚本不需要创建多次相同的fifo

如果不适用于此目的,我可以使用等其他任何语言。 ...

您会选择哪种编程语言来实现此脚本? shell / awk / perl / python / ruby​​ ...
您建议实施什么?


编辑:Kevin's answer是正确的。他的剧本还有另一种选择:

#!/usr/bin/awk -f

/topic = / { topic = $NF }    
/ : / { 
    file = topic "___" $1
    system("test ! -e "file" && mkfifo "file)
    print $3 > file
}

您仍然可以根据awk或任何其他编程语言提出您的想法;)

要测试您的脚本,您可以在另一个终端中运行以下shell命令:

while true; do find -name '*___*' -ls -exec head '{}' '+'& sleep 1; done

1 个答案:

答案 0 :(得分:3)

#!/usr/local/bin/awk -f 

/topic = / { topic = $NF }    
/ : / { 
    file = topic "___" $1
    system("mkfifo "file)
    print $3 > file
    close(file)
    system("rm "file)
}   

请记住,print将阻止,直到您从fifo读取为止,因此您需要对awk命令进行后台处理或从其他终端读取它们。