ubuntuusers.de

Text aus Datei in anderer Datei suchen

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

kopeter

Avatar von kopeter

Anmeldungsdatum:
9. Juli 2013

Beiträge: 129

Ich bin dabei mir ein Script zu basteln, welches mir die neuinstallation eines Systems per Script möglichst flott erledigt. Dazu gehört hier im Heimnetz die Einbindung übers Netzwerk zweier HDDs am Pi.

Meine Idee ist also, das entsprechende Einträge per Script einfach an die fstab angehänt werden. Damit, wenn es irgendwo zu Fehlern kommen sollte, die fstab nicht mit jeden Aufruf wächtst, würde ich gerne überprüfen ob die entsprechenden Einträge schon da sind. Die Einträge habe ich in einer Datei (fstab_Add) hinterlegt. Der von mir gedachte Vorschlag meldet aber "[: grep: Einstelliger (unärer) Operator erwartet."

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
    fstab_Add=/home/kopeter/TEST/fstab_Add
    fstab=/home/kopeter/TEST/fstab_Test
      echo "füge Netzlaufwerke zur fstab hinzu"
      if [ grep <$fstab_Add $fstab ]  ## [: grep: Einstelliger (unärer) Operator erwartet.
        then 
          echo "fstab war bereits aktuell"; 
        else
          echo "erweitere fstab"
          cat $fstab_Add >> $fstab
          mount -a
          echo "Netzlaufwerke sollten nun eingebunden sein"
      fi

Ich erkenne als Fehler, dass die Ausgabe von grep nicht zur Prüfung von if passt, mir fällt aber auch nichts ein, wie es gehen könnte.

LG kopeter ☺

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 10380

Wohnort: Münster

kopeter schrieb:

[…]

#!/bin/bash
    fstab_Add=/home/kopeter/TEST/fstab_Add
    fstab=/home/kopeter/TEST/fstab_Test
      echo "füge Netzlaufwerke zur fstab hinzu"
      if [ grep <$fstab_Add $fstab ]  ## [: grep: Einstelliger (unärer) Operator erwartet.
[…]

Mit den eckigen Klammern „[ ]“ wird der Aufruf des Kommandos test gekennzeichnet. Also sollte zwischen den Klammern eine Prüfbedingung stehen und nicht der Aufruf eines Programms wie grep. Wenn Du den Rückgabewert von grep testen willst, lasse die Klammern einfach weg. (Alternativ könntest Du auch grep in einer Subshell ausführen, also ein Konstrukt wie [ $(grep … ) ] benutzen, aber das wäre ziemlicher Unfug.)

Prüfung von if

Das Kommando if prüft selbst gar nichts, sondern reagiert nur selektiv auf den Rückgabewert des letzten ausgeführten Kommandos, welches nach (!) dem Wort "if" steht.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13370

Zeile 5 solle eher so aussehen:

1
  if fgrep -xqf "$fstab_Add" "$fstab"; then

Es reicht dann aber, wenn ein Eintrag aus fstab_Add bereits in der fstab ist, damit keine Einfügung gemacht wird. Etwas robuster wäre:

1
2
3
while read -r line; do
  fgrep -xqf "$line" "$fstab" || echo "$line" >> "$fstab"
done < "$fstab_Add"

Auf die Weise prüfst Du alle Zeilen einzeln und fügst sie ggf. hinzu.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

kopeter schrieb:

Ich bin dabei mir ein Script zu basteln, welches mir die neuinstallation eines Systems per Script möglichst flott erledigt. Dazu gehört hier im Heimnetz die Einbindung übers Netzwerk zweier HDDs am Pi.

Warum nimmst du dazu nicht ein Tool wie Ansible, das speziell dafür gedacht ist Systeme in einen definierten Zustand zu bringen? Dafür gibt es z.B. lineinfile und blockinfile, um sicherzustellen, dass eine bestimmte Zeile in einer Datei vorhanden ist.

Also z.B. in einem Playbook fstab_addition.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
---
- hosts: 127.0.0.1
  connection: local
  gather_facts: no
  tasks:
    - name: ensure all lines from file /home/kopeter/TEST/fstab_Add exist in fstab
      lineinfile:
        path: /home/kopeter/TEST/fstab
        state: present
        line: '{{ item }}'
      with_lines:
        - "cat /home/kopeter/TEST/fstab_Add"   

Und dann einfach das Playbook ausführen:

ansible-playbook fstab_addition.yml 

Das nette an Ansible ist, dass man das Playbook auch von einem anderen Rechner aus über SSH-Verbindungen ausführen lassen kann und nicht mehr als ein Python-Interpreter auf dem Ziel installiert sein muss, was bei den meisten Distributionen, die auf Debian- bzw. Ubuntu als Basis setzen eh der Fall ist.

kopeter

(Themenstarter)
Avatar von kopeter

Anmeldungsdatum:
9. Juli 2013

Beiträge: 129

@seahawk1986 das nutze ich nicht weil ich es bisher garnicht kannte 😉

zunächst habe ich jetzt die Version von rklm eingebaut. grep findet aber die Dateien (=Zeilen?) nicht, sondern addiert die fröhlich zur fstab hinzu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
grep: : Datei oder Verzeichnis nicht gefunden
grep: # Addendum: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Musik/     /home/peter/Musik     fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Bilder/    /home/peter/Bilder    fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Videos/    /home/peter/Videos    fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Dokumente/ /home/peter/Dokumente fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Lager/     /home/peter/Lager     fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: sshfs#himbeere:/home/pi/Buecher/   /home/peter/Buecher   fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
grep: #sshfs#himbeere:/home/pi/Desktop/   /home/peter/Desktop   fuse uid=1000,gid=100,umask=0,allow_other,_netdev 0 0: Datei oder Verzeichnis nicht gefunden
mount: nur „root“ kann die Option „--all“ verwenden
Netzlaufwerke sollten nun eingebunden sein

hier das gekürzte

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
# Variablen belegen
echo "Herzlich willkommen zum Installationsscript. Ich sage dir immer was ich tu ;)
zunächst werden die Variablen belegt :)"
benutzer=peter 
#echo "Benutzer = " $benutzer
#echo "BackupDirSSH = " $BackupDirSSH
BackupDir_Lokal=/home/$benutzer/BackupDir_Lokal
#echo "BackupDir_Lokal = " $BackupDir_Lokal
read -p "sollen einmalig notwendige Ationen ausgeführt werden? (j/n):" einmaligesErledigen

###############################################

#echo {grep <$fstab_Add <$fstab}

case $einmaligesErledigen in
  j|J|y|Y|ja|Ja|JA|yes|Yes|YES|z|Z|zes|Zes|ZES)
    echo "führe dieses Mal einmalige Operationen aus!"
    fstab_Add="/home/peter/TEST/fstab_Add.txt"
    fstab="/home/peter/TEST/fstab_Test.txt"
    set -C
      echo "füge himbeere zur fstab hinzu"
      while read -r line; do
        fgrep -xqf "$line" "$fstab" || echo "$line" >> "$fstab"
      done < "$fstab_Add"
      mount -a
      echo "Netzlaufwerke sollten nun eingebunden sein"
       
      #echo "initialisiere SSH-Hilfen"
      #
      #echo "SSH sollte nun funktionieren"
    ;;
  nein|Nein|NEIN|no|No|No|n|N)
    echo "es werden dieses Mal keine einmaligen Operationen ausgeführt"
    ;;
  *)
    echo "ich weiß nicht was du eingegeben hast, aber es werden dieses Mal sicherheitshalber keine einmaligen Operationen ausgeführt"
    ;;
esac

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Welchen Inhalt hat

kopeter schrieb:

1
    fstab_Add="/home/peter/TEST/fstab_Add.txt"

die Datei /home/peter/TEST/fstab_Add.txt bzw. existiert sie mit genau diesem Pfad (Groß- und Kleinschreibung beachten) und darf das Skript (bzw. der ausführende Benutzer) darauf zugreifen?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13370

kopeter schrieb:

zunächst habe ich jetzt die Version von rklm eingebaut. grep findet aber die Dateien (=Zeilen?) nicht, sondern addiert die fröhlich zur fstab hinzu.

Mein Fehler: da ist die Option "f" vom Experimentieren übrig geblieben. Zeile 24 muss so aussehen:

1
        fgrep -xq "$line" "$fstab" || echo "$line" >> "$fstab"

Bitte führ das Skript mal so aus bash -x pfad/zum/script. Dann siehst Du genau, was es tut und wo es schiefgeht - wenn noch Fehler auftreten.

kopeter

(Themenstarter)
Avatar von kopeter

Anmeldungsdatum:
9. Juli 2013

Beiträge: 129

jetzt läufts! danke ☺

Antworten |