Forum: PC-Programmierung Hilfe beim Skript


von Skriptanfänger (Gast)


Lesenswert?

Hallo,
ich bräuchte Hilfe bei einem Bash-Skript. Ich mach seit 2 Tagen dranrum 
un komme nicht vorwärts..



Ich habe einen Ordner in dem mehrere Dateien abliegen. Jede einzelne 
Datei hat folgenden Aufbau:
1
{
2
  "enabled": true,
3
  "start": 1493842500,
4
  "start_extra": 0,
5
  "stop": 1493844300,
6
  "stop_extra": 0,
7
  "channel": "d3751afe7fb68fb4a19fb1d482b52787",
8
  "channelname": "Das Erste HD",
9
  "title": {
10
    "ger": "Tagesthemen"
11
  },
12
  "subtitle": {
13
    "ger": "mit Wetter"
14
  },
15
  "description": {
16
    "ger": "Themen u.a.:\n* Vor der Wahl: TV-Duell in Frankreich\n* Unter Druck: Eingeschüchterte Journalisten\n* Auf der Hut: Cybercrime bedroht Deutschland\n* Kommentar von Thomas Baumann (MDR) zum Tag der Pressefreiheit\n\nModeration: Caren Miosga\nProduziert in H"
17
  },
18
  "pri": 2,
19
  "retention": 2147483646,
20
  "removal": 92,
21
  "playposition": 0,
22
  "playcount": 0,
23
  "config_name": "8d0f5b7ae354d956d7fe5db25f5d0d24",
24
  "owner": "kodi",
25
  "creator": "kodi",
26
  "errorcode": 103,
27
  "errors": 1,
28
  "data_errors": 0,
29
  "dvb_eid": 22433,
30
  "noresched": false,
31
  "norerecord": false,
32
  "fileremoved": 0,
33
  "autorec": "",
34
  "timerec": "",
35
  "parent": "",
36
  "child": "",
37
  "content_type": 2,
38
  "broadcast": 37561,
39
  "files": [
40
    {
41
      "filename": "/storage/recordings/Tagesthemen/Tagesthemen-Das Erste HD2017-05-0322-15.ts",
42
      "info": [
43
        {
44
          "type": "H264",
45
          "width": 1280,
46
          "height": 720,
47
          "duration": 1800,
48
          "aspect_num": 0,
49
          "aspect_den": 0
50
        },
51
        {
52
          "type": "MPEG2AUDIO",
53
          "language": "ger",
54
          "audio_type": 0
55
        },
56
        {
57
          "type": "MPEG2AUDIO",
58
          "language": "mis",
59
          "audio_type": 0
60
        },
61
        {
62
          "type": "AC3",
63
          "language": "ger",
64
          "audio_type": 0
65
        },
66
        {
67
          "type": "TELETEXT"
68
        },
69
        {
70
          "type": "DVBSUB",
71
          "language": "ger",
72
          "composition_id": 1,
73
          "ancillary_id": 1
74
        }
75
      ],
76
      "start": 1493842500,
77
      "stop": 1493844164
78
    }
79
  ]
80
}

Mich interessiert dabei die Felder "start" und "stop". Hier sind die 
Startzeiten bzw. Stoppzeiten der Aufnahme gespeichert. Nun möchte ich 
jede einzelne Datei durchsuchen und schauen welches der nächste 
Startzeitpunkt vom aktuellen Zeitpunkt ist und in dem Format " 
YYMMDDhhmmss" ausgeben, zusätzlich soll die stoppzeit zu der zugehörigen 
Startzeit auch ausgegeben werden.

Kann mir jmd helfen?

Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sieht aus wie json.

Dafür sollte das hier helfen:

https://github.com/dominictarr/JSON.sh

von J. F. (Firma: Père Lachaise) (rect)


Lesenswert?

Alternativ: nimm ein Python Skript:
1
import json
2
[...]

Und du bist glücklich :-)

von Urmel (Gast)


Lesenswert?

Nochne Möglichkeit: https://stedolan.github.io/jq/
1
jq '{ start: .start, stop: .stop }' daten.json
 (osä)

von Skriptanfänger (Gast)


Lesenswert?

Derzeit mache ich es so

"tmp_start=`cat $i | grep '"start":' | cut -f 2 -d " " | cut -f 1 -d 
","`" sobald ich temp_start weiterverarbeiten will kommt immer Bad 
number in der Konsole.. Was mache ich falsch?

von Der kein Bock mehr A. (Gast)


Lesenswert?

Hi, nee, der Tipp oben mit dem JSON ist schon gut. Parse das als 
JSON-Objekt, dann hast Du direkten Zugriff auf die Felder.
Bist Du auf bash angewiesen, oder könntest Du das auf ner 
Windows-Maschine mit Powershell machen ? Da gibts JSON-Parser quasi 
eingebaut.

Ansonsten Python, auch gut.

LG

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

Skriptanfänger schrieb:
> Derzeit mache ich es so
>
> "tmp_start=`cat $i | grep '"start":' | cut -f 2 -d " " | cut -f 1 -d
> ","`" sobald ich temp_start weiterverarbeiten will kommt immer Bad
> number in der Konsole.. Was mache ich falsch?

Nicht direkt falsch, aber 3 Werkzeuge und 4 Aufrufe: etwas viel wenn 
eines davon 1x aufgerufen reicht. Das bringt dich direkt in die /Shell 
quoting hell/ .

Ungetestet aus dem Verdauungsdämmerzustand:
1
tmp_Start=$( grep -oP '(?<="start":)[0-9]+'  "${i}" )
2
tmp_Stop=$( grep -oP '(?<="stop":)[0-9]+'  "${i}" )

Die Wege über eine JSON library, insbesondere via Python, sind definitiv 
besser/sauberer.

Ist garantiert dass start¦stop IMMER kleingeschrieben sind?

von Kommandozeile vor dem Frühstück für Alle! (Gast)


Lesenswert?

> Windows-Maschine mit Powershell

Igitt! POSIX resp. GNU Werkzeuge und auch Python sind definitiv 
portabler als PoSh=ProprietaryShit

von Skriptanfänger (Gast)


Lesenswert?

Das Problem ist mein System läuft libreelec deswegen bin ich von der 
Vielfalt her eingeschränkt........ Ich kann keine zusätzlichen Pakete 
z.b. installieren etc. Daher mein Ansatz über die Grundfunktionen ;)

von Helmut H. (helmuth)


Lesenswert?

Skriptanfänger schrieb:
> ich kann keine zusätzlichen Pakete z.b. installieren

Python ist ziemlich sicher schon da, z.B. auf dem Raspi mit:

osmc@osmc:~$ python
Python 2.7.9 (default, Aug 13 2016, 17:56:53)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>>

: Bearbeitet durch User
von Skriptanfänger (Gast)


Lesenswert?

Ja Start ist immer kleingeschrieben @Kommandozeile vor dem Frühstück für 
Alle!  Ich probiere mal deinen Ansatz

von Der kein Bock mehr A. (Gast)


Lesenswert?

Kommandozeile vor dem Frühstück für Alle! schrieb:
>> Windows-Maschine mit Powershell
>
> Igitt! POSIX resp. GNU Werkzeuge und auch Python sind definitiv
> portabler als PoSh=ProprietaryShit

Ach stell disch net so oo Bub ... wenn eh grad ne Win-Möhre da ist, 
reicht für sowas das bissi Posh allemal :-P nicht immer soviel 
Berührungsängste haben, Kinners ;-)

Aber erst bei genaueren betrachten des Inhalts sinds wohl eh 
Programminfos von KODI wahrscheinlich auf nem RasPi, von daher klar : 
Wenn schon ne X-oide Maschine da ist, dann natürlich auch mit 
Bordmitteln.

Alles gut

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Skriptanfänger schrieb:
> Derzeit mache ich es so
>
> "tmp_start=`cat $i | grep '"start":' | cut -f 2 -d " " | cut -f 1 -d
> ","`" sobald ich temp_start weiterverarbeiten will kommt immer Bad
> number in der Konsole.. Was mache ich falsch?

Nach dem ersten cut kommt schon nix mehr raus. Mit deinem grep 
bekommst du zwei lines ausgespuckt. Diese unterscheiden sich nur in der 
Anzahl der führenden Leerzeichen. Damit kannst du die unterscheiden, 
falls die Unterscheidung überhaupt wichtig ist. Wenn beide Werte immer 
gleich sind, kannst du auch einfach head -n1 oder tail -n1 oder 
unique oder sowas benutzen. Den Kram um den eigentlichen Wert herum 
bekommst du mit sed weg. Das ist aber insgesamt wie schon erwähnt die 
unsaubere Lösung. Das JSON benutzen wie es gedacht ist ist besser. Haste 
denn jetzt python zur Verfügung? Und Module?
1
cat file.json | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["start"];'

: Bearbeitet durch User
von Skriptanfänger (Gast)


Lesenswert?

Also bei
1
tmp_Start=$( grep -oP '(?<="start":)[0-9]+'  "${i}" )
kommt bei mir
1
grep: invalid option -- 'P'

von Daniel A. (daniel-a)


Lesenswert?

Bei einigen unixoiden, wie z.B. busybox, ist eine reduzierte version von 
grep enthalten die keine Perl/Extended syntax unterstützung. Versuche 
mal:
1
grep -o '"start": [0-9]*' "$i" | head -n 1 | grep -o '[0-9]*'

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Skriptanfänger schrieb:
> grep: invalid option -- 'P'

Hm.

"-P, --perl-regexp         PATTERN is a Perl regular expression".

Eine deiner Einschränkungen vielleicht?

Hier noch eine dreckige Lösung
1
cat file.json | grep start | head -n1 | sed 's/^ *\"start\": *//;s/,.*//' | date +%Y%m%d%H%M%S

von Skriptanfänger (Gast)


Lesenswert?

hier mein Skript:
1
#!/bin/sh
2
cd /storage/.kodi/userdata/addon_data/service.tvheadend42/dvr/log/
3
4
for i in $( ls ); do
5
            tmp_Start=grep -o '"start": [0-9]*' "$i" | head -n 1 | grep -o '[0-9]*'
6
done

nun kommt
1
./test3.sh: line 6: -o: not found

von Daniel A. (daniel-a)


Lesenswert?

1
tmp_Start="$(grep -o '"start": [0-9]*' "$i" | head -n 1 | grep -o '[0-9]*')"

von Sheeva P. (sheevaplug)


Lesenswert?

Daniel A. schrieb:
>
1
> tmp_Start="$(grep -o '"start": [0-9]*' "$i" | head -n 1 | grep -o 
2
> '[0-9]*')"
3
>

Clever! Da steuer' ich auch mal zwei Python-Lösungen bei -- als 
Shell-Oneliner:
1
cd /storage/.kodi/userdata/addon_data/service.tvheadend42/dvr/log/
2
for i in *; do
3
  tmp_start=$(python -c 'import json, sys; 
4
    c = json.loads(sys.stdin.read());
5
    print c["start"], c["stop"]' < $i);
6
done

Oder direkt als Skript:
1
#!/usr/bin/python
2
import json, sys, os
3
os.chdir('/storage/.kodi/userdata/addon_data/service.tvheadend42/dvr/log/')
4
for fn in os.listdir("."):
5
  with open(fn, 'r') as ifh:
6
    c = json.loads(ifh.read())
7
    print fn, c['start'], c['stop']

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.