[Windows] Alternatief voor *nix tac commando?

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Apache logfiles lopen oplopend op datum. Met andere woorden: de meest recente entry staat onderaan het bestand. Momenteel heb ik een access.log bestand op mijn Win/Apache van 85MB (ongeveer 900.000 regels). Dagelijks wil ik alleen de laatste entries uitlezen. Maar PHP's filesystem functies lezen alleen vanaf de bovenkant van een bestand naar beneden. Dat betekent dat ik eerst 899.000 (voor deze operatie) nutteloze entries moet doorploeteren om bij de laatste 1000 te komen. Een oplossing vond ik op php.net/fgets: gebruik het linux commando "tac" om een tempfile in omgekeerde volgorde aan te leggen. Via google heb ik gezocht naar een alternatief voor tac binnen een windows omgeving, maar kon niets vinden. Weet iemand of er ueberhaupt zo'n alternatief bestaat?

Van about.com:
tac - concatenate and print files in reverse

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • Mayco
  • Registratie: Augustus 2002
  • Laatst online: 02-03 22:35
Hé, grappig, tac is cat omgekeerd, en dat is wat het doet, het cat bestanden omgekeerd...

  • MissingDog
  • Registratie: Augustus 2002
  • Niet online
Je zou met de filesize en het [url=http://nl3.php.net/manual/nl/function.fseek.php]fseek[/fseek] commando naar een offset in je file kunnen springen om het zoeken vanaf daar te starten. Je kunt dan de file als een soort tape voor/achteruit spoelen.

[ Voor 34% gewijzigd door MissingDog op 02-05-2006 19:04 ]


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Mayco - dank je voor je reaktie, maar verder natuurlijk een nutteloze opmerking :+

@MissingDog - heb ik ook al aan gedacht, ik moet de pointer krijgen bij de eerste entry met de datum van vandaag. En dat gaat niet zomaar. Denk nu na over een workaround...

Na alle DOS commando's doorzoeken (ben ik niet zo in thuis) vond ik sort. Dit commando kun je gebruiken om, je raadt het al, bestanden te sorteren en te exporteren naar een bestand. Maar het sorteert alleen op A-Z en 0-9. Er is geen optie om, zonder verdere sortering, alle regels om te draaien (laatste regel wordt eerste, etc..)

[ Voor 27% gewijzigd door Reveller op 02-05-2006 19:44 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • HunterPro
  • Registratie: Juni 2001
  • Niet online
tenzij je vooraf elke regel van regelnummer en een spatie voorziet, uiteraard :)

  • frogger3d
  • Registratie: Maart 2000
  • Laatst online: 25-02 17:55

frogger3d

Morbo demands more comments!

Je kan cygwin installeren met tac... ;)

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
HunterPro schreef op dinsdag 02 mei 2006 @ 19:44:
tenzij je vooraf elke regel van regelnummer en een spatie voorziet, uiteraard :)
Zoals gezegd, betreft het hier Apache logfiles die ik om moet keren. Die hebben geen regelnummers :)

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf


  • HunterPro
  • Registratie: Juni 2001
  • Niet online
Reveller schreef op dinsdag 02 mei 2006 @ 19:45:
[...]

Zoals gezegd, betreft het hier Apache logfiles die ik om moet keren. Die hebben geen regelnummers :)
dan zet je toch geautomatiseerd met een scripttaal als perl of php overal regelnummers voor, keer je em om met sort, en laat je daarna weer de regelnummers weghalen? :P (ik denk dan alles met je eigen tool doen, makkelijker gaat, magoed)

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Dank je! Ik heb net deze utils gedownload en geinstalleerd. Als ik via de command line het volgende uitvoer, werkt het perfect. access.log is een testbestandje van 8KB in de map test/ en wordt omgekeerd opgeslagen in access2.log:
code:
1
[Reveller] C:\Program Files\Apache\Apache2\htdocs\test$ tac access.log > access2.log

Als ik hetzelfde via php probeer, wordt access2.log wel aangemaakt, maar het bestandje is 0KB groot. Met andere woorden: de data uit access.log wordt niet overgeschreven naar access2.log:
PHP:
1
passthru("tac access.log > access2.log");

Ik heb hetzelfde commando uitgevoerd via de php functies exec() en system(), maar dit levert hetzelfde (lege) resultaat op. Kan iemand met deze informatie vertellen of en zo wat ik verkeerd doe?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Dat je OS Windows is in Windows Clients is niet zo gek - dat dan ook in je topic titel tussen blokhaken zetten is wel gek :P Vertel eens welke Windows versie? :)

Hou er overigens rekening mee dat die 'tac' ook gewoon alle regels gaat moeten doorlopen en dus ook gewoon heel die file doorploetert, los daar van denk ik / ben ik bang dat jouw "tac" commando gewoon de access.log niet kan lezen om wat voor reden dan ook en daarom die lege file creeert.

Heb je dat al gecontroleerd? :)

  • HunterPro
  • Registratie: Juni 2001
  • Niet online
waarom geen paden in je commando? dit is vrij smerig. En je weet niet wat waar en hoe gaat gebeuren. Heeft de user waaronder PHP draait wel schrijf-access? en lees-access? :) Wat doet een
PHP:
1
echo `cat logfile.log`;
?
Pagina: 1