Hi!
Bashben keresek fájlokra push - pop megoldást, szóval valami olyat, amivel be tudok szúrni egy sort egy fájl végére (na jó, ez még könnyű mondjuk
>>
jelekkel), és ki tudok olvasni (venni) egyet az elejéről.
Gugliztam, de nem nagyon találtam gyors megoldást, bár val. csak én nem láttam.
Köszi.
- 1271 megtekintés
Hozzászólások
head/tail/sed/perl/awk/grep/google
t
- A hozzászóláshoz be kell jelentkezni
hehe, ok. Eddig eljutottam, csak az a gondom, hogy ezekkel _én_ nem tudom kivenni az első sort.
- A hozzászóláshoz be kell jelentkezni
head -N /path/filename.etxtension
N: a sorok száma, amennyit ki akarsz venni:
head - elejéről
tail - végéről (ott értelemszerűen visszafelé számolódik utolsó N sor)
A grep kifejezést keres benne
PL:
tail -10 /var/log/messages | grep VGA (nem WGA, mert az szétoffolja a topic-ot ;~)) )
head -1 /var/log/syslog
------------------------
van még a tail parancsnak egy -f kapcsolója is:
tail -f /var/log/proftpd.log > /dev/lpt0
Ez követi a végét a file-nak ha az változik, csak a példám azért rossz, mert a log file-ok általában nyitva vannak, és így a fenti utasítás ami a stdout-ról a sornyomtatóra nyomná át a FTP szerver log-ját, az kb "befogalja" a nyomtatót,a nyomtató vár a file végére (EOF), és mivel ezt nem kapja meg ezért azt jelzi a rendszer felé, hogy nyomtat/foglalt.
Ilyenkor egy cron-ból percenként hívott bash script a megoldás, ami megnézi, hogy mi az utolsó néhány sor, illetve el kell tárolni az utolsó néhány sort, amit már kinyomtattunk, és ezzel összevetni az újabbakat, hogy ne kétszer legyen kinyomtatva. Mert ha csak az utolsó sort tolom ki percenként, akkor ami a két cron hívás közt volt, azt elveszettük.
Bocs hogy kicsit belemerültem.
/mazursky
- A hozzászóláshoz be kell jelentkezni
tail -n +2 file > file.tmp && mv file.tmp file
- A hozzászóláshoz be kell jelentkezni
sed -n 1p file ; sed -i 1d file
- A hozzászóláshoz be kell jelentkezni
hm, kicsit rosszul fogalmaztam a kérdést, bocsi.
Szóval olyan megoldásra lenne szükségem, ami úgy működik, mint egy verem, ez alatt azt értem, hogy gyorsan megvalósítható az első sor kiemelése - már ha létezik ilyen. Több író folyamat (push) lenne, és egy olvasó (pop) lenne.
Köszi.
- A hozzászóláshoz be kell jelentkezni
Ez a feladat nem bash-nek valo. Normalis megoldas: C, osztott memoria. Szerintem.
Ps. Tenyleg azt akarod kivenni amit legutoljara raktal be, nem pedig amit legregebben? Akkor mert az elso sorbol mert nem forditva, az utolsobol? Vagy ez egy diszk benchmark lesz :) ?
Szerk:
Elolvastam meg1x a szal elejet, ez sor es nem verem megha pushnak meg popnak hivod akkor is.
==
`Have some wine,' the March Hare said in an encouraging tone.
Alice looked all round the table, but there was nothing on it but tea.
- A hozzászóláshoz be kell jelentkezni
Tudom, hogy nem verem, csak hasonló kéne :- ). Igazából tök mindegy, hogy melyiket veszem ki, a közepéről is jó lenne, ha az a leggyorsabb :- ), de ami a fájl elején van, az a legrégebbi, nem? Vagy lehet, hogy elírtam, de úgy gondoltam, hogy a végére írok, az elejéből olvasok. A c- s megoldáson már gondolkoztam, de akkor már inkább perl tie típusú fájlkezelését használnám, csak sokkal jobb lenne, ha lenne valami kifejezetten bashes cucc. Val. nem lesz, szóval futottam egy kört fölöslegesen, de ez van.
- A hozzászóláshoz be kell jelentkezni
Az a baj, hogy a "kiveszi" (head, tail, sed ...) nem törli a fájlból, amit kiolvastál!
Esetleg környezeti változóban tárolhatja az olvasó, hogy melyik sort olvasta utoljára (az elejétől), és ezt a számlálót növelheti. Az írók meg mindig a fájl végére írnak (nem tudom versenyhelyzetben mit csinál a bash).
Ha lassul akkor esetleg néha újraírhatja a fájlt, hogy a kiolvasott sorok valóban törlődjenek.
Ha sebesség (és mindenképp bash) kell, akkor esetleg tmpfs (ramdisk) legyen a fájlrendszer, amiben ezek a fájlok mozognak!
- A hozzászóláshoz be kell jelentkezni
A sed már miért ne tudná kitörölni amit kivesz?
sed -n '$p;$d' fájl.
- A hozzászóláshoz be kell jelentkezni
Ez ugye az eredeti fájlban nem töröl semmit, csak a kimenetben nem látszik? Elég nagy baj lenne,ha ez az eredeti fájlban is törölne (konkrétan ellentmondana a "filter" - magyarul szűrőprogram - kvázi-definíciójának.)
- A hozzászóláshoz be kell jelentkezni
--in-place
- A hozzászóláshoz be kell jelentkezni
Szerepel a fenti parancsban bárhol? (Amúgy meg -i "" - pont mint perl esetén -, hogy én is mondjak totálisan semmivel-nem-kompatibilis megoldást az in-place szerkesztésre.)
- A hozzászóláshoz be kell jelentkezni
muszáj hogy egy file legyen?
- A hozzászóláshoz be kell jelentkezni
http://hup.hu/node/58329#comment-602807
Mintha mar leirtam volna a megoldast... write only vagy?
- A hozzászóláshoz be kell jelentkezni
man perl
- A hozzászóláshoz be kell jelentkezni