# Versionsnummer auslesen mit sed - Hilfe!!

## HymiR

Servus, allerseits.

Ich möchte mit sed folgendes machen:

ich möchte den Versionsstring des NEUESTEN INSTALLIERTEN (nicht den des aktuell LAUFENDEN, also uname -r) Kernels auslesen.

Ich dachte, anhand des Links /usr/src/linux könnte man diesen String auslesen,was natürlich nur funktioniert, wenn

das USE-Flag sys-kernel/gentoo-sources symlink   gesetzt ist (also nicht sonderlich verlässlich).

Ich habe es folgendermaßen versucht, wass aber nicht ganz hinhaut:

```
ls -n /usr/src/linux | sed -e 's/.*\(2\.[46]\.[1-9][1-9]\?-.*-r[1-9]\)/$NN=\1/'
```

Wo liegt da der Fehler???  :Sad: 

Was ich bezwecken will, ist das Einlesen des Versions-Strings im Format 2.6.19-gentoo-r6  in eine Variable.

Kann mir hier wer helfen, ich komm da einfach nicht weiter:(

Gibts vielleicht eine elegantere bzw vorallem verlässlichere Möglichkeit den Versions-String des Kernels auszulesen?

Und nochmals: ich möchte den Versionsstring des NEUESTEN INSTALLIERTEN Kernels auslesen.

Besten Dank im Voraus für konstruktive Hilfe:)

----------

## firefly

hmm bei mir funktioniert es:

```
-> ls -n /usr/src/linux

lrwxrwxrwx 1 0 0 24 17. Jan 15:34 /usr/src/linux -> linux-2.6.19-suspend2-r1
```

```
-> ls -n /usr/src/linux | sed -e 's/.*\(2\.[46]\.[1-9][1-9]\?-.*-r[1-9]\)/$NN=\1/'

$NN=2.6.19-suspend2-r1
```

----------

## smg

```
stephan@unimatrix ~ $ myvar=$(ls -n /usr/src/linux | sed 's/^.*linux-\(.*\)\//\1/')

stephan@unimatrix ~ $ echo $myvar

2.6.19-gentoo-r5
```

----------

## think4urs11

```
bla=$(ls -n /usr/src | cut -b43- | sed '$!d')
```

----------

## smg

 *Think4UrS11 wrote:*   

> 
> 
> ```
> bla=$(ls -n /usr/src | cut -b43- | sed '$!d')
> ```
> ...

 

falsch, so zeigst du nur die zeile an die ganz "unten" steht  :Smile:  außerdem cut'test du zu wenig zeichen dann hast du nen hässlichen output

-b47 wäre richtig, und dein sed macht eben nur die ausgabe des letzten records  :Smile:  und darauf liegt nicht immer der link

p.s.: meine lösung geht ohne probleme, s.o.

----------

## think4urs11

 *smg wrote:*   

>  *Think4UrS11 wrote:*   
> 
> ```
> bla=$(ls -n /usr/src | cut -b43- | sed '$!d')
> ```
> ...

 

Weil?

Der letzte installierte ist für mich der der als letztes via emerge gezogen wurde und wie der OP bereits sagte möchte er sich lieber nicht auf das USE-Flag verlassen.

----------

## smg

 *Think4UrS11 wrote:*   

>  *smg wrote:*    *Think4UrS11 wrote:*   
> 
> ```
> bla=$(ls -n /usr/src | cut -b43- | sed '$!d')
> ```
> ...

 

ups lol, ich habe das NICHT aufs useflag verlassen als auf das useflag verlassen gelesen. sorry.   :Rolling Eyes: 

p.s.: aber du solltest trotzdem -b47- machen nicht 43  :Smile: 

```
stephan@unimatrix ~ $ ls -n /usr/src | cut -b43- | sed '$!d'

nux-2.6.20-gentoo-r7

stephan@unimatrix ~ $ ls -n /usr/src | cut -b47- | sed '$!d'

2.6.20-gentoo-r7
```

----------

## firefly

 *smg wrote:*   

>  *Think4UrS11 wrote:*    *smg wrote:*    *Think4UrS11 wrote:*   
> 
> ```
> bla=$(ls -n /usr/src | cut -b43- | sed '$!d')
> ```
> ...

 

funktioniert nicht  :Wink: , wenn in /usr/src/ sich andere verzeichnisse befinden

```
 -> ls -n /usr/src | cut -b47- | sed '$!d' 

3_Linux_STA_Drv1.0.3.6
```

besser ist:

```
 ls -dn /usr/src/linux-* | cut -b48- | sed '$!d'

linux-2.6.19-suspend2-r3
```

----------

## think4urs11

@smg: bei mir klappt das ab Stelle 43

kommt evtl. auf die Darstellung von Datum/Uhrzeit an in der ls-Ausgabe?

@firefly: Wenn nichts anderes geschrieben ist gehe ich von einer Standardinstallation aus und da gibt es in /usr/src nix anderes  :Wink: 

----------

## smg

 *Think4UrS11 wrote:*   

> @smg: bei mir klappt das ab Stelle 43
> 
> kommt evtl. auf die Darstellung von Datum/Uhrzeit an in der ls-Ausgabe
> 
> 

 

kann sein  :Smile: 

 *Think4UrS11 wrote:*   

> 
> 
> @firefly: Wenn nichts anderes geschrieben ist gehe ich von einer Standardinstallation aus und da gibt es in /usr/src nix anderes 

 

me too   :Arrow:   ack  :Smile: 

----------

## firefly

Think4UrS11: ok, nur dann wundert er sich, das sein sktipt nicht mehr funktioniert, falls er doch mal in /usr/src zusäztliche verzeichnisse hat, die sortiert, nach den linux-* verzeichnissen in der ausgabe auftauchen.

so gehts auch:

```
ls /usr/src/ | grep linux-  | sed '$!d'
```

und dabei ist die Darstellung von Datum/Uhrzeit von ls egal  :Wink: 

----------

## smg

```
ls -ld /usr/src/linux* | awk -F "linux-" ' END { print $NF } '

```

das geht auch, datum / uhrzeit ebenfalls egal und eine pipe weniger

----------

## think4urs11

@firefly: *läster* klappt nicht mehr unbedingt wenn in/usr/src etwas wie linux-headers oder ähnliches existiert  :Wink: 

----------

## smg

 *Think4UrS11 wrote:*   

> @firefly: *läster* klappt nicht wenn in/usr/src etwas wie linux-headers existiert 

 

 :Very Happy:   :Very Happy:   :Very Happy: 

na ja jetzt haben wir ja genug lösungen *g*

----------

## firefly

 *Think4UrS11 wrote:*   

> @firefly: *läster* klappt nicht mehr unbedingt wenn in/usr/src etwas wie linux-headers oder ähnliches existiert 

 

aber nur, wenn das linux-headers verzeichniss sortiert nach den kernel-source verzeichnissen in der ausgabe auftaucht  :Wink: 

Das selbe gilt auch, wenn verschiedene *-sources typen installiert sind. z.b. gentoo-sources und suspend2-sources dann taucht in der ausgabe von der zeile die suspend2-sources auf.

Think4UrS11: dann wiedersprichst du deiner eigenen aussage, das du der meinung bist, das sich nur die linux-sourcen in /usr/src befinden  :Wink: 

----------

## l3u

```
version=`ls -gG --time-style + /usr/src/linux | awk '{print $6}'`

version=${version##*linux-}
```

?

----------

## smg

Auch gut Libby, aber dazu brauchst du die Bash / Sh explizit. Lieber Portabel mit sed oder awk.

----------

## smg

```
#!/bin/bash

# input your possible kernels

vals=(gentoo suspend2)

input=$(ls -ld /usr/src/linux-*)

i=1

echo "Latest Kernels: "

for x in ${vals[*]}; do

    echo -n "#" $i $x-sources "=> " && awk -F "linux-" '/'"$x"'/{print $NF}' <<< "$input" | sed '$!d' 

    i=$((i+1))

done && echo

```

----------

## 165177

```
emerge --search gentoo-sources | awk -F": " '/Latest version installed/ { print $2; exit }'  
```

----------

## smg

Das ist aber langsam mit emerge --search!

```

eix -s gentoo-sources | awk -v RS="" -v FS="\n" '{print substr( $(NF-2),index( $(NF-2) ,"(") +1, index( $(NF-2), ")") - index ($(NF-2), "(")-1 ) }'
```

P.S.: Merke grad, dass das doof ist, weil da der Output manchmal bogus ist, ich würde zu obiger Lösung tendieren oder eine andere von mir oder eine von Think4UrS11  :Smile: 

----------

## think4urs11

und damit es nicht langweilig wird noch eine Variante mit ganz anderem Ansatz

```
grep sys-kernel /var/log/emerge.log | sed -e '$!d;s/.*-\(2\..* \)to \//\1/'
```

----------

## smg

```
ls -l /var/db/pkg/sys-kernel/ | awk 'BEGIN { kernel="gentoo-sources"; FS=kernel"-" } $0 ~ kernel {print kernel "-" $NF}' | sed '$!d'
```

```
find /usr/src -maxdepth 1 -iname "*gentoo*" | sed 's/.*linux-//;$!d' 
```

----------

## think4urs11

einer geht noch...

wer sagt eigentlich das der letzte *installierte* Kernel identisch zum zuletzt emergten oder dem neuesten in /usr/src ist?

Der letzte installierte kann auch der neueste in /boot sein

sofern also name=version (und keine anderen Dateien dieses Suchmusters existieren)

```
ls -n /boot/2.* | sed -e '$!d' | cut -d/ -f3
```

----------

## HymiR

Allerbesten Dank für diese reichlichen Tipps und Vorschläge;)

Sorry, dass ich solange abwesend war.

Gruß, Hymir.

----------

