Mailinglist Archive: opensuse-programming-de (97 mails)
| < Previous | Next > |
Re: grep shell script mit variablem Suchmuster
- From: David Haller <lists@xxxxxxxxxx>
- Date: Fri, 24 Jun 2005 16:09:23 +0200
- Message-id: <20050624140923.GA2867@xxxxxxxxxxxxxxxxxx>
Hallo,
Am Fri, 24 Jun 2005, Christof Janssen schrieb:
>ich möchte in einem text nacheinander verschiednen Jahreszahlen 1900,
>1901 etc suchen und die zahl der Einträge bestimmen.
>Für ein bestimmtes Muster (zB 1900) macht
>
> grep -c 1900 Text
>
>genau was ich möchte. Wie kann ich eine shellvariable, zB i = 1900,
>1901, ... 2000 in das Suchmuster für grep konvertieren, damit ich
>die Suche automatisieren kann ? oder gibt es bessere Mittel und Wege
>(möglichst auf shell basis) ?
perl -we '
while( defined( $_ = <> ) ) {
s/(19\d{2}|2000)/$m{$1}++/eg;
}
END{ foreach(sort keys %m) { print "$_: $m{$_}\n"; } }' DATEI
Das hat den Vorteil, dass die Datei nur einmal gelesen wird und somit
die langsame Startzeit gegenueber for i in ...; do grep -c "$i" DATEI
wohl mehr als wett macht. Ausserdem liest das auch von STDIN wenn
keine DATEI angegeben wird.
Das Muster legst du bequem ueber die Regexp zwischen den ersten beiden
// von s///eg fest. Siehe 'perldoc perlre'.
-dnh
--
Human beings were created by water to transport it uphill.
-- BSD fortune file
Am Fri, 24 Jun 2005, Christof Janssen schrieb:
>ich möchte in einem text nacheinander verschiednen Jahreszahlen 1900,
>1901 etc suchen und die zahl der Einträge bestimmen.
>Für ein bestimmtes Muster (zB 1900) macht
>
> grep -c 1900 Text
>
>genau was ich möchte. Wie kann ich eine shellvariable, zB i = 1900,
>1901, ... 2000 in das Suchmuster für grep konvertieren, damit ich
>die Suche automatisieren kann ? oder gibt es bessere Mittel und Wege
>(möglichst auf shell basis) ?
perl -we '
while( defined( $_ = <> ) ) {
s/(19\d{2}|2000)/$m{$1}++/eg;
}
END{ foreach(sort keys %m) { print "$_: $m{$_}\n"; } }' DATEI
Das hat den Vorteil, dass die Datei nur einmal gelesen wird und somit
die langsame Startzeit gegenueber for i in ...; do grep -c "$i" DATEI
wohl mehr als wett macht. Ausserdem liest das auch von STDIN wenn
keine DATEI angegeben wird.
Das Muster legst du bequem ueber die Regexp zwischen den ersten beiden
// von s///eg fest. Siehe 'perldoc perlre'.
-dnh
--
Human beings were created by water to transport it uphill.
-- BSD fortune file
| < Previous | Next > |