Создайте несколько именованных каналов (fifo) в зависимости от содержимого входного файла
Этот скрипт 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
здравый смысл:
- скрипт не должен знать обо всех возможных темах и полях
- скрипт не требует создания несколько раз одного и того же фифа
Если 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
или любой другой язык программирования;)
Чтобы проверить ваш скрипт, вы можете запустить следующую команду оболочки в другом терминале:
while true; do find -name '*___*' -ls -exec head '{}' '+'& sleep 1; done
1 ответ
#!/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 в фоновом режиме, либо прочитать ее с другого терминала