Logfile-Verwaltung mit Bash Script

Bash, Shell, PHP, Python, Perl, CGI
janv
Posts: 6
Joined: 2004-08-07 23:41

Logfile-Verwaltung mit Bash Script

Post by janv » 2004-09-25 15:38

Ich habe einen Server mit einem ganzen Haufen von domains (dynamic virtual hosts) die alle vom Apache in ein gemeinsames Log geschrieben werden. Aus diesem log generiert mit ein kleines Skript jeden Tag Logs für die jeweiligen Domains, die alle in einem Verzeichnis liegen
Ich möchte diese nun am Ende des Monats alle entsprechend umbenennen und evtl. noch weitere Dinge damit tun.

Jetzt bitte nicht erschlagen, ich suche schon seit einer Weile, habe für diese (eigentlich?) leichte Aufgabe noch nichts im Web gefunden: Ich möchte eine ls -l -A Ausgabe mittels Skript erstmal von dem total ... (erste Zeile) bereinigen und dann mit while read ... alle Infos in einzelne Variablen packen der rest ist dann ja kein Problem.

Jedoch scheitern meine Vesuche bisher daran, dass die CRLF Info immer verlorengeht, das heisst die ls-Ausgabe ist nicht mehr vernünftig zu parsen.

So habe ich das z.B. mal versucht:

Code: Select all

 echo $(ls -l -A $1) > dir.dat
          read p1 p2 < dir.dat
          echo $p1 
          echo $p2 
          echo "total raus"
          
          while read p1 p2 p3 p4 p5 p6 p7 p8 p9
          do
             echo $p9

          done < dir.dat
In dir.dat steht aber schon Kauderwelsch drin ... ansonsten müsste mit dem read p1 p2 eigentlich die total angabe plus folgender Zahl raus sein. Funktioniert aber auch nicht, da nach der zahl der CRLF fehlt, steht in p2 bereits der ganze Rest des Listings :(

Wäre sehr dankbar für Lösungsvorschläge...

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: Logfile-Verwaltung mit Bash Script

Post by captaincrunch » 2004-09-25 16:06

Könntest du bitte noch mal haargenau beschreiben, was genau du vorhast? Die Herangehenswesie sieht mir jedenfalls schon mal extrem schräg aus, daher weiß ich nicht, ob ich dich überhaupt richtig verstanden habe. Am besten lässt du Codeschnipsel erstmal komplett weg.
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

janv
Posts: 6
Joined: 2004-08-07 23:41

Re: Logfile-Verwaltung mit Bash Script

Post by janv » 2004-09-27 13:57

Ok, ich versuche es mal auf das wesentliche zu reduzieren:

Ich habe ein Verzeichnis mit vielen Dateien, die jeweils Logeinträge vom Apache enthalten.
Ich möchte jetzt in einem Bash-Skript alle diese Dateien in einer Schleife abarbeiten.
Später will ich dann auch evtl. die Einträge in den Dateien bearbeiten, aber der Einfachheit halber lasse ich das zunächst mal weg.

Was brauche ich dazu?

1. Verzeichnis auslesen, z.B. mit ls -l -A. Hat den Vorteil, das mir fast nur noch die Dateien angezeigt werden. Lediglich in der ersten Zeile der Ausgabe steht noch das "total", gefolgt von der Angabe von ich weiss nicht was. Also z.B. so:

total 21
-rw-r--r-- 1 root root 100 Sep 24 11:00 log1
-rw-r--r-- 1 root root 500 Sep 24 11:00 log2

2. Diese Ausgabe (genauer die einzelnen Dateinamen und die dazugehörigen Daten, z.B. Dateigrösse) möchte ich jetzt in eine Schleife meines Skriptes bekommen, dass die einzelnen Dateien verarbeiten soll - wie auch immer.

Soweit mein Ansatz, kann ja sein, dass er idiotisch ist. Anderen Vorschlägen bin ich natürlich nicht abgeneigt!

thorsten
Posts: 561
Joined: 2003-02-01 13:14
Location: Fuldatal

Re: Logfile-Verwaltung mit Bash Script

Post by thorsten » 2004-09-27 17:11

evtl. sowas?

Code: Select all

for i in * ; do stat -c "%b %n" $i; done
Das gibt dir die Dateigröße in bytes, gefolgt von einem Leerzeichen gefolgt vom Dateinamen aus.
Den ls Konstrukt vergiss bitte ganz schnell.

janv
Posts: 6
Joined: 2004-08-07 23:41

Re: Logfile-Verwaltung mit Bash Script

Post by janv » 2004-09-28 17:46

Herzlichen Dank für den Tipp. Mein Skript schaut nun im wesentlichen so aus (wobei $1 das betreffene Verzeichnis ist...):

Code: Select all

   dat=$1vhosts_logs.dat

   cd $1
   stat -c "%s %n" * >> $dat

   while read size name
   do
     echo "Bearbeite $name mit $size bytes."
     #datei verschieben und umbennen

     if [ $size -gt 1000000 ]; then
     	#packen...
     fi

   done < $dat;
   rm $dat
Leider habe ich es nicht erreichen können die Dateiliste einfach nur in eine Variable zu packen. Das resultierende ambiguous redirect der Variable wurde ich nicht los :(

Der Aufruf dafür war:

Code: Select all

dat=$(stat -c "%s %n" *)
Würde mich freuen, wenn da noch jemand eine Idee hätte. Ansonsten läuft es ja auch so...

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: Logfile-Verwaltung mit Bash Script

Post by captaincrunch » 2004-09-28 17:55

Code: Select all

dat=`stat -c "%s %n" *`
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

dehoeninger
Posts: 10
Joined: 2003-10-26 15:47

Re: Logfile-Verwaltung mit Bash Script

Post by dehoeninger » 2004-09-28 20:29

JanV wrote:Ich habe einen Server mit einem ganzen Haufen von domains (dynamic virtual hosts) die alle vom Apache in ein gemeinsames Log geschrieben werden. Aus diesem log generiert mit ein kleines Skript jeden Tag Logs für die jeweiligen Domains, die alle in einem Verzeichnis liegen
Ich möchte diese nun am Ende des Monats alle entsprechend umbenennen und evtl. noch weitere Dinge damit tun.
warum lässt du diese Arbeit nicht den Apache übernehmen, es ist kein Problem für ihn, die Logs pro VirtualHost getrennt zu schreiben.

janv
Posts: 6
Joined: 2004-08-07 23:41

Re: Logfile-Verwaltung mit Bash Script

Post by janv » 2004-09-29 17:29

dat=`stat -c "%s %n" *`
funktioniert zwar, insofern als die Daten in der Variable landen. Allerdings gehen die Zeileninfos (/r/n oder was auch immer) anscheinend verloren, d.h. es lässt sich nicht mehr so einfach parsen. Aber vielen Dank!
warum lässt du diese Arbeit nicht den Apache übernehmen, es ist kein Problem für ihn, die Logs pro VirtualHost getrennt zu schreiben.
Bei dynamic VirtualHosts schon. Leider kann man die dynamischen Parameter nämlich nicht für die Logfiles übernehmen, sondern nur die angesteuerte Adresse in das Log schreiben. D.h. z.B. nicht in den Namen des logs.
Mir ist zumindest keine Möglichkeit bekannt es anders zu machen - in der Apache Doku steht es auch so drin: http://httpd.apache.org/docs/vhosts/mass.html siehe Simple dynamic virtual hosts