查看 grep 或 egrep 年份範圍為 1965-1996

查看 grep 或 egrep 年份範圍為 1965-1996

我有一個 grep 適用於某些日期,但無法讓我的大腦充分發揮其功能。

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

它正確地捕獲了一些,但我希望捕獲 1965 年至 1996 年之間的所有年份。

這是目前的解決方案,但實際上是在尋找一行,但這是我迄今為止得到的:

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

如果可能的話,尋找更好、更短的?

答案1

日期範圍和正規表示式並不是很好的匹配。如果我正確解釋 grep 中的 $,則日期是一行中的最後一個欄位。

嘗試這個:

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

如果你必須使用 grep ,它會變得更加複雜:

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

答案2

您應該注意,egrep允許19將 分解出來,如下所示:

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

這可能被認為更清楚。

答案3

您也可以使用seq我發現更具可讀性的:

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

-s, --separator=字串

答案4

使用標準grep語法提取以 1965 到 1996 範圍內的任何子字串數字結尾的行(這也是相似的問題中使用者的嘗試):

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

這會提取以您感興趣的任何數字結尾的行。

為了避免在行尾匹配eg 231974(與)匹配,您可能需要在模式中每個數字的開頭插入:1974\<

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

這會強制數字成為一個單詞,而不是其他較長單字的子字串。

相關內容