1

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

#!/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...
你建议什么作为实现?


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

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

1 回答 1

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 命令置于后台或从另一个终端读取它们。

于 2013-10-23T15:55:59.633 回答