2012-09-16 84 views
5

我正在尋找一些幫助與grep,或grep像工具。這包括但不限於grep,egrep,awk,sed或用於搜索匹配的其他工具。但是我將其餘的問題稱爲grep。快速grep/grep僅限行號?

我正在尋找快速的方式來grep匹配文件,我也在尋找最快的方式來grep文件的匹配,並只返回行號而不是匹配的其餘部分線。我不介意如果語法複雜,只要它的速度很快,我將在程序複雜性中使用它並不是問題。

我也需要這種方法來工作,如果我需要一個模式的正則表達式,所以我也可以搜索範圍。所以如果我需要搜索所有小於10的數字,如果命令默認支持它,或者如果它需要一些正則表達式,我只是尋找最快的方法,我可以找到。

謝謝。

編輯

我與處理的文件將是非常大的,我的測試文件是1.9GB

回答

5

我認爲KingsIndian與grep的-m選項的目標,但如果速度是你的主要目標,cut可能會快於awk這個特定的用法。嘗試:

grep -n -m 1 regex file | cut -d: -f1 

-d:參數告訴切使用冒號作爲分隔符場,而-f1參數,它告訴只輸出的第一場。

+0

這與其他的一樣工作,但平均運行幾百毫秒的速度要快一點。我猜如果我需要跳過幾個我會做grep -n -m 10正則表達式文件|尾-5 | cut -d:-f1 – WojonsTech

+0

使用剪切時,如何指定一個製表符作爲分隔符? – Bulrush

+0

默認情況下,cut使用tab作爲分隔符,所以只需刪除-d: – nullrevolution

3

停止後的首場比賽:

grep -n -m 1 str file | awk -F: '{print $1}' 

您可以更改參數值的m到一個不同的值,以停止許多比賽後。 awk部分只是爲了標明行號。

要5場比賽後停止:

grep -n -m 5 str file | awk -F: '{print $1}' 

編輯:
您可以使用tail了點。例如,要跳過第5場比賽,並打印下一個7:grep -n -m 12 str file| tail -7 | awk -F: '{print $1}'

+0

的-m是很酷你知道如果有辦法跳過前幾個結果,然後打印下一個5並退出。這是我在這個項目中需要的東西,但也只是爲了暫時輸出所有東西。 – WojonsTech

+1

@WojonsTech爲此編輯。 –

+0

這真的很酷,我從來沒有這樣想過。你知道在我們要求它做什麼的時候,有沒有比awk更快的速度,或者只是返回grep是否更快 - 而不是強制awk在結果集中循環。 – WojonsTech

1

我不知道這是否是快,但是這似乎工作:

nl -b a "<filename>" | grep "<phrase>" | awk '{ print $1 }' 
+0

這個工作,但我知道,而不是使用nl你可以用grep -n來得到輸出的行號。 – WojonsTech

1

你可以使用模式匹配GNU awk和簡單地打印出的行號:

awk '/regex/ { print NR }' file.txt 

假設值是空格分隔,你可以找到行號,如果行包含少於10個號碼:

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) print NR }' file.txt 

但是,這將打印每個小於10的數字的出現的行號。我相信您可能會發現這不合需要。因此,要刪除多個重複的行號的每場比賽,你可以使用數組:

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) array[NR]++ } END { for (i in array) print i }' file.txt 

如果需要排序輸出,管sort -n。如果您喜歡更優雅的解決方案(即無管道):

awk '{ for (i=1; i<=NF; i++) if ($i <= 10) array[NR]++ } END { for (j in array) sorted[k++]=j+0; n = asort(sorted); for (j=1; j<=n; j++) print sorted[j] }' file.txt 

編輯:

在任何最後三個awk命令的上面,簡單地改變if ($i <= 10)if ($i >= 11 && $i <= 20)顯示結果11到20以下。

+0

不是我正在尋找的東西,但似乎是使用awk解決問題的程序化方法 – WojonsTech

+0

@WojonsTech:請用_exactly_來更新您的問題想要做什麼。根據我的理解,你想搜索一些正則表達式並打印出行號和/或匹配行。也許我不清楚後者。在這個例子中試試:'awk'/ regex/{print NR,$ 0}'file.txt'。 HTH。 – Steve

+0

我也在尋找最少的系統hevery的方式來使用它。我已經看到人們使用grep並切割的東西,它的運行速度非常快,但不知道awk如何疊加起來,但我確實看到了它的工作原理,但是看起來是限制結果的最佳方式? – WojonsTech

1

我只是做了一些測試用nonforking SED電話,是不是幸運,而是以供參考的數字有1技嘉文本文件,在我的$模式是最後一行的一部分:

(擾流板: grep在此操作快5倍以上,AWK是最慢)

 
[email protected]:~$ ls -lh /dev/shm/test 
-rw-r--r-- 1 user user 979M Jul 8 09:50 /dev/shm/test 
 
[email protected]:~$ sed --version | head -n1 
GNU sed-Version 4.2.1 
[email protected]:~$ time sed -n "/$PATTERN/{=;q}" /dev/shm/test 
206558 

real 0m6.835s 
user 0m6.160s 
sys 0m0.648s 
 
[email protected]:~$ grep -V | head -n1 
grep (GNU grep) 2.14 
[email protected]:~$ time grep -n -m 1 "$PATTERN" /dev/shm/test | cut -d: -f1 
206558 

real 0m1.337s 
user 0m0.592s 
sys 0m0.736s 
 
[email protected]:~$ awk --version | head -n1 
GNU Awk 4.0.1 
[email protected]:~$ time awk "/$PATTERN/ { print NR }" /dev/shm/test 
206558 

real 0m7.176s 
user 0m6.356s 
sys 0m0.776s