grepを使用して行番号のみを報告する


105

不正なフォーマットが含まれている可能性のあるファイルがあります(この場合、パターンの発生\\backslash)。grepこれが発生した行番号のみを返すために使用したいと思います(一致がここにあったように、行#xに移動して修正します)。

ただし、grep -n一致または行自体ではなく、行番号()を出力する方法がないようです。

別の正規表現を使用して行番号を抽出できますが、grepだけでは行番号を抽出できないようにしたいと思います。grep -no最も近いと思いますが、それでもマッチは表示されます。


1
私にとって最も有用な答えは、質問でした:grep -no!これは私がやって来てやってみたことをしました!(つまり、縮小されたjavascriptソースファイルなどで、非常に長い行を印刷しないでください。)
LondonRob '12

回答:


155

試してください:

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

1
私のマシンでは、これが唯一...まだ非常に有用である(私は、ファイル内の3つの試合を持っている場合、それは一度だけ印刷された)行番号なしでマッチしたファイルを印刷している
マリオアワド

3
@MarioAwad、パラメーターを操作する必要が-fあります。私にとってはそうだった-f2。(これは古いものですが、貧しい人々の助けになると思います)
EmilSierżęga13年

素敵な古いUNIXアドホックシェルスクリプトに感謝します。これは、柔軟なツールが複雑さと学習曲線に見合う価値があることを示しています。
Alex

12
grep -n "text to find" file.ext | cut -f1,2 -d:ファイル名と行番号を表示します。
Jondlm、2014年

2
@jondimは、検索されているファイルが複数ある場合にのみファイル名を表示します。-Hファイルが1つしかない場合は、ファイル名を表示するように追加する必要があります。逆に、-hgrepするファイルの数に関係なく、常にを使用してファイル名を出力しないように指示できます。
マークリード

45

AWKを使用できる場合:

awk '/textstring/ {print FNR}' textfile

この場合、FNRは行番号です。AWKは、grep | cutを見ているとき、またはgrep出力を取得して操作するときはいつでも素晴らしいツールです。


2
1つのプロセス(以前は重要でしたが、それでも重要でした)を使用し、awk初心者にとって理解しやすいようにしています!
bgStack15 2016

NRこの場合のように、検査されているファイルが1つしかない場合にも機能します。
マークリード

単に素晴らしい!とても速いです!
GTodorov

34

これらすべての回答では、grepが一致する行全体を生成し、それを別のプログラムにパイプする必要があります。行が非常に長い場合は、sedだけを使用して行番号を出力する方が効率的です。

sed -n '/pattern/=' filename

2

バッシュバージョン

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

1
そして、複数の行がそのパターンに一致するとどうなりますか?
izabera 14

@izabera追加| テール-1
ディエゴ

1

と一致する行全体を取得してから、または別のツールを使用して出力からそれを削除するのではなく、行番号を取得するだけの場合は、sedとの回答をお勧めします。完全を期すために、Perlを使用することもできます。awkgrepcut

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

またはRuby:

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

0

最初のフィールドではなく、コロンの後に2番目のフィールドが必要になります。

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


これは、テキストを一致させたい場合に機能しますが、この場合、OPが要求していたのは行番号です。
AJP 2013年

0

パターンに一致する行の数を数えるには:

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

一致したパターンを抽出するには

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

パターンが一致した行番号を表示するには

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

2
1つ目は "grep -c 'Pattern' in_file.ext"だけです。2番目は「grep -o 'Pattern' in_file.ext」である必要があります。sedやwcを使用する必要はありません。
thelogix 2014年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.