ubuntuusers.de

Mit Grep oder Sed die letzten 5 Zeichen aus den gefilterten Zeilen entfernen

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

TimeMen

Anmeldungsdatum:
16. April 2016

Beiträge: 22

Hallo Community,

Ich habe bereits aus einem RSS Feed die wichtigsten Zeilen gefiltert mit curl und sed, allerdings ist am Ende dieser 10 Zeilen immer noch ein <br/>. Die Ausgabe sieht so aus, und der Zeichensatz "</br>" soll entfernt werden. Auserdem wäre es gut wenn das untereinander stehen würde.

Time: 12.09.2016 10:45:00</> Outside Temperature: 25,9°C</> Inside Temperature: 25,8°C</> Wind Chill: 25,9°C</> Heat Index: 25,9°C</> Dewpoint: 15,6°C</> Humidity: 53%</> Barometer: 1018,5 hPa</> Wind: 8 km/h from 97°</> Rain Rate: 0,0 mm/h 

Hoffe ihr könnt mir helfen, denn ich komme mit grep, sed und dem ganzen Kram nicht wirklich zurecht 😐 Bin erstmal froh dass ich den Anfang hinbekommen habe ^^

LG RouteUS66

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

TimeMen schrieb:

Ich habe bereits aus einem RSS Feed die wichtigsten Zeilen gefiltert mit curl und sed, allerdings ist am Ende dieser 10 Zeilen immer noch ein <br/>.

Auserdem wäre es gut wenn das untereinander stehen würde.

Wie sieht denn dein Befehl bisher aus? Vielleicht kann man das gleich noch integrieren, und sich damit einen Befehlsaufruf sparen. Ansonsten geht das so:

1
echo ... | sed "s#<br/?>#\n#g"

Der Slash, der das Element als abgeschlossen markieren soll, ist optional, daher hab ich das gleich mit berücksichtigt.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ein RSS-Feed ist ja normalerweise sauberstes XML. - Da solltest Du doch besser mit Xpath und Kollegen heran gehen und nicht mit sed. Die sind nämlich direkt dafür gemacht.

Hast Du mal ein Beispiel oder einen Link ? - dann könnte ich Dir einen Vorschlag mit xmlstarlet liefern.

LG,

track

TimeMen

(Themenstarter)

Anmeldungsdatum:
16. April 2016

Beiträge: 22

Also bisher habe ich das hier:

1
curl -v --silent --insecure https://steumatt.goip.de/wetter/RSS/weewx_rss.xml | sed -n '32,41p'

Der RSS Feed https://steumatt.goip.de/wetter/RSS/weewx_rss.xml Den Schnipsel von misterunknown habe ich ausprobiert, aber an der Ausgabe der Werte hat sich nix geändert. Sie stehen weder untereinander, noch ist der br-Tag am Ende jedes Wertes weg ☹

Danke schonmal ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wofür willst Du die Werte denn verwenden ? - denn davon hängt ja auch die Ziel-Formatierung ab.

Sonst könnte ein erster Ansatz mit xmlstarlet z.B. sowas sein:

track@track:~$ curl --silent --insecure https://steumatt.goip.de/wetter/RSS/weewx_rss.xml  |  xmlstarlet sel -t -m //description -v . 
Current conditions, and daily, monthly, and yearly summaries
           Outside temperature: 26,6°C; 
           Barometer: 1018,1 hPa; 
           Wind: 12 km/h from 72°; 
           Rain rate: 0,0 mm/h; 
           Inside temperature: 26,0°C
         
	        Min outside temperature: 18,4°C at 04:40:00;
         	Max outside temperature: 26,8°C at 11:26:12;
	        Min inside temperature:  25,0°C at 06:30:00;
	        Max inside temperature:  26,1°C at 08:05:00;
	        Min barometer:           1018,0 hPa at 11:47:21;
	        Max barometer:           1019,6 hPa at 01:40:00;
            Max wind :               21 km/h from 45° at 11:40:05;
            Rain today:              0,0 mm
         
	        Min outside temperature: 11,5°C at 06.09.2016 um 06:45:00;
         	Max outside temperature: 30,8°C at 10.09.2016 um 18:00:00;
	        Min inside temperature:  23,3°C at 05.09.2016 um 15:40:00;
	        Max inside temperature:  27,1°C at 10.09.2016 um 08:10:00;
	        Min barometer:           1013,2 hPa at 08.09.2016 um 16:40:00;
	        Max barometer:           1027,9 hPa at 06.09.2016 um 07:00:00;
            Max wind :               32 km/h from 180° at 05.09.2016 um 06:45:00;
            Rain total for month:    583,8 mm
         
	        Min outside temperature: 3,1°C at 15.05.2016 um 05:35:00;
         	Max outside temperature: 35,7°C at 26.08.2016 um 16:00:00;
	        Min inside temperature:  21,4°C at 16.07.2016 um 03:15:00;
	        Max inside temperature:  29,2°C at 18.08.2016 um 16:03:24;
	        Min barometer:           999,0 hPa at 12.05.2016 um 17:40:00;
	        Max barometer:           1030,9 hPa at 17.08.2016 um 09:10:24;
            Max wind :               125 km/h from 90° at 28.08.2016 um 16:05:00;
            Rain total for year:     794,4 mm
         

.. was sich natürlich beliebig verfeinern lässt.

LG,

track

TimeMen

(Themenstarter)

Anmeldungsdatum:
16. April 2016

Beiträge: 22

Hey track ☺ Danke für den Befehl. Wäre es auch möglich den Rest der Ausgabe unten wegfallen zu lassen sodass nur der erste Absatz mit den Current Conditions angezeigt wird? Oder soll ich das einfach in eine Variable packen und dann nochmal mit sed nur die gewünschten Zeilen anzeigen lassen.

LG TimeMen

Achso: Die Werte will ich später in ein kleines Shell Script packen, sodass ich das Wetter anschauen kann ganz einfach im Terminal. Ausserdem will ich es vielleicht als MOTD auf meinem RPi einrichten.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Na ja, dann müssten wir uns mal die Tag-Struktur genauer ansehen:

<?xml version="1.0"?>
<rss version="2.0" 
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" >
   <channel>
      <title>Mattanjas Wetterstation, Limbach, Weather Conditions</title>
      <link></link>
      <description>Current conditions, and daily, monthly, and yearly summaries</description>
      <language>en-us</language>
      <pubDate>Mo, 12 Sep 2016 11:50:00 CEST</pubDate>

      <lastBuildDate>Mo, 12 Sep 2016 11:50:00 CEST</lastBuildDate>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs>
      <generator>weewx 3.5.0</generator>
      <ttl>5,000000 Minuten</ttl>
      
      <item>
         <title>Weather Conditions at 12.09.2016 11:50:00</title>
         <link></link>
         <description>
           Outside temperature: 26,6°C; 
           Barometer: 1018,1 hPa; 
           Wind: 12 km/h from 72°; 
           Rain rate: 0,0 mm/h; 
           Inside temperature: 26,0°C
         </description>
         <pubDate>Mo, 12 Sep 2016 11:50:00 CEST</pubDate>
	     <geo:lat>49.242</geo:lat>
    	 <geo:long>10.072</geo:long>
 		 <content:encoded><![CDATA[
           <p>
             Time:                12.09.2016 11:50:00<br/>
             Outside Temperature: 26,6°C<br/>
             Inside Temperature:  26,0°C<br/>
             Wind Chill:          26,6°C<br/>
             Heat Index:          26,6°C<br/>
             Dewpoint:            14,0°C<br/>
             Humidity:            46%<br/>
             Barometer:           1018,1 hPa<br/>
             Wind:                12 km/h from 72°<br/>
             Rain Rate:           0,0 mm/h<br/>
        </p>
      ]]></content:encoded>
      </item>

      <item>
         <title>Daily Weather Summary as of 12.09.2016 11:50:00</title>
         <link></link>
         <description>
	        Min outside temperature: 18,4°C at 04:40:00;
         	Max outside temperature: 26,8°C at 11:26:12;
	        Min inside temperature:  25,0°C at 06:30:00;
	        Max inside temperature:  26,1°C at 08:05:00;
	        Min barometer:           1018,0 hPa at 11:47:21;
	        Max barometer:           1019,6 hPa at 01:40:00;
            Max wind :               21 km/h from 45° at 11:40:05;
            Rain today:              0,0 mm
         </description>
         <pubDate>Mo, 12 Sep 2016 11:50:00 CEST</pubDate>
	     <geo:lat>49.242</geo:lat>
    	 <geo:long>10.072</geo:long>
 		 <content:encoded><![CDATA[
           <p>
             Day:                     12 Sep 2016<br/>
	         Min Outside Temperature: 18,4°C at 04:40:00<br/>
	         Max Outside Temperature: 26,8°C at 11:26:12<br/>
	         Min Inside Temperature:  25,0°C at 06:30:00<br/>
	         Max Inside Temperature:  26,1°C at 08:05:00<br/>
	         Min Barometer:           1018,0 hPa at 11:47:21<br/>
	         Max Barometer:           1019,6 hPa at 01:40:00<br/>
             Max Wind :               21 km/h from 45° at 11:40:05<br/>
             Rain today:              0,0 mm<br/>
        </p>
      ]]></content:encoded>
      </item>

      ....

Das was Dich interessiert, ist wahrscheinlich der Block <item><description> und vielleicht dazu auch noch der <title>.
Und davon nur der 1. Block, denn der 2. - 4. Block sind ja die Tages- Monats- und Jahressummen.

Also müsste man genau das auswählen: den 1. <item>- Block, und daraus die <description> und ggf. den <title> :

track@track:~$ cat wetter.rss  |  xmlstarlet sel -t -m //item[1] -v description 

           Outside temperature: 26,6°C; 
           Barometer: 1018,1 hPa; 
           Wind: 12 km/h from 72°; 
           Rain rate: 0,0 mm/h; 
           Inside temperature: 26,0°C
         
track@track:~$ cat wetter.rss  |  xmlstarlet sel -t -m //item[1] -v title -v description 
Weather Conditions at 12.09.2016 11:50:00
           Outside temperature: 26,6°C; 
           Barometer: 1018,1 hPa; 
           Wind: 12 km/h from 72°; 
           Rain rate: 0,0 mm/h; 
           Inside temperature: 26,0°C
          

Guck Dir am besten mal an, was da genau geschieht:

  1. wie man mit Xpath einen Knoten auswählt und

  2. die xmlstarlet - Doku, speziell dort Kap. 2 und die Beispiele, Kap. 12 LG, track

TimeMen

(Themenstarter)

Anmeldungsdatum:
16. April 2016

Beiträge: 22

Hey, danke für die Links ☺ Werde mir das ganze nachher anschauen.

Liebe Grüße TimeMen

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Tracks Lösung ist sehr nützlich, als sie auf einen sehr mächtigen Lösungsweg verweist, mit dem sich noch ganz andere Probleme gezielt erschlagen lassen, aber mit sed ginge es natürlich auch.

1
curl --silent --insecure https://steumatt.goip.de/wetter/RSS/weewx_rss.xml | sed -r -n '32,41s/.{5}$//p'

Mit sed -r werden einige reguläre Ausdrücke interpretiert, hier die geschweiften Klammern, die man sonst maskieren müsste.

Statt mit p die Zeilen 32,41p zu printen sagen wir s wie substitute, ersetzen: Punkt 5 Dollar /.{5}$/ heißt hier 5 beliebige Zeichen in Folge, unmittelbar vor dem Zeilenende - das wird ersetzt durch nix. Um das Zeilenende muss man sich nicht sorgen, denn sed gibt weiterhin zeilenweise aus.

misterunknown schrieb:

Auserdem wäre es gut wenn das untereinander stehen würde.

Wie sieht denn dein Befehl bisher aus? Vielleicht kann man das gleich noch integrieren, und sich damit einen Befehlsaufruf sparen. Ansonsten geht das so:

1
echo ... | sed "s#<br/?>#\n#g"

Der Slash, der das Element als abgeschlossen markieren soll, ist optional, daher hab ich das gleich mit berücksichtigt.

Der Slash steht aber vor br, deswegen klappt es nicht. Fragen gleich mitzubeantworten, die gar nicht gestellt waren, ist ohnehin immer etwas heikel. Prüfen, ob der Vorschlag funktioniert, hilft überraschend häufig eigene Fehler zu entdecken.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

user_unknown schrieb:

Der Slash steht aber vor br, deswegen klappt es nicht.

Nein, der Slash steht nach dem br.

Fragen gleich mitzubeantworten, die gar nicht gestellt waren, ist ohnehin immer etwas heikel. Prüfen, ob der Vorschlag funktioniert, hilft überraschend häufig eigene Fehler zu entdecken.

Ist kein Fehler. Ja, der TS hatte in seinem Ausgangsposting die zwei verschiedene Varianten drin, aber richtig ist natürlich nur der Slash hinter dem br, das andere war ein Tippfehler oder so.

Generell noch: Ja, xmlstarlet ist sicherlich eine saubere Lösung, in diesem Fall aber sicherlich nicht performanter, als das sed-Schnipsel.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

Nein, der Slash steht nach dem br.

Stimmt. Wieso funktioniert aber Dein Code nicht?

das andere war ein Tippfehler oder so.

Ein Flüchtigkeitsfehler.

Generell noch: Ja, xmlstarlet ist sicherlich eine saubere Lösung, in diesem Fall aber sicherlich nicht performanter, als das sed-Schnipsel.

Premature optimization is the root of all evil.

misterunknown Team-Icon

Ehemalige
Avatar von misterunknown

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 4403

Wohnort: Sachsen

user_unknown schrieb:

Nein, der Slash steht nach dem br.

Stimmt. Wieso funktioniert aber Dein Code nicht?

Oh, da hab ich hier vergessen, die Option -r mit anzugeben

echo ... | sed -r "s#<br/?>#\n#g"

Wenn man das nicht macht, müsste man das Fragezeichen escapen.

Antworten |