• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst]uniq Problem

motku

Newbie
Hallo


Folgendes Problem. In einem kleinen Script mache ich folgendes:

Code:
...
mounted_devs=$(cat /proc/mounts | grep sd[a-z] | tr -d [:digit:] | sort -r | awk '{print $1}')

echo "$mounted_devs"
echo
...

liefert nicht überraschend
Code:
/dev/sdb
/dev/sdb
/dev/sdb
/dev/sda
/dev/sda
/dev/sda

und das ist FAST das, was ich haben möchte. Die Dubletten müssen noch raus. Klarer Fall für uniq. Also
Code:
mounted_devs=$(cat /proc/mounts | grep sd[a-z] | tr -d [:digit:] | uniq | sort -r | awk '{print $1}')
liefert aber genau die selbe Ausgabe wie oben?!?

Solten die Dubletten vielleicht gar keine sein?
Code:
...
j=0
for i in $mounted_devs
  do
    tmp[$((j++))]=$i
  done

#nur ein Vergleich
if [ "${tmp[0]}" = "${tmp[1]}" ]; then
  echo "Gleich!"
else
  echo "Ungleich!"
fi
...

liefert nicht wirklich überraschend
Code:
/dev/sdb
/dev/sdb
/dev/sdb
/dev/sda
/dev/sda
/dev/sda

Gleich!

Was also übersehe ich? :-?

cu
motku
 

josef-wien

Ultimate Guru
Solnage Du nur die Ziffern eliminierst, gibt es keine gleichen Zeileninhalte. Derart lange Konstrukte solltest Du in einzelnen Schritten auf der Konsole testen, dann fällt das sofort auf.

P. S. cat wird wieder einmal völlig unnötig verwendet.
 
OP
M

motku

Newbie
Hallo

Kann es sein, das Du den Test auf Gleicheit
Code:
...
j=0
for i in $mounted_devs
  do
    tmp[$((j++))]=$i
  done

#nur ein Vergleich
if [ "${tmp[0]}" = "${tmp[1]}" ]; then
  echo "Gleich!"
else
  echo "Ungleich!"
fi
...
übersehen hast?
Der Vergleich zeigt doch, das z.B. tmp[0] und tmp[1] gleich sind. Und genau das verstehe ich eben nicht.

cu
motku
 

josef-wien

Ultimate Guru
Ich habe nichts übersehen, aber Du nimmst die Realität nicht zur Kenntnis. Wieso erwartest Du ein anderes Ergebnis, wenn Du von Deinen 6 Zeilen die erste und die zweite vergleichst?
 

abgdf

Guru
motku schrieb:
Code:
mounted_devs=$(cat /proc/mounts | grep sd[a-z] | tr -d [:digit:] | uniq | sort -r | awk '{print $1}')
Da kommen längere Zeilen auf das uniq, die offenbar nicht identisch sind, so daß uniq nichts herausfiltert. Erst awk reduziert sie auf "/dev/sda", "/dev/sdb". Dann ist es aber zu spät.
Daher:
ich schrieb:
uniq erst hinter dem awk.
Bitte mal prüfen.
 
OP
M

motku

Newbie
Hallo
Faxxon schrieb:
Sollte reichen:
Code:
mounted_devs=$(grep -o "^/dev/sd[a-z]" /proc/mounts | sort -u)
funktioniert.
uniq ganz ans Ende gesetzt übrigens auch.

Danke für die freundliche und kompetente Hilfe

cu
motku
 

Faxxon

Member
motku schrieb:
uniq ganz ans Ende gesetzt übrigens auch.
Da würde ich nicht meinen Hut drauf verwetten.

Code:
man uniq
...
Lösche alle hintereinanderstehenden identischen Zeilen
...

Code:
~> echo '/dev/sda
/dev/sdb
/dev/sda' | uniq
/dev/sda
/dev/sdb
/dev/sda
~>
Funktioniert also nicht, weil die beiden "/dev/sda" nicht hintereinander stehen.

Code:
~> echo '/dev/sda
/dev/sdb
/dev/sda' | sort -u
/dev/sda
/dev/sdb
~>
Hier funktioniert es.
 
Oben