Shell-Script Differenz 2er Strings ausgeben?

Hallo community,

als Beispiel String 1:

1
2
3

String 2:

1
2
3
4

ausgegeben werden, soll nur die Differenz, also „4“.

Man könnte die Strings zwar temporär in 2 Dateien speichern, wieder einlesen und mittels diff sich die Differenz anzeigen lassen. Jedoch würde ich gern das einfacher lösen. Gibt es eine Möglichkeit in Shell-script??

Gruß XXD

Howdy X***,

wie kommt man eigentlich auf so einen Nick?

Definier mal genauer, was du eigentlich haben willst!

Entweder willst du einen Stringvergleich „123“ vs. „1234“;
dann erklaere bitte auch, wie der Vergleich deiner Meinung nach
aussehen soll.

Oder willst du Files vergleichen, die irgendwelche Strings enthalten (also Zeilen) und diese analog zu diff vergleichen? Willst du vielleicht die Zeilen auch noch vorher in eine sortierte Order bringen?

Oder enthalten deine Strings NewLine Chars?

Ein bisschen mehr infos brauchen wir hier schon.

Gruss
norsemanna

Hallo norsemanna,

wie kommt man eigentlich auf so einen Nick?

aus meiner Lieblingsserie / Bücher -> Das Lied von Eis und Feuer (Game of Thrones)

Definier mal genauer, was du eigentlich haben willst!

Entweder willst du einen Stringvergleich „123“ vs. „1234“;
dann erklaere bitte auch, wie der Vergleich deiner Meinung
nach
aussehen soll.

function get\_modules(){
 lsmod | awk '{print $1}'

}

function main(){
 OLDP="$(get\_ports)"
 OLDM="$(get\_modules)"
 while sleep 10
 do
 NEWP="$(get\_ports)"
 NEWM="$(get\_modules)"
 if test "$OLDP" != "$NEWP"; then
 notify-send --urgency=critical -t 50000 Achtung "Neuer Port endeckt $NEWP"
 OLDP="$NEWP"
 fi
 if test "$OLDM" != "$NEWM"; then
 notify-send --urgency=critical -t 50000 Achtung "Neues Modul wurde geladen $NEWM"
 OLDM="$NEWM"
 fi
 done

}

Die Variable $NEWM soll jetzt nur die Differenz enthalten und nicht die komplette „lsmod“ Ausgabe.

Gruß XXD

Hallo XhoanXoroDaxos,

Definier mal genauer, was du eigentlich haben willst!

Das würde ich auch gern wissen…

Die Variable $NEWM soll jetzt nur die Differenz enthalten und
nicht die komplette „lsmod“ Ausgabe.

Das was Du da machst, sieht sehr um die Ecke gedacht aus. Und ehrlich gesagt, unter „genauer erklären“ hätte ich mir was anderes vorgestellt.
Du willst melden, wenn ein neues Modul geladen wurde, sehe ich das richtig?
So als wahrscheinlich dirty Ansatz würde ich sagen, leite die Ausgabe deiner get_modules jeweils in zwei Dateien, „alt“ und „neu“ und vergleiche beide Dateien jeweils mit diff.
Aber steckt da noch mehr dahinter, kannst Du das mal mit Worten erklären? Ich meine, ist das bloß eine Fingerübung für die bash, oder warum das Ganze? Vielleicht lässt sich alles viel einfacher lösen.

Viele Grüße
Marvin

Hallo Marvin,

Du willst melden, wenn ein neues Modul geladen wurde, sehe ich
das richtig?

Korrekt!

So als wahrscheinlich dirty Ansatz würde ich sagen, leite die
Ausgabe deiner get_modules jeweils in zwei Dateien, „alt“ und
„neu“ und vergleiche beide Dateien jeweils mit diff.

Das war mein erster Gedanke, dann dachte ich vielleicht geht das auch irgendwie mit Strings?

Aber steckt da noch mehr dahinter, kannst Du das mal mit
Worten erklären?

In der notify-send-Ausgabe sollte nur das neu geladene Modul erscheinen und nicht, wie momentan, die komplette lsmod-Ausgabe.

Ich meine, ist das bloß eine Fingerübung für
die bash?

Im Prinzip schon!

Vielleicht lässt sich alles viel einfacher lösen.

Gerne :wink:

Gruß XXD

Nur so als Anregung
Hallo XhoanXoroDaxos,

In der notify-send-Ausgabe sollte nur das neu geladene Modul
erscheinen und nicht, wie momentan, die komplette
lsmod-Ausgabe.

Nur so als Anregung:

kurz='alpha beta'
lang='alpha beta gamma'
neu=${lang#$kurz}
echo $neu
gamma

alpha, beta, gamma wären deine Module. Zuerst nur alpha und beta, dann wird gamma nachgeladen. Jetzt musst Du das nur noch in diese Form bekommen :wink:
Zum Nachlesen:
http://www.lansys.ch/shell/strings.htm
Vielleicht sind auch Arrays praktischer. Das überlasse ich jetzt aber dir, ich bin zu müde :wink:
http://tldp.org/LDP/abs/html/arrays.html

Viele Grüße
Marvin

Hi,

Man könnte die Strings zwar temporär in 2 Dateien speichern,
wieder einlesen und mittels diff sich die Differenz anzeigen
lassen. Jedoch würde ich gern das einfacher lösen. Gibt es
eine Möglichkeit in Shell-script??

Ich wuerde ja zsh nehmen, die kann sowas wie

diff =(echo "$old") =(echo "$alt")

Das macht zwar letzten Endes genau das, was Du vermeiden moechtes (zwei temporaere Dateien anlegen), sieht aber elegant aus und kuemmert sich aber um Details wie das Wegraeumen usw.

Mf
Gruss vom Frank.

Hallo Frank,

Ich wuerde ja zsh nehmen, die kann sowas wie

diff =(echo „$old“) =(echo „$alt“)

Interessant, werde ich die Tage mal testen!

Gruß XXD

Hallo Marvin,

dachte es gäbe ein Befehl, wie: echo $OLDM | tr -d $NEWM …oder so ähnlich.
Wenn aber Arrays ins Spiel kommen, würde ich dann lieber auf Python setzen, vor allem weil ich auch dort per python notify-Modul das ganze steuern kann und auch weit aus flexibler das ganze programmieren könnte.

Trotzdem vielen Dank, dass du dir die Zeit genommen hast.

Gruß XXD

Hallo XhoanXoroDaxos,

dachte es gäbe ein Befehl, wie: echo $OLDM | tr -d $NEWM

Das sind ja genau genommen zwei Befehle :wink: Irgendwas liesse sich auf diese Weise schon zusammenbasteln, hoffe ich mal. Es gibt immer mehrere Wege unter Linux.

…oder so ähnlich.

echo ${string1#$string2}

ist ja sowas „ähnliches“. Aber die Lösung von Frank mit der Z-Shell klingt doch sehr gut. In deinem Fall kommt es doch nur drauf an, daß es funktioniert, Performance-Probleme brauchen da wohl nicht berücksichtigt zu werden.

Wenn aber Arrays ins Spiel kommen, würde ich dann lieber auf
Python setzen

Warum nicht, ich hatte dich nur so verstanden, daß Du ausdrücklich nach einer Shell-Skript-Lösung gesucht hast.

Gibt es eine Möglichkeit in Shell-script??

Viele Grüße
Marvin

Hallo Marvin,

Warum nicht, ich hatte dich nur so verstanden, daß Du
ausdrücklich nach einer Shell-Skript-Lösung gesucht hast.

Gibt es eine Möglichkeit in Shell-script??

Stimmt schon, bloß meinte ich damit einen Einzeiler, wie „diff A B“, sobald es etwas aufwendiger wird, dieses in Shellscript zu machen, würde ich dann lieber Python vorziehen (auch da tut mir ein wenig Übung darin mal wieder gut :wink:.

Gruß XXD