ubuntuusers.de

In einem IF Strings vergleichen?

Status: Gelöst | Ubuntu-Version: Ubuntu 16.10 (Yakkety Yak)
Antworten |

Timkle

Anmeldungsdatum:
15. Januar 2017

Beiträge: 2

Hey Leute, ich schreibe gerade ein Script indem folgendes vorkommt

1
2
3
4
5
#!/bin/bash

if cut -d: -f3 ./testfile.txt | sed -n 1p = "Test"; then
echo "Ist ok"
fi

Damit möchte ich die dritte spalte von der erste Zeile aus einem file mit dem String vergleichen, Leider funktioniert das nicht

Danke für die Hilfe

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo und willkommen!

Track hat immer tolle Links zu Bash/Shell-Programmierung. Bis dahin kannst du mit Shell/Bash-Skripting-Guide für Anfänger loslegen ☺

Dort ist auf jeden Fall der Unterschied zwischen Zuweisungen und Vergleichen erklärt.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11243

Wohnort: München

Wenn du Werte vergleichen (also testen) willst, kannst du dir auch mal das Kapitel ansehen.

Du willst ja eigentlich zwei Strings vergleichen, wobei einer der Strings das Resultat einer Reihe von Befehlen ist - also willst du erst die Befehle ausführen (vgl. Command Substitution) und dann das Resultat mit dem String vergleichen - das ginge z.B. so (es dürfte efffizienter sein, wenn man die Reihenfolge der Befehle umdreht, also sich erst die gewünschte Zeile holt und danach das gewünschte Feld heraussucht):

1
2
3
if [ "$(sed -n 1p ./testfile.txt | cut -d: -f3)" = "TEST" ]; then
  echo "Ist ok"
fi

Alternativ könnte man z.B. auch awk nutzen - der folgende Befehl liest die Zeile 1, zerlegt sie an den Doppelpunkten und vergleicht das dritte Feld mit dem String "TEST", wenn das Zutrifft, gibt er "Ist ok" aus:

1
awk -F ":" 'NR == 1 {if ($3 == "TEST") {print "Ist ok"}; exit}' testfile.txt

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17599

Wohnort: Berlin

Timkle schrieb:

Hey Leute, ich schreibe gerade ein Script indem folgendes vorkommt

1
2
3
4
5
#!/bin/bash

if cut -d: -f3 ./testfile.txt | sed -n 1p = "Test"; then
echo "Ist ok"
fi

Um nahe bei Deinem Code zu bleiben:

1
test $(cut -d: -f3 ./testfile.txt | sed -n 1p) = "Fest" && echo "Ist ok"

Test statt if, $(...) um die Ausgabe des Befehls zu vergleichen, && als positiver Ast des Tests.

Allerdings liefert beides für eine Datei, in der in Zeile 1 nur Test steht, kein anderes Feld, keine Doppelpunkte, auch "Ist ok". Wieso das so ist habe ich nicht untersucht - muss ein cut-Ding sein.

Kürzer ist es nur sed zu verwenden:

1
sed -rn "1 s/^([^:]*:){2}Test:.*/Ist ok/p" testfile.txt

aber seahawk1986s AWK-Lösung ist wohl besser verständlich und macht das gleiche..

Timkle

(Themenstarter)

Anmeldungsdatum:
15. Januar 2017

Beiträge: 2

Danke Leute, habt mir sehr geholfen. Habe eine ähnliche Lösung wie die erste von user_unknown verwendet(nur ein bisschen für mich angepasst).

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13166

Noch eine Anmerkung: es ist i.d.R. effizienter, erst die erste Zeile auszufiltern und dann das Feld zu extrahieren. Wenn Deine Datei groß ist, wird ansonsten unnötig oft die Feldextraktion gemacht. Also besser ist dann:

1
2
3
if [ "$(head -1 testfile.txt | cut -d: -f3)" = "TEST" ]; then
  echo Jau
fi

Man kann das noch etwas anders machen:

1
2
3
if head -1 testfile.txt | cut -d: -f3 | fgrep -qx 'TEST'; then
  echo Jau
fi

Man wertet dabei direkt den Rückgabewert von fgrep aus.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi Timke,

zuerst mal herzlich willkommen hier auf dem Forum !

Wenn wir sowieso schon mal bei awk, sind (weil das so schön nach "Worten" trennen kann), dann können wir das Vergleichen auch gleich dorthin auslagern:

1
2
3
if awk -F: '{if($3 == "Test") exit 0; exit 1}' testfile.txt ; then
    echo ok
fi

Der Punkt ist dabei der:

  • Weil if sowieso nur den Rückgabewert (= "ERRORLEVEL" bei Win/DOS) auswertet, ist es ja egal, wer den Vergleich in diesen Wert umwandelt.
    Das muss nicht test (= [ .... ] ) sein, sondern egal wer. Also geht auch genau so gut awk .

Nebenbemerkung: damit awk nur die 1. Zeile auswertet, beende ich es danach einfach ausdrücklich. Damit ist das Thema auch erledigt. Und drucken habe ich einfach weggelassen.

Man muss eben nur wissen, dass if nach dem Rückgabewert fraget, und da kam bei Deinem 1. Versuch halt nix.

LG,

track


p.s.: wem das noch zu lang ist, der kann im awk den logischen Vergleichswert auch direkt zurückgeben lassen:

1
2
3
if awk -F: '{exit $3 != "Test"}' testfile.txt; then
    echo ok
fi
Antworten |