[英]Create several named pipes (fifo) depending on input file content
这个awk脚本将一个日志文件拆分成一些较小的文件:
#!/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(命名管道)应使用与当前常规文件相同的文件名。 例如,可以使用mkfifo工具编写shell脚本,如下所示:
mkfifo foo___A
mkfifo foo___B
mkfifo foo___BB
mkfifo foo___Zz
mkfifo bar___A
mkfifo bar___B
常识:
如果awk不适合这个目的,我可以使用任何其他语言,如bash , zsh , perl , python等......
您会选择哪种编程语言来实现此脚本? 外壳/ 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.