Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

grep

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
catweasel
Hacker
Hacker
Beiträge: 437
Registriert: 9. Nov 2006, 19:46

grep

Beitrag von catweasel » 1. Sep 2008, 11:36

Hi,

geht sowas mit nur einem "grep"?

Code: Alles auswählen

grep -A 1 'foo$' /pfad/datei | grep -q '^bar'

Werbung:
marce
Advanced Hacker
Advanced Hacker
Beiträge: 1147
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: grep

Beitrag von marce » 1. Sep 2008, 12:28

Verstehe ich richtig: Du möchtest alle

Code: Alles auswählen

foo
bar
finden?

Dann könntest Du den Zeilenumbruch als Steuerzeichen in den Teststring einbauen...

Benutzeravatar
framp
Moderator
Moderator
Beiträge: 4303
Registriert: 6. Jun 2004, 20:57
Wohnort: bei Stuttgart
Kontaktdaten:

Re: grep

Beitrag von framp » 1. Sep 2008, 12:58

Oder Du benutzt egrep

Code: Alles auswählen

egrep "foo$|^bar" datei

marce
Advanced Hacker
Advanced Hacker
Beiträge: 1147
Registriert: 19. Jun 2008, 13:16
Wohnort: Dettenhausen
Kontaktdaten:

Re: grep

Beitrag von marce » 1. Sep 2008, 13:02

das findet aber alle foo und bar, nicht die Kombination davon davon.

Benutzeravatar
framp
Moderator
Moderator
Beiträge: 4303
Registriert: 6. Jun 2004, 20:57
Wohnort: bei Stuttgart
Kontaktdaten:

Re: grep

Beitrag von framp » 1. Sep 2008, 13:22

Hast Recht :roll: .

Code: Alles auswählen

egrep "^bar.*foo$" datei
findet alle Zeilen die mit bar anfangen und mit foo enden. Allerdings tut das dann auch mit grep. egrep brauchst Du nur für das | im regulären Ausdruck.

catweasel
Hacker
Hacker
Beiträge: 437
Registriert: 9. Nov 2006, 19:46

Re: grep

Beitrag von catweasel » 1. Sep 2008, 13:31

ich suche aber ca. soetwas 'foo$\n^bar'

catweasel
Hacker
Hacker
Beiträge: 437
Registriert: 9. Nov 2006, 19:46

Re: grep

Beitrag von catweasel » 1. Sep 2008, 13:32

marce hat geschrieben:Verstehe ich richtig: Du möchtest alle

Code: Alles auswählen

foo
bar
finden?

Dann könntest Du den Zeilenumbruch als Steuerzeichen in den Teststring einbauen...
ja

Das mit dem Zeilenumbruch habe ich eben nicht hinbekommen.

Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Re: grep

Beitrag von regexer » 1. Sep 2008, 14:26

Vorschlag: sed

Code: Alles auswählen

sed -n '/foo$/{N;/foo\nbar/p}' /pfad/datei
... geht aber auch mit perl usw.


Übrigens: Die ürsprünglich vorgeschlagene grep-Kombination würde auch '^barxxxfoo$' finden...

Benutzeravatar
framp
Moderator
Moderator
Beiträge: 4303
Registriert: 6. Jun 2004, 20:57
Wohnort: bei Stuttgart
Kontaktdaten:

Re: grep

Beitrag von framp » 1. Sep 2008, 16:47

notoxp hat geschrieben:... Übrigens: Die ürsprünglich vorgeschlagene grep-Kombination würde auch '^barxxxfoo$' finden...
Jupp, denn ich hatte die Frage vom TE so verstanden, dass eine Zeile mit bar beginnt und mit foo endet, egal was zwischen drin steht. Aber nun ist klar was der TE will und Du hast eine gute Lösung angegeben :up:

catweasel
Hacker
Hacker
Beiträge: 437
Registriert: 9. Nov 2006, 19:46

Re: grep

Beitrag von catweasel » 1. Sep 2008, 16:52

notoxp hat geschrieben:Übrigens: Die ürsprünglich vorgeschlagene grep-Kombination würde auch '^barxxxfoo$' finden...
Es wurde von mir im übereifrigen Zusammenstutzen zuviel weggelassen; es sollte so ausssehen:

Code: Alles auswählen

grep -A 1 '^[ScreenSaver]$' /pfad/datei | grep '^Enabled=false$'

Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Re: grep

Beitrag von regexer » 1. Sep 2008, 18:35

catweasel hat geschrieben:

Code: Alles auswählen

grep -A 1 '^[ScreenSaver]$' /pfad/datei | grep '^Enabled=false$'
Achso, du willst eine Config-Datei parsen!
Naja, das würde ich wiederum mit perl machen. Wer sagt denn, dass die Enabled-Zeile immer 1 hinter dem Block-Bezeichner steht?

Code: Alles auswählen

perl -ne 'if (/^\s*\[([^]]+)\]/){
  $block=$1;
  next;
}
if(/=/){
  ($key,$value)=split/\s*=\s*/;
  print $value if ($block eq "ScreenSaver" and $key eq "Enabled");
}' /pfad/datei
... ungetestet.
Man kann das script natürlich auch in eine eigene Datei schreiben...

Oder aber ein fertiges perl-Modul benutzen: http://search.cpan.org/~sherzodr/Config ... /Simple.pm

catweasel
Hacker
Hacker
Beiträge: 437
Registriert: 9. Nov 2006, 19:46

Re: grep

Beitrag von catweasel » 1. Sep 2008, 20:58

notoxp hat geschrieben: Wer sagt denn, dass die Enabled-Zeile immer 1 hinter dem Block-Bezeichner steht?
Das ist mir inzwischen beim Stöbern in .kde auch eingefallen - gleich nach der Installation sah vieles noch anders aus.
Gut, dann werde Perl nehmen.

abgdf
Guru
Guru
Beiträge: 3195
Registriert: 13. Apr 2004, 21:15

Re: grep

Beitrag von abgdf » 1. Sep 2008, 22:36

Code: Alles auswählen

grep -P
soll auch in grep Perl-Regexps verstehen ...

catweasel
Hacker
Hacker
Beiträge: 437
Registriert: 9. Nov 2006, 19:46

Re: grep

Beitrag von catweasel » 2. Sep 2008, 00:20

abgdf hat geschrieben:

Code: Alles auswählen

grep -P
soll auch in grep Perl-Regexps verstehen ...
:schockiert: Grep -P is highly experimental :D


:ops: kleine Korrektur: Grep - P nicht Perl -P
Zuletzt geändert von catweasel am 2. Sep 2008, 08:39, insgesamt 1-mal geändert.

Benutzeravatar
regexer
Advanced Hacker
Advanced Hacker
Beiträge: 1005
Registriert: 3. Dez 2004, 09:29
Wohnort: $_

Re: grep

Beitrag von regexer » 2. Sep 2008, 08:08

abgdf hat geschrieben:

Code: Alles auswählen

grep -P
soll auch in grep Perl-Regexps verstehen ...
Nützt in diesem Fall wenig, da die RegEx auch zeilenweise angewendet wird...

catweasel
Hacker
Hacker
Beiträge: 437
Registriert: 9. Nov 2006, 19:46

Re: grep

Beitrag von catweasel » 11. Sep 2008, 11:20

notoxp hat geschrieben:Oder aber ein fertiges perl-Modul benutzen: http://search.cpan.org/~sherzodr/Config ... /Simple.pm

Code: Alles auswählen

#! /usr/bin/perl -w
use strict;
use Config::Simple;

my $file='/home/vv/.kde/share/config/kickerrc';

my $cfg = new Config::Simple();
$cfg->read($file) or die $cfg->error();
my %Config = $cfg -> vars();
print $_, "\n" foreach keys %Config;
Hier bekomme ich diese Fehlermeldung:

Code: Alles auswählen

vv@linux-aais:~> ./config.pl
Something went wrong. No supported configuration file syntax found at /usr/lib/perl5/site_perl/5.10.0/Config/Simple.pm line 184, <FH> line 58.
Wenn ich es so schreibe,

Code: Alles auswählen

#! /usr/bin/perl -w
use strict;
use Config::Simple;

my $file='/home/vv/.kde/share/config/kickerrc';

my $cfg = new Config::Simple();
open(FH, $file);
printf("This file uses '%s' syntax\n", $cfg->guess_syntax(\*FH));
bekomme ich:

Code: Alles auswählen

This file uses 'ini' syntax
leider weiss ich nicht, wie mir das weiterhilft.

Antworten