Hilfe beim Skript

Gast #5004209
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
Gast #5004416
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?
Gast #5004436
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
Gast #5004443
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?
Gast #5004483
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 ;)
Gast #5004608
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
(Firma: Potilatormanufaktur) #5004719
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"];'
Gast #5005681
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
#5009825
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']

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren