grep in C

Schnelle objektorientierte, kompilierende Programmiersprache.
Daniel200289
Beiträge: 20
Registriert: Mo Aug 11, 2014 12:17 pm

grep in C

Beitrag von Daniel200289 » Di Aug 12, 2014 12:32 pm

Hallo Leute,

ich hab eine weitere Frage zu einem Problem in C.

Folgendes möchte ich gerne umsetzten, weiß aber leider gar nicht wie ich ansetzten soll. Hat jemand Ideen oder Tipps für mich?

grep PATTERN [FILE] soll nach einem Muster innerhalb einer Datei suchen und den Inhalt der
betroffenen Zeilen, in denen ein Muster gefunden wurde untereinander auflisten (es muss nicht
Zeilenubergreifend nach Mustern gesucht werden):

/home/max/ $ grep include test.c
#include <stdio.h>
#include <stdlib.h\>
/home/max/ $

Zur weiteren Erklärung: Ich bin dabei, eine Shell zu programmieren, alles weitere wie die Eingabe etc. steht. In meinem Fall habe ich bei der Eingabe von grep include test.c den Eingabestring schon so weit unterteilt, dass ich include und test.c übernehme. Wie kann ich den grep Befehl am besten umsetzten?

Danke schonmal :)

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: grep in C

Beitrag von oenone » Di Aug 12, 2014 12:38 pm

Wenn FILE übergeben wird, öffne sie, ansonsten nimm stdin.

Dann zeilenweise die Datei auslesen und mit Suchfunktionen aus string.h mit dem PATTERN vergleichen. Wenn übereinstimmt -> Ausgabe, sonst nichts.

Woran hängt es denn?

Daniel200289
Beiträge: 20
Registriert: Mo Aug 11, 2014 12:17 pm

Re: grep in C

Beitrag von Daniel200289 » Di Aug 12, 2014 12:43 pm

Es hängt daran wie ich die Datei Zeilenweise auslese und mit dem Pattern vergleiche. Ich programmiere noch nicht so lange in C. Die Ausgabe bei Übereinstimmung ist dann kein Problem. Das verstehe ich soweit.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: grep in C

Beitrag von oenone » Di Aug 12, 2014 12:58 pm

Zum Lesen einer Zeile gibt es fgets. Dort findest du auch ein Anwendungsbeispiel. Von den oben verlinkten Suchfunktionen wäre wohl strstr für ein einfaches "enthält string XYZ" geeignet.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: grep in C

Beitrag von Xin » Mi Aug 13, 2014 9:29 am

Daniel200289 hat geschrieben:Es hängt daran wie ich die Datei Zeilenweise auslese und mit dem Pattern vergleiche.
Warum möchtest Du die Datei zeilenweise auslesen? Was wenn Dein Pattern "Hallo\n\n\nWelt" ist?

Stell Dir die Datei doch als eine Zeile vor in der Du ein Pattern suchst. Beim durchsuchen merkst Du Dir das letzte Newline und wenn Du es findest, suchst Du das nach dem Pattern folgende Newline. Den Text dazwischen gibst Du aus.

Grep erlaubt Regular-Expressions. Möchtest Du diese ebenfalls abbilden?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Daniel200289
Beiträge: 20
Registriert: Mo Aug 11, 2014 12:17 pm

Re: grep in C

Beitrag von Daniel200289 » Mi Aug 13, 2014 12:48 pm

Ich möchte folgendes Darstellen:

Nehmen wir an wir haben eine Datei beispieldatei mit folgendem Inhalt

fjabc
dasfd
sdgsf
abcj
kfk
fkabc

Dann soll meine Shell mit dem Befehl "grep abc beispieldatei" (grep "Pattern" "File") folgendes ausgeben:

1 fjabc
2 abcj
3 fkabc

Sprich jede Zeile, die das Pattern mindestens 1 mal beinhaltet wird aufgelistet.
Wer möchte, darf mit gerne ein bisschen Beispielcode angeben, hänge nach dem öffnen der Datei noch daran, die beiden Strings (sprich ich habe den Inhalt der Datei in einen String geschrieben), so zu vergleichen, dass ich die oben genannte Ausgabe bekomme. Im Moment bekomme ich nur mit strstr() hin, dass wenn das Pattern im String vorhanden ist, dass dies dann 1 zurück gibt.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: grep in C

Beitrag von Xin » Mi Aug 13, 2014 12:57 pm

Wie bist du an eine solche Aufgabe gekommen? ^^

Versuch doch erstmal Dir ein strstr() selbst zu schreiben. Das kannst Du dann nach belieben modifizieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Daniel200289
Beiträge: 20
Registriert: Mo Aug 11, 2014 12:17 pm

Re: grep in C

Beitrag von Daniel200289 » Mi Aug 13, 2014 2:07 pm

Uniaufgabe ;) die wollen direkt die kompliziertesten Sachen programmiert haben. Deswegen bin ich ja auch für jede Hilfe und jeden Tipp dankbar.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: grep in C

Beitrag von Xin » Mi Aug 13, 2014 3:09 pm

Daniel200289 hat geschrieben:Uniaufgabe ;) die wollen direkt die kompliziertesten Sachen programmiert haben. Deswegen bin ich ja auch für jede Hilfe und jeden Tipp dankbar.
Dachte ich mir. ^^

Wie gesagt... strstr() zu implementieren ist keine große Aufgabe.
Überlege Dir wie Du erkennst, dass eine Zeile beginnt, dann such Dein Pattern. Wenn Du den Beginn Deines Patterns gefunden hast, nimmst Du Buchstaben für Buchstaben hin - ist Dein Pattern zu Ende, hast Du eine Fundstelle - und Du weißt, wo Du den Zeilenanfang erkannt hast. Vom Zeilenanfang bis zur nächsten Zeile hinter dem Pattern gibst du alles aus.

So würde ich das machen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Daniel200289
Beiträge: 20
Registriert: Mo Aug 11, 2014 12:17 pm

Re: grep in C

Beitrag von Daniel200289 » Do Aug 14, 2014 2:12 pm

Okay soweit verstanden danke =)

Nur eins ist noch unklar: Beispiel:

Code: Alles auswählen

int main ()
{
  char str[] = "Dies ist ein 981 string";
  char *ptr; 
  
  ptr = strstr (str, "981");
  printf(ptr);

  return 0;
}
Hier wird ja explizit nach der Zahl 981 gesucht.

Nun möchte ich aber prüfen, ob Zahlen von 0 bis 1000 in dem String sind, und nicht nur die 981 Wie baue ich dies mit einer Schleife am Besten ein?

Also das ist so gemeint:

Als Beispiel nenne ich eine Variable int i = 1000. Nun soll mein Programm von 1000 herunterzählen, und in jedem Schritt prüfen, ob meine Zahl im String vorkommt. Dann soll die Schleife anhalten. Sprich was ich suche: Die höchste Zahl in einem String.

Ich werde nämlich einen String aus einer Datei lesen, deren Zeilen durchnummeriert sind. Ich möchte die Datei dann laden (Code schon fertig) und mit der Nummerierung automatisch fortfahren.

Also meine Datei lautet z.B.

1 hallo
2 hallo2
3 tschö

nun möchte ich die Datei laden und möchte, dass mein Programm automatisch eine 4 in die nächste Zeile schreibt. Dies soll halt maximal bis 1000 gehen.

Vielleicht fällt euch was ein =)

Antworten