Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

Stringübergabe...

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
Benutzeravatar
Navigato
Newbie
Newbie
Beiträge: 24
Registriert: 19. Dez 2004, 13:52
Wohnort: Stgt

Stringübergabe...

Beitrag von Navigato »

Hallo,

ich habe volgenden Code mit dem ich nicht klar komme (... ja wieder :( )

Der Inhalt von VAR ist z.B.: Nov 2 13:00:00 hat also Leerzeichen.

Code: Alles auswählen

set VAR = `cat $FILE.tmp | cut -b1-15`
set BEGIN_LINE = `grep -n $VAR $FILE | tail -1 | cut -d":" -f1`
echo $BEGIN_LINE
die Ausgabe ist folgende:

Code: Alles auswählen

set BEGIN_LINE = `grep -n "$VAR" $FILE | tail -1 | cut -d":" -f1`
grep -n Nov 2 13:00:16 NSSovm_error.log
tail -1
cut -d: -f1
echo
Was ist daran Falsch???

Gruß
Navi
Benutzeravatar
snaewe
Hacker
Hacker
Beiträge: 415
Registriert: 13. Dez 2004, 16:32
Wohnort: Zu Hause

Beitrag von snaewe »

Wie wär's mit

Code: Alles auswählen

set BEGIN_LINE = `grep -n "$VAR" $FILE | tail -1 | cut -d":" -f1`
(Jaja, wieder die " ...)


Stefan
Der Name Windows stammt ursprünglich aus dem Indianischen und
bedeutet: "Weißer Mann, der auf eine Sanduhr starrt."
Benutzeravatar
snaewe
Hacker
Hacker
Beiträge: 415
Registriert: 13. Dez 2004, 16:32
Wohnort: Zu Hause

Beitrag von snaewe »

Ach ja, bevor ich's vergesse (Hallo TeXpert):

Code: Alles auswählen

set VAR = `cut -b1-15 $FILE.tmp`
SCNR

Stefan
Der Name Windows stammt ursprünglich aus dem Indianischen und
bedeutet: "Weißer Mann, der auf eine Sanduhr starrt."
Benutzeravatar
Navigato
Newbie
Newbie
Beiträge: 24
Registriert: 19. Dez 2004, 13:52
Wohnort: Stgt

Beitrag von Navigato »

so ich habe jetzt den fehler gefunden der mir einen strich durch die rechnung macht.

in meinem File steht folgendes:

Code: Alles auswählen

Mar 14 13:00:00 ...
Mai  2 13:00:00 ...
nach der monatsangabe (ist immer 3stellig) sind 2 leerzeichen wenn die tagesangabe einstellig ist, sonst ist da nur ein leerzeichen.

ich lese in meine variable VAR zwar das datum mit zwei leerzeichen ein aber bei der ausgabe z.b. mit echo kürzt er ein leerzeichen weg. d.h. wenn ich mit der variablen weiter arbeite dann wird er dazu nichts finden da ein leerzeichen fehlt.

kann ich das irrgendwie umgehen oder abfangen??

MFG
Navi
Benutzeravatar
snaewe
Hacker
Hacker
Beiträge: 415
Registriert: 13. Dez 2004, 16:32
Wohnort: Zu Hause

Beitrag von snaewe »

Code: Alles auswählen

echo "$BEGIN_LINE"
??

Stefan
Der Name Windows stammt ursprünglich aus dem Indianischen und
bedeutet: "Weißer Mann, der auf eine Sanduhr starrt."
Benutzeravatar
Navigato
Newbie
Newbie
Beiträge: 24
Registriert: 19. Dez 2004, 13:52
Wohnort: Stgt

Beitrag von Navigato »

hallo Stefan,

das problem ist folgendes

Code: Alles auswählen

set VAR = `cut -b1-15 $FILE.tmp`
in diesem befehl schneide ich mir das datum raus aus einer datei das i $FILE.tmp noch so auschaut

Code: Alles auswählen

Nov  2 13:00:00
wenn ich anschließend ein

Code: Alles auswählen

echo $VAR
ausführe gibt er mir die gekürzte fassung zurück

Code: Alles auswählen

Nov 2 13:00:00
:wink:
das ist mein problemchen
Benutzeravatar
snaewe
Hacker
Hacker
Beiträge: 415
Registriert: 13. Dez 2004, 16:32
Wohnort: Zu Hause

Beitrag von snaewe »

Navigato hat geschrieben:wenn ich anschließend ein

Code: Alles auswählen

echo $VAR
ausführe gibt er mir die gekürzte fassung zurück

Code: Alles auswählen

Nov 2 13:00:00
Ja, weil VAR drei 'Teile' (Wörter) enthält und echo jedes Wort getrennt durch ein Leerzeichen ausgibt. Also:

Code: Alles auswählen

echo "$VAR"
Denn das übergibt genau ein Wort (welches Leerzeichen enthält) an echo. Du musst dir mal überlegen, wie in etwa echo implementiert ist (Falls Du C kannst):

Code: Alles auswählen

...
int main(int argc, char* argv[])
{
...
for(int i=1;i < argc; ++i)
   printf("%s ", argv[i]);
...
}
Beim Aufruf 'echo $VAR' ist argv[1] == "Nov", argv[2] == "2" argv[3] == "13:00:00" - alles ohne Leerzeichen
Beim Aufruf 'echo "$VAR"' ist argv[1] = "Nav 2 13:00:00" und sonst nix.

EDIT: Wenn du einen C-Compiler installiert hast einfach gcc cmdline.c -o cmdline und z.B. ./cmdline `date` und ./cmdline "`date`"

Code: Alles auswählen

#include <stdio.h>

int main(int argc, char* argv[])
{       size_t i=0;
        for(i=0; i<argc; ++i)
                printf("%d: %s\n", i, argv[i]);
        return 0;
}
Klaro?

Stefan
Zuletzt geändert von snaewe am 1. Apr 2005, 13:06, insgesamt 1-mal geändert.
Der Name Windows stammt ursprünglich aus dem Indianischen und
bedeutet: "Weißer Mann, der auf eine Sanduhr starrt."
Benutzeravatar
TeXpert
Guru
Guru
Beiträge: 2166
Registriert: 17. Jan 2005, 11:22

Beitrag von TeXpert »

snaewe hat geschrieben:Ach ja, bevor ich's vergesse (Hallo TeXpert):

Code: Alles auswählen

set VAR = `cut -b1-15 $FILE.tmp`
ROTFLABTC :)

Code: Alles auswählen

# to resolve all your problems, try this:
HOWTO='pack c5,41*2,sqrt 7056,unpack(c,H)-2,oct 115' && perl -le "print $HOWTO"
Ich beantworte keine Supportfragen per PM!
Benutzeravatar
Navigato
Newbie
Newbie
Beiträge: 24
Registriert: 19. Dez 2004, 13:52
Wohnort: Stgt

Beitrag von Navigato »

das ist mir schon klar soweit. darin liegt nicht die schwirigkeit. das problem ist ich brauche zwingend die eine zusätzliche leerstelle

was ich mit dem string eigentlich bezwecke ist folgendes ich muss überprüfen ob der string in einer datei vorhanden ist. und da stehen nun die einstelligen tagesangaben mit einem leerzeichen davor. sonst findet grep sie nicht

P.S. bist du lehrer?? gute erklärung!!
Benutzeravatar
snaewe
Hacker
Hacker
Beiträge: 415
Registriert: 13. Dez 2004, 16:32
Wohnort: Zu Hause

Beitrag von snaewe »

VAR enthält doch den vollständigen String (mit Leerzeichen). Lediglich
der Aufruf von echo bewirkt, dass der String an den Leerzeichen aufgebrochen und dann als einzelne Parameter an echo übergeben wird (was man ja mit echo "$VAR" umgehen kann). Du brauchst also nix weiter. Wenn du VAR mitsamt aller Leerzeichen mit grep oder wem auch immer weiterverarbeiten willst, dann übergib es einfach als "$VAR".
Oder reden wir aneinander vorbei ?

Stefan

P.S. Nix Lehrer...
Der Name Windows stammt ursprünglich aus dem Indianischen und
bedeutet: "Weißer Mann, der auf eine Sanduhr starrt."
Antworten