此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等其他任何语言。 ...
您会选择哪种编程语言来实现此脚本? 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
答案 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命令进行后台处理或从其他终端读取它们。