2012-01-06 89 views

回答

103

管道的魔力;

head -10 log.txt | grep <whatever> 
+4

你也可以將一個任意流管道到'head':'someCmd |頭-10' – 2015-05-30 08:19:39

+0

頭默認打印前10行到標準輸出,所以這對10行'head log.txt | grep​​' – Zlemini 2016-09-30 12:38:39

+0

當使用grep的'-l'選項時,有沒有辦法做到這一點?我想列出所有前5個字符都是'RIFFD'的文件。 – 2017-05-23 19:20:43

6

您有幾個選擇使用程序以及grep。在我看來,最簡單的就是使用head

head -n10 filename | grep ... 

head將輸出前10行(使用-n選項),然後就可以通過管道將輸出到grep

+2

我甚至沒有意識到,使用都在這裏解決方案'head'已經使用'-n 10' **(包括我) **沒有意識到**默認**的'head'只顯示*** 10行***。 :) – 2012-01-07 01:05:06

+0

噢_goodness_沒錯... – 2012-01-07 03:37:27

2

head -10 file輸出可以爲了做到這一點通過管道輸送到grep

head -10 file | grep … 

使用Perl:

perl -ne 'last if $. > 10; print if /pattern/' file 
2

您可以使用下面的行:

head -n 10 /path/to/file | grep [...] 
18

或者使用awk爲單個處理,而不|

awk '/your_regexp/ && NR < 11' INPUTFILE 

在每一行上,如果your_regexp比賽,以及記錄(行)的數目小於11,則執行默認動作(其被打印輸入線)。

或者使用sed

sed -n '/your_regexp/p;10q' INPUTFILE 

檢查你的正則表達式,並打印線(-n意味着不打印輸入,這是否則默認)和10日線後馬上退出。

+1

爲什麼不在十日退出? (見sed解決方案) – potong 2012-01-06 23:56:54

+0

'awk'{if(NR <= 10){if(index($ 0,「ab」)> 0){print $ 0; }} else {exit; }}'textfile' - 更快。 – 2012-01-07 03:07:40

+1

@potong你是對的,更正。 @srikanthradix雖然它可以更快,你的解決方案是不搜索正則表達式,但只適用於固定的字符串。 'awk'{if(NR <= 10){if($ 0〜「YOUR_REGEXP」){print}} else {exit; }}'textfile'。 – 2012-01-07 10:06:47

3
grep "pattern" <(head -n 10 filename) 
29

對於誰找到這在谷歌人,我需要搜索第一n線的多個文件,但只打印匹配的文件名。我用

gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames 

FNR..nextfile一旦看到10行就停止處理文件。 //..{}打印文件名並在給定文件中的第一個匹配出現時繼續。引述文件名的其他程序的好處,使用

gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames 
+3

我是那些在谷歌上找到這個人的人之一。謝謝!對我來說 – Floris 2013-12-17 15:06:33

+0

,這段代碼打印出文件的完整路徑。這正是我需要的。另外'FNR = 1'只會搜索第一行。謝謝! – 2017-10-12 05:25:00

1

的grep -A 10 <模式>

這就是抓住模式,該模式之後的下一個10行。這隻適用於已知模式,如果您沒有已知模式,請使用「頭部」建議。

+1

雖然它可能是正確的。添加更多問題描述以使答案更全面。 – 2014-09-18 08:37:47

0

head -10 log.txt | grep -A 2 -B 2 pattern_to_search

head -10 log.txt:讀取文件的前10行。

-A 2:在圖案之前打印兩行。

-B 2:在圖案後面打印兩行。

0

我有一個類似的問題,上述所有問題都沒有完全解決。我也有興趣獲取包含匹配行的文件名。 我的解決方案:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"' 

N.B:在我的情況下,模式總是匹配的第一行。

1

Joachim Isaksson的擴展答案:很多時候我需要一個長文件中間的東西,例如線5001 5020,在這種情況下,你可以用tail結合head

head -5020 file.txt | tail -20 | grep x 

這得到第5020行,則顯示只有那些在過去20,然後通過管道將一切的grep。

(編輯:在我的例子數柵欄柱誤差,增加管到grep)

相關問題