2011-08-05 41 views
79

我有一個可能包含錯誤格式的文件(在這種情況下,模式爲\\backslash)。我想使用grep只返回發生這種情況的行號(如在,匹配在這裏,到第#行並修復它)。使用grep僅回報行號

但是,似乎沒有辦法打印行號(grep -n),而不是匹配或行本身。

我可以使用另一個正則表達式來提取行號,但我想確保grep不能自己做。我認爲最接近grep -no,但仍然顯示比賽。

+0

對我來說,最有用的答案是問題:'grep -no'!這就是我來這裏嘗試做的! (即不打印有時非常長的行,例如縮小的javascript源文件。) – LondonRob

回答

113

試試這個:

grep -n "text to find" file.ext |cut -f1 -d: 
+1

在我的機器,這只是打印匹配的文件不帶行號(所以如果我是隻印一次在文件中,3場比賽),這是非常有用的還是...... –

+2

@MarioAwad,你應該操縱'-f '參數。對我來說,它是'-f2'。 (知道這是舊的東西,但我認爲它可以幫助一些可憐的靈魂) –

+0

感謝可愛的舊的unix adhoc shell腳本。這表明靈活的工具值得他們的複雜性和學習曲線! – Alex

32

如果你打開使用AWK:

awk '/textstring/ {print FNR}' textfile 

在這種情況下,FNR是行號。 AWK是一款非常棒的工具,當您查看grep |剪切,或任何時候您正在尋找grep輸出並操作它。

+1

使用一個過程(過去更重要,但仍然),並且很容易理解awk初學者! – bgStack15

+0

當只有一個文件被檢查時,'NR'也可以工作,就像這種情況一樣。 –

1

你會想要冒號後的第二個字段,而不是第一個字段。

grep -n "text to find" file.txt | cut -f2 -d:

+0

如果你想匹配文本,這種方法可行,但在行號是OP要求的情況下。 – AJP

19

所有這些問題的答案都需要grep來生成整個匹配線,然後通過管道到另一個程序。如果你的線路很長,它可能是更有效地使用剛剛sed的輸出行號:

sed -n '/pattern/=' filename 
2

猛砸版本

lineno=$(grep -n "pattern" filename) 
    lineno=${lineno%%:*} 
+1

如果多於一行匹配該模式會發生什麼情況? – izabera

+0

@izabera add | tail -1 – Diego

0

計算行數相匹配的模式:

grep -n "Pattern" in_file.ext | wc -l 

要提取匹配的模式

sed -n '/pattern/p' file.est 

要顯示其模式被匹配

grep -n "pattern" file.ext | cut -f1 -d: 
+2

1st應該是「grep -c」Pattern'in_file.ext「。第二個應該是「grep -o」Pattern'in_file.ext「。無需涉及sed或wc。 – thelogix

0

我建議用sedawk的答案對於剛剛起步的行號,而不是使用grep得到整個拼接線,然後取出從輸出線號與cut或其他工具。只使用grep的

ruby -ne 'puts $. if /pattern/' filename 
0

:爲了完整起見,你也可以使用Perl:

perl -nE '/pattern/ && say $.' filename 

或Ruby

grep -n "text to find" file.ext | grep -Po '^[^:]+'