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 egrep
dies 19
ausgeklammert 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, seq
was 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 1974
einfü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.