awk a jiny program
Alexandr Malusek
malusek na hroch.ujf.cas.cz
Pondělí Únor 12 11:29:45 CET 2001
hampl na gncz.cz (pavel hampl) writes:
> > > nevi nekdo z vas, jestli je mozne v awk zavolat program a zaroven do
> > > nej posilat text i brat jeho vystup?
> >
> > Da se to udelat pres pojmenovane roury (named pipes), ale to neni
> > zadna specialni vlastnost AWK.
> >
>
> Pres pojmenovane roury umim odesilat vicenasobny vystup NEBO cist
> vicenasobny vstup (tedy vice radek), ale ne OBOJI najednou.
Za urcitych predpokladu lze pouzit napr. konstrukci
BEGIN {
system("rm -f fifo1 fifo2");
system("mkfifo fifo1 fifo2");
system("tr '[:lower:]' '[:upper:]' < fifo1 > fifo2 &");
print "hello world" > "fifo1";
close("fifo1");
getline < "fifo2";
print $0;
}
$ awk -f file.awk
HELLO WORLD
Problem je s blokovanim procesu - vystup prikazu print musi byt
dostatecne maly, aby se vesel do FIFO. Prenositelnejsi a bezpecnejsi
je pouziti docasneho souboru.
> command="jmeno prikazu s parametry"
> print cokoli | command | getline
Problem je nasledujici:
1. print zaplni rouru 1, system proces zablokuje.
2. command precte vstup, vygeneruje data, ktera zaplni rouru 2,
a system ho zablokuje
3. system odblokuje puvodni print, ten znovu zaplni rouru 1 a system
ho zablokuje
System ale uz neodblokuje command, protoze jeho vystupni roura 2 je
plna. Vysledkem jsou dva zablokovane procesy.
Zaver: Obousmerna komunikace se pouzit da, ale jen za urcitych
predpokladu. AWK pro to neni vhodny nastroj. Vhodnejsi je napr. perl,
jak uz bylo zmineno. Jistou podporu ma i Korn shell.
--
A. Malusek (malusek na ujf.cas.cz)
UJF AV CR
Další informace o konferenci Linux