2009-07-02 5 views
0

Ich möchte grep verwenden, um alle Header in einem Korpus zu finden, ich möchte alles bis zu finden: und alles danach ignorieren. Weiß jemand, wie man das macht? (Könnte ich eine komplette Codezeile bekommen)Grep Usage help

+0

Können Sie ein Beispiel für die Eingabe und die gewünschte Ausgabe angeben? –

+0

Die Eingabe ist eine Liste von Spam-E-Mails mit langen Headern und die Ausgabe ist eine Datei mit den Kopfzeilen bis zu: wie Cc: oder An: – kman99

+0

Will posten, was ich hatte, wenn ich zu den Cubes – kman99

Antwort

3

Verwenden Sie sed oder awk.

A sed Beispiel:

sed -e '/^[^:]*$/d' -e 's/\(.*\):.*/\1/' filename 
1

Wenn alles, was Sie tun möchten, ist der erste Teil der angepassten Linie angezeigt werden, dann können Sie sagen

grep your_pattern | cut -d: -f 1 

aber wenn Sie wollen nicht gegen Daten übereinstimmen Nach dem Doppelpunkt benötigen Sie ein anderes Werkzeug. Es gibt viele Werkzeuge zur Verfügung sed, awk, perl, python usw. Zum Beispiel würde der Perl-Code etwas so aussehen

perl -nle '($s) = split /:/; print $s if $s =~ /your_pattern/' 

oder die längere Skriptversion:

#!/usr/bin/perl 

use strict; 
use warnings; 

while (my $line = <>) { 
    my $substring = split /:/, $line; 
    if ($substring =~ /your_pattern/) { 
     print "$substring\n"; 
    } 
} 
1

(ich bin nicht sicher, ich verstehe Ihre Frage vollständig)

müssen Sie 'Grep' UND 'schneiden', eine Lösung (wenn auch weit von perfekt) wäre:

$ cat file | grep ':' | cut -f 1 -d ':'

0

sed -n '/^$/q;/:/{s/:.*/:/;p;}'

Dies stoppt, nachdem alle Header werden verarbeitet.

Edit: etwas verbesserte Version:

sed -n ‚/^$/q;/^ [^: \ t] {1,}:/{s /:.*/:/; p ;} '