views:

81

answers:

6

I'm using grep to match string in a file, here is example file :

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

grep -i null myfile.txt returns

example two null,
example four null,

How can I return matched line + line number like this :

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

I know -c returns total matched lines but I don't how to format it properly to add total null count in front and I don't know how to add line number. Any help would be great

A: 

Use -n or --line-number.

Check out man grep for lots more options.

Andy Lester
+4  A: 

-n returns line number.

$ grep -in null myfile.txt

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

Combine with awk to print out the line number after the match:

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

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

Use command substitution to print out the total null count:

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

Total null count : 2
dogbane
@dogbane can I format this by adding line numbers after instead of before with :?
London
Sure, I have updated my answer.
dogbane
@dogbane your solution seems fine but get an error `awk95: syntax error at source line context is >>> ' <<< missing }awk95: bailing out at source line 1`
London
@dogbane sorry switched to linux now its working :) it was windows version not so good
London
A: 

use grep -n -i null myfile.txt to output the line number in front of each match.

I dont think grep has a switch to print the count of total lines matched, but you can just pipe grep's output into wc to accomplish that:

grep -n -i null myfile.txt | wc -l
WakiMiko
-c will print the total lines matched
dpatch
You are right. Unfortunately it also suppresses normal output.
WakiMiko
+2  A: 

grep find the lines and output the line numbers, but does not let you "program" other things. If you want to include arbitrary text and do other "programming", you can use 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

Or only using the shell(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"
ghostdog74
+3  A: 

Or use awk instead:

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

or in perl (for completeness...):

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