NoPaste

tanken script

von Buerste

SNIPPET_TEXT:
  1. #!/bin/bash
  2. # - 12.10.2013 -
  3. #
  4. ###########################################################
  5. #
  6. #  Benutzung auf eigene Verantwortung
  7. #  
  8. ###########################################################
  9. #
  10. #  geändert von djeli 17.10.2013 für den eigenen Gebrauch
  11. #  semikolon als Zellentrenner eingebaut
  12. #  für Libre Office Calc
  13. #  
  14. #  aufruf: im Terminal
  15. #  ausgabe: im Terminal und in Datei "/home/user/Benzinpreißtabelle.txt"wird angehängt
  16. #
  17. #
  18. ############################################################
  19.  
  20. Hilfe(){
  21.   echo "${0##*/} ist ein Benzinpreisanzeiger (Version 2013-10-14.a)"
  22.   echo "Syntax: ${0##*/}"
  23.   exit
  24. }
  25. test "${1}" = "-h" -o "${1}" = "-help" -o "${1}" = "--help" && Hilfe
  26.  
  27. Ende(){
  28.     rm  "$Temp1" "$Temp2"
  29.     exit ${1:-0}
  30. }
  31.  
  32.  
  33.  
  34. # Noch umständlich formuliert zur einfachen Anpassung wegen dem Beta-Status der Seite
  35.  
  36.  
  37.  
  38. # Konstanten
  39. Url="http://www.clever-tanken.de/tankstelle_liste"
  40. Temp1="$(mktemp)"
  41. Temp2="$(mktemp)"
  42.  
  43.  
  44.  
  45. # Benutzervariablen
  46. Spritsorte=3   # 3=Diesel, 5=Super-E10, 7=Super-E5
  47. Tankenliste=~/bin/Tankenliste.txt
  48.  
  49. # Es werden zunächst nur die 5-Stelligen Postleitzahlen beachtet und komplett abgearbeitet.
  50. # Erst in der Verifikation werden unerwünschte Tanken rausgeworfen.
  51. # Dabei gilt: Steht eine Postleitzahl alleine in der Tankenliste, wird davon keine Tanke rausgeworfen.
  52.  
  53.  
  54.  
  55. for p in $(grep -Eo '[0-9]{5}' "$Tankenliste" | awk '!a[$0]++'); do
  56.     u="${Url}?ort=${p}&spritsorte=${Spritsorte}"
  57.     wget -q "$u" -O - >>"$Temp2" || echo "Fehler: Download von '$u' fehlgeschlagen"
  58. done
  59. [ -s "$Temp2" ] || { echo "Fehler: Keine------ Daten vorhanden"; Ende 1; }
  60.  
  61.  
  62.  
  63. # Schnelle Vorfilter
  64. #
  65. # Datentable ausfiltern
  66. sed -n '/<table id="price-list"/,/<\/table>/p' "$Temp2" >"$Temp1"
  67. #
  68. # Datensätze nur der geöffneten Stationen ausfiltern (tr-Tag ohne class)
  69. ##############################################################################
  70. sed -n '/<tr><td class="price-cell">/,/<\/tr>/p' "$Temp1" >"$Temp2"
  71. #
  72. ##############################################################################
  73. # Leerzeichen und Tabs am Zeilenanfang rauswerfen; mehrfache Leerzeichen rauswerfen; Zeilen mit ausschließlich Whitespaces rauswerfen
  74. sed 's/^[ \t]*//;s/ \+/ /g;/^\s*$/d' "$Temp2" >"$Temp1"
  75.  
  76.  
  77.  
  78. # Defaults zum Filtern der Datensätze
  79. RegexPrice="<p class=\"price\">"
  80. SnipPrice=0
  81. RegexStationName="<p class=\"petrol-station-name\">"
  82. SnipStationName=0
  83. RegexStationAddress="<p class=\"petrol-station-address\">"
  84. SnipStationAddress=0
  85. RegexEndStationAddress="</p>"
  86. RegexEndData="</tr>"   # Ein Datensatz ist beendet
  87. Datetime="$(date +"%d.%m.%Y"";""%H:%M:%S")"
  88.  
  89. # Datensätze in jeweils eine Zeile ausfiltern
  90. while read l; do
  91.  
  92.     # Datum&Zeit und Preis mit sup (10tel Cent): Nach Zeile <p class="price">
  93.     [[ $l =~ $RegexPrice ]] && { SnipPrice=1; continue; }
  94.     if (( $SnipPrice )); then
  95.         echo -n  ${l//[^0-9.]/}"; $Datetime"
  96.         SnipPrice=0
  97.         continue
  98.     fi
  99.  
  100.     # Name: Zeile nach <p class="petrol-station-name">
  101.     [[ $l =~ $RegexStationName ]] && { SnipStationName=1; continue; }
  102.     if (( $SnipStationName )); then
  103.         echo -n ";"${l//<*>/}
  104.         SnipStationName=0
  105.         continue
  106.     fi
  107.  
  108.     # Adresse: Zeilen nach <p class="petrol-station-address"> bis Zeile vor </p>
  109.     [[ $l =~ $RegexStationAddress ]] && { SnipStationAddress=1; continue; }
  110.     if (( $SnipStationAddress )) && [[ $l =~ $RegexEndStationAddress ]]; then
  111.         SnipStationAddress=0
  112.         continue
  113.     fi
  114.     if (( $SnipStationAddress )); then
  115.         echo -n ";"${l//<*>/}
  116.         continue
  117.     fi
  118.  
  119.     # Ende eines Datensatzes
  120.     [[ $l =~ $RegexEndData ]] && { echo; continue; }
  121.    
  122. done <"$Temp1" >"$Temp2"
  123.  
  124.  
  125.  
  126. # Verifikation der Datensätze (fehlt noch)
  127.  
  128.  
  129.  
  130. # Tests
  131. #
  132. cat "$Temp2"
  133. cat >> Benzinpreißtabelle.txt "$Temp2"
  134. #
  135.  
  136. Ende

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN