How can I format my grep output to show line numbe

2020-05-10 16:32发布

I'm using grep to match string in a file. Here is an 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 lines together with their line numbers 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 the line numbers.

What can I do?

8条回答
狗以群分
2楼-- · 2020-05-10 17:06

or in perl (for completeness...):

perl -npe 'chomp; /null/ and print "$_ - Line number : $.\n" and $i++;$_="";END{print "Total null count : $i\n"}'
查看更多
Evening l夕情丶
3楼-- · 2020-05-10 17:12

-n returns line number.

-i is for ignore-case. Only to be used if case matching is not necessary

$ 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
查看更多
The star\"
4楼-- · 2020-05-10 17:17

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
查看更多
太酷不给撩
5楼-- · 2020-05-10 17:17

Or use awk instead:

awk '/null/ { counter++; printf("%s%s%i\n",$0, " - Line number: ", NR)} END {print "Total null count: " counter}' file
查看更多
forever°为你锁心
6楼-- · 2020-05-10 17:23

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"
查看更多
放我归山
7楼-- · 2020-05-10 17:28

Use -n or --line-number.

Check out man grep for lots more options.

查看更多
登录 后发表回答