行の最後の行番号とヒットカウントを表示するようにgrep出力をフォーマットするにはどうすればよいですか?


378

ファイル内の文字列を照合するためにgrepを使用しています。以下はファイルの例です。

example one,
example two null,
example three,
example four null,

grep -i null myfile.txt 戻り値

example two null,
example four null,

次のように、一致した行とその行番号を返すにはどうすればよいですか。

  example two null, - Line number : 2
  example four null, - Line number : 4
  Total null count : 2

-cが一致した行の合計を返すことは知っていますがtotal null count、前に追加するように適切にフォーマットする方法や、行番号を追加する方法がわかりません。

私に何ができる?

回答:


600

-n 行番号を返します。

-i大文字小文字を区別しません。大文字と小文字を区別する必要がない場合にのみ使用します

$ grep -in null myfile.txt

2:example two null,
4:example four null,

と組み合わせてawk、一致後の行番号を出力します。

$ grep -in null myfile.txt | awk -F: '{print $2" - Line number : "$1}'

example two null, - Line number : 2
example four null, - Line number : 4

コマンド置換を使用して、合計nullカウントを出力します。

$ echo "Total null count :" $(grep -ic null myfile.txt)

Total null count : 2

:で前ではなく後に行番号を追加してこれをフォーマットできますか?
ロンドン、

あなたの解決策は問題ないように見えますが、エラーが発生しますawk95: syntax error at source line context is >>> ' <<< missing } awk95: bailing out at source line 1
London

申し訳ありませんが動作するようになりましたlinuxに切り替えました:) Windowsバージョンがそれほど良くなかった
London

1
... -niあなたはこのトリックをどうやって覚えているかと言う騎士たち
サンティアゴアリスティ

59

-nまたはを使用し--line-numberます。

man grepより多くのオプションをチェックしてください。


3
新しいLinuxユーザーはmanページを読むのが面倒です。しかし、十分にLinuxを使用していれば、慣れます:)非常に便利です:)
Dzung Nguyen

19
常に怠惰であるとは限りません(ただし、場合によっては)、新しいLinuxユーザーがmanページを理解するのに問題があることがよくあります。(彼らはできるようだ謎めい)
TecBrat

manページは多くのページをとることがあります。そして、これをすべて読むのは難しい
Eugen Konkov

7

grep -n -i null myfile.txt各一致の前の行番号を出力するために使用します。

grepには一致した行の総数を出力するスイッチがないと思いますが、grepの出力をwcにパイプするだけでそれを実現できます。

grep -n -i null myfile.txt | wc -l

3
-cは一致した行の合計を出力します
dpatchery

あなたが正しいです。残念ながら、これは通常の出力も抑制します。
jhenninger、

7

またはawk代わりに使用してください:

awk '/null/ { counter++; printf("%s%s%i\n",$0, " - Line number: ", NR)} END {print "Total null count: " counter}' file

4

grep行を見つけて行番号を出力しますが、他のものを「プログラム」することはできません。任意のテキストを含めて他の「プログラミング」を行う場合は、awkを使用できます。

$ awk '/null/{c++;print $0," - Line number: "NR}END{print "Total null count: "c}' file
example two null,  - Line number: 2
example four null,  - Line number: 4
Total null count: 2

または、シェル(bash / ksh)のみを使用する

c=0
while read -r line
do
  case "$line" in
   *null* )  (
    ((c++))
    echo "$line - Line number $c"
    ;;
  esac
done < "file"
echo "total count: $c"

3

またはperlで(完全を期すため...):

perl -npe 'chomp; /null/ and print "$_ - Line number : $.\n" and $i++;$_="";END{print "Total null count : $i\n"}'


1

私は将来あなたを助けるかもしれない何かを考えていました。複数の文字列を検索して行番号を出力し、出力を参照するには、次のように入力します。

egrep -ne 'null|three'

表示されます:

2:example two null,  
3:example three,  
4:example four null,   

egrep -ne 'null|three' | less

少ないセッションで出力を表示します

HTH Jun

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