# Hilfe mit SED

## return13

Versuche gerade einen Stream mit sed zu bearbeiten.

Mich intressiert genau genommen der Inhalt zwischen <b> und </b>, wobei der Stream wie folgt aufgebaut ist:

```

^<tr.*\n.*<b>VARIABLES_ERGEBNISS</b>.*$

```

Mit sicherheit gibts ne elegante Lösung um an das Ergebnis zu gelangen, aber nach vielem Suchen hab ich nichts vernünftiges gefunden und wollte deshalb einfach die Zeichen vor dem <b> und nach dem </b> (jeweils inklusive dem Tag selbst) mit hilfe von sed löschen, aber sed will nicht so wie ich will.... - deshalb meine Frage ob die Zeile syntaktisch falsch ist:

```

sed -n -e 's/^<tr.*\n.*<b>//g'

```

----------

## smg

Eventuell sowas?

```
stephan@unimatrix ~ $ echo "<b>Der fette Text</b>" | sed 's#^<b>\(.*\)</b>$#\1#g' 

Der fette Text

```

HTH

----------

## return13

genau sowas suchte ich - danke

2 Fragen nur noch - warum muss ".*" in Klammern stehen?

und das "\1" ist damit der Inhalt ausgegeben wird?

----------

## smg

 *return13 wrote:*   

> genau sowas suchte ich - danke
> 
> 2 Fragen nur noch - warum muss ".*" in Klammern stehen?
> 
> und das "\1" ist damit der Inhalt ausgegeben wird?

 

() ist zum Gruppieren. und \1 holt sich die erste Gruppe, da das unsere erste Gruppierung mit (.*) ist, gibt er dir den Text zwischen den <b></b> aus.

----------

## return13

danke nach Darmstadt  :Wink: 

----------

## smg

 *return13 wrote:*   

> danke nach Darmstadt 

 

np nach köln!  :Smile: 

----------

## xraver

Da wir gerade beim Thema sind  :Wink: 

```
grep Byte test.html

<td width="409"><a href="http://traffic.primacom.net/cgi-bin/traffic.cgi?date=2006-10">6732.3 MByte</a></td></tr>

                <td width="409"><a href="http://traffic.primacom.net/cgi-bin/traffic.cgi?date=2006-09">14002.5 MByte</a></td></tr>

                <td width="409"><a href="http://traffic.primacom.net/cgi-bin/traffic.cgi?date=2006-08">36603.5 MByte</a></td></tr>

```

Was muss ich hier tun um nur die MB-Zahl auszulesen?

----------

## Necoro

spontan : 

```
sed -e 's#^.*<a.*>\(.*\)</a>.*$#\1#g'
```

  :Wink:  ... (das $ am ende kann man weglassen wenn man will ... wenn es drin ist, aber Hochkommata ' und nicht Anführungszeichen " verwenden  :Wink: )

nicht geprüft: wenn man das grep gleich noch mit einbauen will:

```
sed -e 's#^.*<a.*>\(\d+\.\d+ .Byte\)</a>.*$#\1#g
```

 (evtl muss man das + noch escapen - das kann ich nicht mit bestimmtheit sagen)

----------

## xraver

 *Necoro wrote:*   

> spontan : 
> 
> ```
> sed -e 's#^.*<a.*>\(.*\)</a>.*$#\1#g'
> ```
> ...

 

danke, funktioniert.

Da primacom neudings traffic-limit einsetzt ist es gut zu wissen wie viel man schon verbaucht hatt. Ab 50GB wird die Leitung gedrosselt. Werd mir gleich mal eine Superkaramba Theme zusammen bauen.

Ist eine "Flatrate" mit TrafficLimit überhaupt noch eine Flatrate?

----------

## smg

Nö, finde ich nicht, wechsel doch zu Telekom.  :Smile: 

 *Necoro wrote:*   

> spontan : 
> 
> ```
> sed -e 's#^.*<a.*>\(.*\)</a>.*$#\1#g'
> ```
> ...

 

Das ist okay, habs mal bissal gekürzt.

```
sed -e 's#.*>\(.*\)</a>.*#\1#g' test.datei
```

 *Necoro wrote:*   

> 
> 
> nicht geprüft: wenn man das grep gleich noch mit einbauen will:
> 
> ```
> ...

 

Das geht so nicht.  :Smile: 

Eventuell willst du alles zusammen rechnen?

```
sed -e 's#.*>\(.*\)</a>.*#\1#g' test.datei | awk ' BEGIN { sum = 0; count=0; } { printf "#%i: %.2f\n", count++, $1; sum+=$1} END { printf "Total amount: %.2f\n",sum}  '
```

Bye.

----------

## Necoro

 *smg wrote:*   

>  *Necoro wrote:*   
> 
> nicht geprüft: wenn man das grep gleich noch mit einbauen will:
> 
> ```
> ...

 

Ich dachte mir, dass das eigentlich genau das gleiche wie das obige ausgibt  :Smile:  ... nur das man halt nicht grep vorher laufen lassen muss  :Smile: 

----------

## smg

 *Necoro wrote:*   

>  *smg wrote:*    *Necoro wrote:*   
> 
> nicht geprüft: wenn man das grep gleich noch mit einbauen will:
> 
> ```
> ...

 

Achso!

Andere Variante, mit schönerem Output:

```
stephan@unimatrix ~ $ sed -e 's#.*date=\(.*\)">\(.*\)</a>.*#\2 \1#g' test.datei | awk -F " " ' BEGIN { sum = 0; count=0; } { printf "#%i: %.2f %s am %s\n", count++, $1, $2, $3; sum+=$1 } END { printf "Total amount: %.2f %s\n",sum, $2}  '

#0: 6732.30 MByte am 2006-10

#1: 14002.50 MByte am 2006-09

#2: 36603.50 MByte am 2006-08

Total amount: 57338.30 MByte
```

P.S.: Muss mal kurz weg, Mathematik unterrichten.  :Razz: 

----------

## xraver

Danke @all

Letzendlich ist für mich nur der aktuelle Verbrauch im Monat interessant. Das Limit wird/sollte in einem neuen Monat wieder auf 0 gestellt sein.

Schöner wäre eine Lösung die nur den Traffic vom aktuellen Monat anzeigt. (date sagt Monat / Monat wird wird grep rausgesucht / sed bereitet die daten auf)

----------

## smg

 *xraver wrote:*   

> Danke @all
> 
> Letzendlich ist für mich nur der aktuelle Verbrauch im Monat interessant. Das Limit wird/sollte in einem neuen Monat wieder auf 0 gestellt sein.
> 
> Schöner wäre eine Lösung die nur den Traffic vom aktuellen Monat anzeigt. (date sagt Monat / Monat wird wird grep rausgesucht / sed bereitet die daten auf)

 

Geht. Gib halt mal die original Datei her, damit lässt sich das machen.

Eventuell geht das:

```
grep $(date -I | cut -d "-" -f "1-2") test.datei | sed -e 's#.*date=\(.*\)">\(.*\)</a>.*#\2 \1#g' | awk -F " " ' BEGIN { sum = 0; count=0; } { printf "#%i: %.2f %s am %s\n", count++, $1, $2, $3; sum+=$1 } END { printf "Total amount: %.2f %s\n",sum, $2}
```

----------

## xraver

```
<td width="160">2006-11 / November</td>

                <td width="409"><a href="http://traffic.primacom.net/cgi-bin/traffic.cgi?date=2006-11">232.7 MByte</a></td></tr>

<tr><td width="1">&nbsp;</td>

                <td width="160">2006-10 / Oktober</td>

                <td width="409"><a href="http://traffic.primacom.net/cgi-bin/traffic.cgi?date=2006-10">12927.3 MByte</a></td></tr>

<tr><td width="1">&nbsp;</td>

                <td width="160">2006-09 / September</td>

                <td width="409"><a href="http://traffic.primacom.net/cgi-bin/traffic.cgi?date=2006-09">14002.5 MByte</a>
```

Das müsste das wichtigste sein.

Habs ein wenig zueschnitten da sich im oberen Teil persöhnliche Infos befinden.

----------

## smg

 *xraver wrote:*   

> 
> 
> ```
> <td width="160">2006-11 / November</td>
> 
> ...

 

Ok, teste mal obiges.

----------

## xraver

 *smg wrote:*   

> 
> 
> Ok, teste mal obiges.

 

```
grep $(date -I | cut -d "-" -f "1-2") traffic.cgi.4 | sed -e 's#.*date=\(.*\)">\(.*\)</a>.*#\2 \1#g' | awk -F " " ' BEGIN { sum = 0; count=0; } { printf "#%i: %.2f %s am %s\n", count++, $1, $2, $3; sum+=$1 } END { printf "Total amount: %.2f %s\n",sum, $2}'

#0: 0,00 bis am einschlie&szlig;lich

#1: 0,00 width="160">2006-11 am /

#2: 232,00 MByte am 2006-11

Total amount: 232,00 MByte
```

Ein ' fehlte noch. Das Endergebnis Passt  :Wink:  - das würde mir als Wert reichen.

----------

## smg

```
grep $(date -I | cut -d "-" -f "1-2")\" test.datei | sed -e 's#^.*<a.*date=\(.*\)">\(.*\)</a>.*#\2 \1#g' | awk -F " " ' BEGIN { sum = 0; count=0; } { printf "#%i: %.2f %s am %s\n", count++, $1, $2, $3; sum+=$1 } END { printf "Total amount: %.2f %s\n",sum, $2}  '
```

Ja, so geht das jetzt.

So müsste es okay sein, eventuell noch die #0 raus bauen, willst ja nur summe und nix meh aufzählen wie vorher. Bis dan.n

----------

## Necoro

@smg: Freak  :Shocked:   :Wink:  (und denn auch noch Mathe unterrichten ...   :Cool:  )

----------

## slick

verschoben nach Diskussionsforum

----------

## l3u

 *smg wrote:*   

> 
> 
> ```
> grep $(date -I | cut -d "-" -f "1-2")\" test.datei | sed -e 's#^.*<a.*date=\(.*\)">\(.*\)</a>.*#\2 \1#g' | awk -F " " ' BEGIN { sum = 0; count=0; } { printf "#%i: %.2f %s am %s\n", count++, $1, $2, $3; sum+=$1 } END { printf "Total amount: %.2f %s\n",sum, $2}  '
> ```
> ...

 

Und da soll noch einer sagen, daß Gentoo-User Freaks sind. ;-)

----------

## xraver

Was ist daraus geworden?

http://img518.imageshack.us/img518/8273/bw4tm3.jpg

Natürlich kann man das noch "schöner" machen  :Wink: .

----------

