Suche speziellen grep Befehl

-eraz-

Commodore
Registriert
Juni 2004
Beiträge
4.270
Ich muss aus z.b. so einer Liste an Dateien:
/etc/profile
/etc/profile.d/colorls.sh
/etc/profile.d/colorls.csh

per grep den absoluten Dateipfad rausholen, habe dabei aber nur den Dateinamen selbst zur verfügung.

Also z.b.:
cat liste |grep profile gibt folgendes aus:
/etc/profile
/etc/profile.d/colorls.sh
/etc/profile.d/colorls.csh

Ich brauche aber nur die Zeile:
/etc/profile

Wie mache ich das?
Sinnvoll wäre natürlich mit grep den Wert zu nehmen wo am Ende der Dateiname steht, nur wie?
 
grep "profile$" oder besser "/profile$"

achja, und "cat |" ist komplett ueberfluessig. grep ... liste genuegt ;)
 
Zuletzt bearbeitet:
Hatte ich schon versucht -> geht nicht :-/
 
Müsste aber gehen, du gibst damit jede Zeile aus die mit profile oder eben /profile enden.
cat brauchst aber nich.
e: okay wurd schon gesagt^^

> cat test
/etc/profile
/etc/profile.d/colorls.sh
/etc/profile.d/colorls.csh
> cat test | grep "profile$"
/etc/profile
 
Zuletzt bearbeitet:
Ich raff die Problemstellung nicht so ganz.
du willst nun die Zeilen rausschmeißen, in denen KEIN Dateiname steht, oder habe ich das falsch verstanden?
 
@bu1137
in diesem Fall muss ich vorher einen cat machen weil ich vorher noch mit cut aufbereite (hab ich im Beispiel natürlich vereinfacht)

@purplet
Naja es geht aber eben nicht. profile$ war eins der ersten Dinge die ich ausprobiert habe. Habt ihr das auf eurem System schon versucht? Ich mach das in Bash übrigens.

/edit
hmm, seltsam, wenn ich das ganze als Bespiel in ne Datei kopiere und dann mit profile$ versuche gehts. Anscheinend liegts der Art wie ich die Daten vorher aufbereite.

/edit2
Die Liste sieht so aus:
Code:
;/etc/profile                                   ;u=rw-x,g+r-wx,o+r-wx
;/etc/profile.d/colorls.sh                      ;u=rwx,g+rx-w,o+rx-w
;/etc/profile.d/colorls.csh                     ;u=rwx,g+rx-w,o+rx-w
Wenn ich dabei folgende Befehlsreihe ausführe kommt garkein Ergebnis:
Code:
cat testfile |cut -d";" -f2 |grep profile$
 
Zuletzt bearbeitet:
klar: nach profile hats ne menge leerzeichen.

ich frage mich ja schon, was du da genau vor hast, und ob es sich nicht mit find loesen laesst. alternativ auch mit sed (ganz ohne cut/grep).
 
Zuletzt bearbeitet:
Stimmt, wenn ich mit tr-d [:blank:] die leerzeichen entferne gehts.

Geht bestimmt eleganter, langsam nimmt das ganze eh unübersichtliche Auswuchse an. :freak:
Was ich da machen will ist eigentlich nicht so schwer zu erklären denke ich:
Es gibt ein "parameterfile" welches in der ersten Spalte Files inkl. absoluten Pfad enthält und in der zweiten Parameter für chmod. Einm Skript wird nun nur der Dateiname übergeben und den Rest soll es sich aus diesem Parameterfile holen um die Datei korrekt zu ersetzen.
 
dann wuerd ich das parameter file eher so machen:

0755 /blah/blah/profile
 
Also ich würde ja das Semikolon am Anfang jeder Zeile entfernen...
Mit dem Befehl funktioniert dann die abfrage nach der Zeile mit dem Pfad


Code:
cat testfile | cut -d";" -f1 |tr -d [:blank:]|grep profile$
 
Das mit dem Umbauen ist leider nicht so einfach bzw. seeeehr aufwändig weil ich dann an mehreren Stellen Code ändern und dann nochmal alles durchtesten muss. Aber langsam würd es sich rentieren.
Ich denke ich werd das File in ein Array einlesen und mit dem arbeiten, ist vll die schönere Lösung.
 
Yikes. Pipe in allen ehren, aber, das ist etwas exzessiv. Ich bin nach wie vor der Meinung, man sollte entweder das fileformat optimieren oder mit anderen Methoden dahintergehen.

bezueglich tr und den leerzeichen... wozu? das geht auch so:

grep "profile[[:space:]]*$"
 
bu1137 schrieb:
grep "profile[[:space:]]*$"
Cool, wusste nicht dass das so auch geht.
Weißt du vielleicht auch ob ich in der bash ein Array durchsuchen kann ohne dabei umständlich eine Schleife zu verwenden?
 
Wie genau soll das gehen? Eine explizite Funktion dafür kenne ich nicht. Und hashes gibts erst ab bash 4.2 wenns mir recht ist. hat aber mit durchsuchen nix zu tun.
 
Wieso ohne Schleife? Da is nix umständlich dran, anders suchen gehts nich (binäres suchen ist sehr effizient), frag mich nich wies genau in bash geht ich kann nur einfachen Kram mit bash^^.
Was ich machen würde wäre in jede Zeile in der für chmod passenden Form rein zu schreiben, also:
chmod 755 /verzeichnis/datei , dann musste nur die Zeile chmod als parameter übergeben und du bist durch^^
 
Natürlich ist das umständlich, in Perl geht das mit einem einfachen einzeiler. Naja egal, werd schon ne passende Lösung finden.
 
hab grade mal auf die schnelle ein Script geschrieben was in den Grundzügen glaube ich das machen würde was du vorhast.
(Man ruft das Script mit verschiedenen Dateinamen bei denen die Rechte mit chmod geändert werde sollen...)

Da ist nur noch ein Fehler in dem RegEx in der Zweiten For-Schleife


Code:
#!/bin/bash
if [ 0 -eq $# ]; then
  exit 0;
fi

for file in $@; do
  for line in $(cat testfile | grep -e "$file[[:space:]]*$"); do 
    rights=$(echo $line | cut -d";" -f2);
  echo $rights;
    chmod -v "$rights" "$line";
  done
done

Das ganze kann man dann natürlich noch leicht so umbauen, das man als erstes Argument die Datei mit der Liste der Pfade und Rechte übergibt...
 
Zuletzt bearbeitet:
Zurück
Oben