Piduna
Piduna

Reputation: 637

Does not work loop while in bash

I have logs in redmine, about users, that have connected from ip of my server. I can do this via command:

tail -n 100000 /usr/share/redmine/log/production.log | grep -A 3 "192.168.110.50" | grep "Current user" | awk '{print $3}' | head -n 1 | tail -n 1

I need to write this parameter in variable.

No problem:

temp=$(tail -n 100000 /usr/share/redmine/log/production.log | grep -A 3 "192.168.110.50" | grep "Current user" | awk '{print $3}' | head -n 1 | tail -n 1)

It works. But it can return user name anonymous. To return other user name i should write head -n 2. If it still anonymous, i can change in my formula to head -n 3.

So ... of course i can do this work

#!/bin/bash
temp=$(tail -n 100000 /usr/share/redmine/log/production.log | grep -A 3 "192.168.110.50" | grep "Current user" | awk '{print $3}' | head -n 1 | tail -n 1)

if [[ $temp == "anonymous" ]]; then
temp=$(tail -n 100000 /usr/share/redmine/log/production.log | grep -A 3 "192.168.110.50" | grep "Current user" | awk '{print $3}' | head -n 2 | tail -n 1)
fi

But it will work for one iteration. I tried to:

while [ $tmp != "anonymous" ]; do
temp=$(tail -n 100000 /usr/share/redmine/log/production.log | grep -A 3 "192.168.110.50" | grep "Current user" | awk '{print $3}' | head -n ((var=var+1)) | tail -n 1)
done

But of course it does not work. I can't understand just logically, how can i do this ? Can you help me ? Thanks for your attention.

Upvotes: 0

Views: 56

Answers (2)

Indent
Indent

Reputation: 4967

You can also use grep -v :

temp=$(tail -n 100000 /usr/share/redmine/log/production.log | grep -A 3 "192.168.110.50" | grep "Current user" | grep -v "anonymous" | awk '{print $3}' | head -n 1 )

Note you don't need final tail -n 1 after head -n 1

Upvotes: 0

Gordon Davisson
Gordon Davisson

Reputation: 125708

The immediate problem is that you're setting the variable temp, but checking tmp. You also need double-quotes around the variable in case it's blank, a wildcard, or something else troublesome.

But there's an easier way, because awk can handle most of the work by itself:

tail -n 100000 /usr/share/redmine/log/production.log |
    grep -A 3 "192.168.110.50" |
    awk '/Current user/ {if ($3 != "anonymous") {print $3; exit}}'

It'd actually be possible to have awk handle looking at the lines after "192.168.110.50" too, but that'd be a little more complicated. BTW, since I don't have any redmine logs (let alone yours) to test with, this has not been properly tested.

Upvotes: 2

Related Questions