Этот скрипт 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 инструмент следующим образом:
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