B_runo
B_runo

Reputation: 159

Grep a pattern and ignore others

I have an output with this pattern :

Auxiliary excitation energy for root 3:       (variable value)

It appears a consequent number of time in the output, but I only want to grep the last one. I'm a beginner in bash so I didn't understand the "tail" fonction yet...

Here is what i wrote :

for nn in 0.00000001 0.4 1.0; do
for w in 0.0 0.001 0.01 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25 0.275 0.3 0.325 0.35 0.375 0.4 0.425 0.45 0.475 0.5; do
a=`grep ' Auxiliary excitation energy for root 3:       ' $nn"_"$w.out`
echo $w"        "${a:47:16}  >> data_$nn.dat
done
done

With $nn and $w parameters.

But with this grep I only have the first pattern. How to only get the last one?

data example :

line 1 Auxiliary excitation energy for root 3:     0.75588889  
line 2 Auxiliary excitation energy for root 3:     0.74981555
line 3 Auxiliary excitation energy for root 3:     0.74891111
line 4 Auxiliary excitation energy for root 3:     0.86745155

My command grep line 1, i would like to grep the last line which has my pattern : here line 4 with my example.

Upvotes: 0

Views: 90

Answers (1)

zerodiff
zerodiff

Reputation: 1700

To get the last match, you can use:

grep ... | tail -n 1

Where ... are your grep parameters. So your script would read (with a little cleanup):

for nn in 0.00000001 0.4 1.0; do
    for w in 0.0 0.001 0.01 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25 0.275 0.3 0.325 0.35 0.375 0.4 0.425 0.45 0.475 0.5; do
        a=$( grep ' Auxiliary excitation energy for root 3:       ' $nn"_"$w.out | tail -n 1 )
        echo $w"        "${a:47:16}  >> data_$nn.dat
    done
done

Upvotes: 2

Related Questions