在bash中不起作用循环

时间:2017-11-14 07:48:03

标签: linux bash shell while-loop do-while

我已登录redmine,关于用户,已从我的服务器的ip连接。我可以通过命令来执行此操作:

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

我需要在变量中写这个参数。

没问题:

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)

有效。但它可以返回用户名anonymous。要返回其他用户名,我应该写head -n 2。如果它仍为anonymous,我可以将公式更改为head -n 3

所以...当然我可以做这项工作

#!/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

但它适用于一次迭代。我试着:

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

但当然它不起作用。我逻辑上无法理解,我该怎么做?你能帮助我吗 ?谢谢你的关注。

2 个答案:

答案 0 :(得分:2)

当前的问题是,您要设置变量temp,但要检查tmp。如果变量是空白的,通配符或其他麻烦的话,你还需要在变量周围使用双引号。

但这是一种更简单的方法,因为awk可以自己处理大部分工作:

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}}'

实际上可以让awk处理" 192.168.110.50"之后的行。也是,但这有点复杂。顺便说一句,因为我没有任何redmine日志(更不用说你的日志)进行测试了,所以还没有经过适当的测试。

答案 1 :(得分:0)

您还可以使用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 )

请注意,tail -n 1

之后您不需要最终head -n 1