このawkスクリプトは、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
しかし今、通常の file の代わりに出力 fifoを作成したいと思います。
fifo (名前付きパイプ) は、現在の通常のファイルと同じファイル名を使用する必要があります。たとえば、次のようにmkfifoツールを使用してシェル スクリプトを作成できます。
mkfifo foo___A
mkfifo foo___B
mkfifo foo___BB
mkfifo foo___Zz
mkfifo bar___A
mkfifo bar___B
常識:
- スクリプトは、考えられるすべてのトピックとフィールドを認識する必要はありません
- スクリプトは、同じ fifo を何度も作成する必要はありません
awkがこの目的に適していない場合は、 bash、zsh、perl、pythonなどの他の言語を使用できます ...
このスクリプトを実装するには、どのプログラミング言語を選択しますか? 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
または他のプログラミング言語に基づいてアイデアを提案することもできます;)
スクリプトをテストするには、別のターミナルで以下のシェル コマンドを実行します。
while true; do find -name '*___*' -ls -exec head '{}' '+'& sleep 1; done