Suche nach grep oder egrep Jahresbereichen von 1965-1996

Suche nach grep oder egrep Jahresbereichen von 1965-1996

Ich habe ein Grep, das für einige der Daten funktioniert, aber ich habe Probleme, mein Gehirn dazu zu bringen, es voll funktionsfähig zu machen.

grep 19[6-9][5-6]$ filename

Es erfasst einige richtig, aber ich versuche, alle Jahre zwischen 1965 und 1996 zu erfassen.

Hier ist die aktuelle Lösung, ich suche aber eigentlich nach einer einzeiligen Lösung, aber hier ist, was ich bisher bekommen habe:

grep 196[5-9]$ filename
grep 197[0-9]$ filename
grep 198[0-9]$ filename
grep 199[0-6]$ filename

Suchen Sie nach etwas Besserem und wenn möglich Kürzerem?

Antwort1

Datumsbereiche und reguläre Ausdrücke passen nicht wirklich gut zusammen. Wenn ich das $ in Ihrem Grep richtig interpretiere, ist das Datum das letzte Feld in einer Zeile.

Versuche dies:

awk '$NF >= 1965 && $NF <= 1996' filename

Wenn Sie grep verwenden müssen, wird es komplizierter:

grep -E '196[5-9]|19[78][0-9]|199[0-6]$' filename

Antwort2

Beachten Sie, dass egrepdies 19ausgeklammert werden kann, etwa so:

grep -E '19(6[5-9]|[78][0-9]|9[0-6])$' filename

was als klarer angesehen werden könnte.

Antwort3

Sie können auch Folgendes verwenden, seqwas ich viel lesbarer finde:

grep -E "$(seq -s "|" 1965 1996)" filename

-s, --separator=ZEICHENKETTE

Antwort4

Verwenden Sie die Standard grep-Syntax, um Zeilen zu extrahieren, die mit einer beliebigen Teilzeichenfolge im Bereich von 1965 bis 1996 enden (dies ist auchähnlichzum Versuch des Benutzers in der Frage):

grep -e '196[5-9]$' \
     -e '197[0-9]$' \
     -e '198[0-9]$' \
     -e '199[0-6]$'

Dadurch werden Zeilen extrahiert, die mit einer der Zahlen enden, an denen Sie interessiert sind. Beachten Sie, dass die Ausdrücke im Allgemeinen in Anführungszeichen gesetzt werden sollten.

Um die Übereinstimmung mit eg 231974(was mit übereinstimmt ) am Ende der Zeile zu vermeiden, können Sie am Anfang jeder Zahl im Muster Folgendes 1974einfügen :\<

grep -e '\<196[5-9]$' \
     -e '\<197[0-9]$' \
     -e '\<198[0-9]$' \
     -e '\<199[0-6]$'

Dadurch wird erzwungen, dass die Zahl ein Wort und nicht die Teilzeichenfolge eines anderen, längeren Wortes ist.

verwandte Informationen