staging.inyokaproject.org

Datei Zeilenweise in ein Array einlesen

Status: Gelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

stitcho

Anmeldungsdatum:
8. Januar 2019

Beiträge: 13

Hallo ihr Lieben!

Ich stehe vor einem kleinen Problem, welches bestimmt schnell gelöst werden kann.

Ich möchte gern ein Array erstellen, in welches eine index.html Datei zeilenweise eingelesen wird.

in

1
array[1]

soll die erste Zeile der html Datei stehen usw...

Ich habs schon mit tail versucht, allerdings gibt mir tail immer die letzten n Zeilen aus und nicht nur die Zeile n:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#Zeilenzahl auslesen:
LN_index=$(wc -l /var/www/html/service/index.html | cut -d " " -f 1)
echo "$LN_index"

#Schleife, welche index.html zeilenweise ins ARRAY file_index schreibt

for i in $(seq 1 $LN_index)
do
  # j ist die Zeilen, die man vom Ende aus hoch gehen muss
  j=`expr $LN_index - $i + 1`
  file_index[$i]=$(tail -$j index.html)
done

Ich würde mich sehr freuen, wenn mir jemand helfen könnte. ☺

Herzlichen Dank und ganz liebe Grüße!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Schau dir mal den Befehl mapfile (bzw. readarray) an: https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html

Ansonsten kannst du das natürlich auch zu Fuß machen (IFS= sorgt dafür, dass Whitespace am Zeilenende erhalten wird - je nach Anwendungsfall kann das nicht gewollt sein, dann einfach weglassen):

1
2
3
4
5
#!/bin/bash
declare -a file_array
while IFS= read -r line; do
    file_array+=("$line")
done < index.html

Der Index von Bash-Arrays beginnt bei 0.

Ansonsten gäbe es auch noch die Möglichkeit für einen Assoziativen Array, wenn man unbedingt die erste Zeile mit dem Key 1 erreichen können will:

1
2
3
4
5
6
#!/bin/bash
declare -A file_array
i=0
while IFS= read -r line; do
    file_array[$(( ++i ))]="$line"
done < index.html

Naubaddi

Avatar von Naubaddi

Anmeldungsdatum:
28. Oktober 2009

Beiträge: 744

Hi,

stitcho schrieb:

...Ich möchte gern ein Array erstellen, in welches eine index.html Datei zeilenweise eingelesen wird...

für mein Backup werden zeilenweise aus der Datei dumm.hf.txt die vorhandenen Laufwerke in das ARRAY medium=() eingelesen, vielleicht hilft es Dir weiter.

Inhalt der Datei dumm.hf.txt:

/media/$USER/
/media/$USER/ntfs-silber
/media/$USER/ntfs-dual

Der Skript-Teil mit einem ARRAY:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
extern="/media/$USER/"						# Pfad zum externen Speichermedium
nr="0"								# Zähler für die Speichermedien
medium=()							# Array für die Speichermedien
fpara="-maxdepth 1 -type d"					# Parameter für find, nur die erste Ordnerebene suchen
#
find "$extern" $fpara > "$HOME/dumm.hf.txt"			# Speichermedien in eine Datei schreiben
#
while read -r line ; do						# Schleife um eine Zeile der Datei einzulesen
  if [ "${line##*$extern}" ] ; then				# wenn ein Speichermedium existiert
    ((nr+=1))							# Zähler um 1 erhöhen
    medium["$nr"]="${line##*$extern}"				# Speichermedium in das Array übernehmen
    echo "$nr) ${medium[$nr]}"					# Speichermedium mit Nr. anzeigen
  fi								# Ende von if [ "${line##*$extern}" ]
done < "$HOME/dumm.hf.txt"					# while-Schleife bis zum Dateiende wiederholen

Grüßle, Naubaddi

stitcho

(Themenstarter)

Anmeldungsdatum:
8. Januar 2019

Beiträge: 13

Super vielen lieben Dank!

Ihr habt mir beide geholfen ☺

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

Was ist denn eigentlich der Zweck der Übung?

stitcho

(Themenstarter)

Anmeldungsdatum:
8. Januar 2019

Beiträge: 13

Ich habe ein Skript, welches Daten von verschiedenen Rechnern sammelt und auswertet. Diese werden zur Zeit in einer täglichen E-Mail an unterschiedliche Empfänger versendet.

Ich hab jetzt eine ganz einfache html Seite erstellt, wo das ganze etwas ansehnlicher dargestellt ist. Die einzelnen Parameter werden durch das bash Skript geändert.

Im Prinzip wird die ganze index.html Zeilenweise eingelesen und dann einzelne Zeilen angepasst und anschließend die ganze index.html Datei neu erstellt. Das funktioniert auch schon mit den ersten Parametern. Ist halt noch in Arbeit ☺

Mit dem Skript schreibe ich also html Code in die index.html und passe diesen gleichzeitig an...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

stitcho schrieb:

Im Prinzip wird die ganze index.html Zeilenweise eingelesen und dann einzelne Zeilen angepasst und anschließend die ganze index.html Datei neu erstellt. Das funktioniert auch schon mit den ersten Parametern. Ist halt noch in Arbeit ☺

So etwas muss man aber nicht mühsam zeilenweise machen.

Mit dem Skript schreibe ich also html Code in die index.html und passe diesen gleichzeitig an...

Also eine Templating-Lösung. Abgesehen davon, dass es die wie Sand am Meer gibt, kannst Du das auch mit einer Shell erledigen. Hier mal ein recht sinnloses Beispiel um das Prinzip zu demonstrieren:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh

cat <<HTML
<html>
<body>
<h1>Überschrift</h1>
<p>Dies ist eine Nachticht von $USER auf Rechner $(hostname).</p>
<table>
<th>Zähler</th>
<th>Wert</th>
$(
  for i in $(seq 10 15); do
    echo "<tr><td>$i</td><td>$(date && sleep 0.3)</td></tr>"
  done
)
</table>
</body>
</html>
HTML

stitcho

(Themenstarter)

Anmeldungsdatum:
8. Januar 2019

Beiträge: 13

Vielen Dank für den Hinweis.

Das hört sich sehr interessant und hilfreich an...

Also ich hab das mal in der bash ausgeführt, dass sieht ja sehr gut aus!

Wie kann ich das jetzt noch auf index.html schreiben?

Irgendwas mit > index.html muss das dann ja sein...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 12527

stitcho schrieb:

Vielen Dank für den Hinweis.

Bitte.

Das hört sich sehr interessant und hilfreich an...

Freut mich.

Wie kann ich das jetzt noch auf index.html schreiben?

Irgendwas mit > index.html muss das dann ja sein...

1
2
cat <<HTML >index.html
...

stitcho

(Themenstarter)

Anmeldungsdatum:
8. Januar 2019

Beiträge: 13

Ach, so einfach ist das?

Das ist ja echt elegant gemacht. Wirklich besser als die array Lösung. ☺

Meine Array Funktion funktioniert jetzt schon. Ich werde das aber trotzdem ändern, weil ich das neue Wissen dann direkt im nächsten Projekt verwenden werde.

Besten dank und schönes langes Pfingstwochenende!

Stitcho

Antworten |