Cmd -> php

Hallo Experten,

ich habe ein kleines Problem: ich brauche ein Script, welches mir eine Zeile aus einer Textdatei liest und mir Teile der Zeile ausgibt. Ich habe das als Windows-Batch geschrieben. Blöderweise brauche ich an dieser Stelle aber unbedingt ein php-Skript. Zweites Problem: ich „spreche“ kein php… *rotwerd*

Vielleicht könnte ja mal jemand drübergucken, ob das in php auch nur ein Vierzeiler ist und mir die vier Zeilen drunterschreiben *hoff*:

Also:
In der Quelldatei stehen in jeder Zeile

Das Skript wird mit einer ip-Adresse als Parameter aufgerufen und soll diese Datei Zeile für Zeile lesen und die Werte der Zeile, in der mit dem Parameter übereinstimmt, in einer bestimmten Form ausgeben. Als CMD-Batch sieht das so aus:

 for /f "delims==" %%A in (C:\Programme\tst10\c2\_cpu\_liste.txt) do call :output %1 %%A %%B %%C %%D
 goto :eof
 :output
 if %1==%2 echo five\_sec:%3 one\_min:%4 five\_min:%5

Als Ausgabe kriegt man dann so etwas:

five\_sec:12 one\_min:18 five\_min:18

Vielen Dank schon mal!

Gruß
Stefan

Hallo,

ich habe ein kleines Problem: ich brauche ein Script, welches
mir eine Zeile aus einer Textdatei liest und mir Teile der
Zeile ausgibt. Ich habe das als Windows-Batch geschrieben.
Blöderweise brauche ich an dieser Stelle aber unbedingt ein
php-Skript. Zweites Problem: ich „spreche“ kein php…
*rotwerd*

Vielleicht könnte ja mal jemand drübergucken, ob das in php
auch nur ein Vierzeiler ist und mir die vier Zeilen
drunterschreiben *hoff*:

Also:
In der Quelldatei stehen in jeder Zeile

Das Skript wird mit einer ip-Adresse als Parameter aufgerufen
und soll diese Datei Zeile für Zeile lesen und die Werte der
Zeile, in der mit dem Parameter
übereinstimmt, in einer bestimmten Form ausgeben. Als
CMD-Batch sieht das so aus:

for /f „delims==“ %%A in
(C:\Programme\tst10\c2_cpu_liste.txt) do call :output %1 %%A
%%B %%C %%D
goto :eof
:output
if %1==%2 echo five_sec:%3 one_min:%4 five_min:%5

Als Ausgabe kriegt man dann so etwas:

five_sec:12 one_min:18 five_min:18

Vielen Dank schon mal!

Ich bin zwar kein echter PHP-Experte, aber das sollte zu machen sein. Nur werde ich aus deinen Angaben nicht ganz schlau.
Wo liegt die Textdatei, wie stellst du dir das mit der Parameterübergabe vor und wohin soll die Ausgabe?

Cu Rene

Hallo Rene,

Wo liegt die Textdatei, wie stellst du dir das mit der
Parameterübergabe vor und wohin soll die Ausgabe?

Dieses Script wird von einem anderen Programm aufgerufen. Als Übergabeparameter wird eine IP-Adresse mitgegeben. In der Textdatei (im Beispiel „C:\Programme\tst10\c2_cpu_liste.txt“) stehen jede Menge Werte und das Skript soll die Werte aus derjenigen Zeile zurückliefern, bei der die ip-adresse in der Datei mit dem Übergabeparameter übereinstimmt:

Beispiel:
Inhalt von c2_cpu_liste.txt sei:

a.b.c.d 1 2 3
b.c.d.e 2 3 4
c.d.e.f 3 4 5
d.e.f.g 10 100 20

Jetzt würde das steuernde Programm das php-Skript z.B. mit dem Parameter „c.d.e.f“ aufrufen und das Skript sollte zurückgeben

five\_sec:3 one\_min:4 five\_min:5

Die Ausgabe sollte wie in der CMD-Batch mit „echo“ erfolgen.

Hier habe ich mal ein php-Script kopiert, was vom selben Programm gesteuert wird (hat zwar einen völlig anderen Zweck, aber bekommt auch Parameter (sogar 3) und gibt einen Wert zurück):

<?php if($argv[1] != '' && $argv[2] != '' && $argv[3] != ''){<br /> $hip = $argv[1];
 $com = $argv[2];
 $sen = $argv[3];
 $max\_sensors = 12;
 if($sen \> $max\_sensors){
 echo "No Data from sensor ".($sen).". Number of sensors: ".$max\_sensors." ";
 }else{
 $data = snmpget($hip, $com, ".1.3.6.1.4.1.14848.2.1.2.1.5.".$sen);
 $data = $data/10;
 echo "data:".$data;
 }

}else{
 echo "Usage: \php\cli\php.exe \messpc.php "."\n";
 echo "Example: E:\php\cli\php.exe E:/inetpub/mrtgroot/cacti/scripts/messpc.php 192.168.13.250 pub 1";
 }
?\>

Gruß
Stefan

Ein Kollege hat es mir quick and dirty zusammengezimmert:

<?php $addr = $argv[1];<br /> $filename = "./c2\_cpu\_liste.txt";

 $vorhanden=file\_exists($filename);
 if($vorhanden) {
 $i = 0;
 $zeile = 0;
 $datei=fopen($filename,"r");
 if($datei) {
 $dateigroesse=filesize($filename);

 while($data=fgets($datei))
 {
 $zeile++;
 #echo $data."
";
 $daten = explode(' ',$data); 
 # var\_dump($daten); echo "
";
 if($daten[0] == $addr) {
 echo "5sec:".$daten[1]." 60sec:".$daten[2]." 300sec:".$daten[3];
 }
 }
 }


 fclose($datei);
 }
 else echo $filename . " not exists!
";
?\>

Trotzdem vielen Dank! :smile:

Gruß
Stefan

Hallo,

jetzt sehe ich erstmal ein, was du wolltest :wink:

Ein Kollege hat es mir quick and dirty zusammengezimmert:

<?php : $addr = $argv[1];
$filename = "./c2\_cpu\_liste.txt"; ... ?\>
<?php $fn = 'c2_cpu_liste.txt';
preg\_match\_all("/$argv[1]\s+(\S+)\s+(\S+)\s+(\S+)\n/", file\_get\_contents($fn), $ht, PREG\_SET\_ORDER); echo "5sec:".$ht[0][1]." 60sec:".$ht[0][2]." 300sec:".$ht[0][3]; ?\>Grüße CMБ
1 Like

Moin,

<?php : $fn = 'c2_cpu_liste.txt';
preg\_match\_all("/$argv[1]\s+(\S+)\s+(\S+)\s+(\S+)\n/", file\_get\_contents($fn), $ht, PREG\_SET\_ORDER); echo "5sec:".$ht[0][1]." 60sec:".$ht[0][2]." 300sec:".$ht[0][3]; ?\>

Uiiih! Schön kurz. Läuft allerdings nicht bei mir. Da kommt nur

5sec: 60sec: 300sec:

ohne Werte.

Trotzdem danke!

Hätte vielleicht sagen sollen, dass das Ding nicht vom Browser aufgerufen wird, sondern auf einer Windows-Kiste als Kommandozeile, also "php c2cpu_query.php ". Das scheint ein Unterschied zu sein, da ist mein Kollege auch zuerst reingefallen…

Und soweit ich gelesen habe, würde ein „preg_match“ auch reichen, da jede IP nur genau einmal in der Datei vorkommt. Spielt es eigentlich eine Rolle, dass in der Datei immer genau 2 Leerzeichen zwischen den Daten in einer Zeile sind?

Gruß
Stefan

Hallo

<?php ::?>

Uiiih! Schön kurz. Läuft allerdings nicht bei mir. Da kommt
nur

5sec: 60sec: 300sec:

ohne Werte.

Dann hast Du wahrscheinlich Textfiles im DOS-Format
mit „\r\n“ als Zeilenwechsel (dies wird im regulären
Ausdruck als Anker benutzt). Unter Unix ist das „\n“,
unter Mac „\r“.

Damit das mit allen Varianten geht, könnte man
den regulären Ausdruck $rg entsprechend ändern:<?php $fn = ‚c2_cpu_liste.txt‘;
$rg = „/$argv[1]\s+(\S+)\s+(\S+)\s+(\S+)[\r\n]+/“;
preg_match_all($rg, file_get_contents($fn), $ht, PREG_SET_ORDER);
echo „5sec:“.$ht[0][1]." 60sec:".$ht[0][2]." 300sec:".$ht[0][3];
?>Jetzt würde es in allen Fällen gehen.

Grüße

CMБ

1 Like

Moin,

Dann hast Du wahrscheinlich Textfiles im DOS-Format
mit „\r\n“ als Zeilenwechsel (dies wird im regulären
Ausdruck als Anker benutzt). Unter Unix ist das „\n“,
unter Mac „\r“.

Genau dieses. (Jesses, worauf man alles achten muss…)

Damit das mit allen Varianten geht, könnte man
den regulären Ausdruck $rg entsprechend
ändern:<?php : $fn = ‚c2_cpu_liste.txt‘;
$rg = „/$argv[1]\s+(\S+)\s+(\S+)\s+(\S+)[\r\n]+/“;
preg_match_all($rg, file_get_contents($fn), $ht,
PREG_SET_ORDER);
echo „5sec:“.$ht[0][1]." 60sec:".$ht[0][2]."
300sec:".$ht[0][3];
?>Jetzt würde es in allen Fällen gehen.

Tut es auch! Vielen Dank!

Gruß
Stefan