How to get the line number of a match? How to get the line number of a match? bash bash

How to get the line number of a match?


To print the line number of your match, use the -n option of grep. Since the pattern contains some special characters, use -F to make them be interpreted as fixed strings and not a regular expression:

grep -Fn 'your_line' /etc/crontab

However, since you want to print some message together with the line number, you may want to use awk instead:

awk -v line='your_line' '$0 == line {print "this is the line number", NR, "from", FILENAME}' /etc/crontab

Test

$ cat a# /etc/crontab: system-wide crontab# Unlike any other crontab you don't have to run the `crontab'# command to install the new version when you edit this file# and files in /etc/cron.d. These files also have username fields,# that none of the other crontabs do.SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# m h dom mon dow user  command#0 17 * * * Me echo "end of work"0 8 * * * Me echo "start working please"1 3 2 4 2 Me ls -la

With awk:

$ awk -v line='0 8 * * * Me echo "start working please"' '$0 == line {print "this is the line number", NR, "from", FILENAME}' athis is the line number 13 from a

With grep:

$ grep -Fn '0 8 * * * Me echo "start working please"' a13:0 8 * * * Me echo "start working please"13:0 8 * * * Me echo "start working please"


grep --fixed-strings --line-number "${match}" | cut --delimiter=":" --fields=1


I finally did like this, found alone :

nbline=1        while read -r content        do                line=$content                if [ "${line:0:1}" != "#" ]; then #if this is not a comment                        line=$(echo -e "$line" | grep "$user") #$line keep only lines with the $user choose                        if [ ! -z "$line" ];then #if this is not a void $line                                minute=$(echo -e "$line" | awk '{print $1}') #0-59                                hour=$(echo -e "$line" | awk '{print $2}')   #0-23                                dom=$(echo -e "$line" | awk '{print $3}')    #1-31                                month=$(echo -e "$line" | awk '{print $4}')  #1-12                                dow=$(echo -e "$line" | awk '{print $5}')    #0-6 (0=Sunday)                                cmd=$(echo -e "$line" | awk '{$1=$2=$3=$4=$5=$6=""; print $0}')    #command                                cmd=$(echo -e "$cmd" | tr ' ' _) #replace space by '_' because it's annoying later                                str=$str' "'$nbline'" "'$minute'" "'$hour'" "'$dom'" "'$month'" "'$dow'" "'$user'" "'$cmd'" '                        fi                fi                nbline=$(($nbline+1))        done < /etc/crontab

I don't need to create an other file and get in $nbline the number of current line in loop. And count all line, even if they are void or commented. That's what I wanted.Gcron: a graphical preplanned task manager.

'#' is the line number of the right content in /etc/crontab.