繁体   English   中英

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

[英]Create several named pipes (fifo) depending on input file content

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

#!/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

如果不适合这个目的,我可以使用任何其他语言,如等......

您会选择哪种编程语言来实现此脚本? 外壳/ awk的/的Perl / Python的/红宝石...
您的实施建议是什么?


编辑: 凯文的答案是正确的。 他的剧本还有另一种选择:

#!/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
#!/usr/local/bin/awk -f 

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

请记住,在您从fifo读取之前, print将被阻止,因此您需要对awk命令进行后台处理或从另一个终端读取它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM