首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shell脚本中的算术操作失败

Shell脚本中的算术操作失败
EN

Stack Overflow用户
提问于 2018-01-22 00:08:10
回答 2查看 209关注 0票数 1

基本上,我试图检查日志中是否有200个http响应,在最后3行中。但我得到了下面的错误。正因为如此,head命令是failing..Please帮助

代码语言:javascript
复制
    LINES=`cat http_access.log |wc -l`
    for i in  $LINES $LINES-1 $LINES-2

do
        echo "VALUE $i"
        head -$i http_access.log | tail -1 > holy.txt
        temp=`cat holy.txt| awk '{print $9}'`

        if [[ $temp == 200 ]]
        then
        echo "line $i has 200 code at "
        cat holy.txt | awk '{print $4}'
        fi
done

输出:

值18行有200个代码,位于[21/Jan/2018:15:34:23 值18-1 head:无效尾随选项--请尝试“head--帮助”以获取更多信息。

EN

回答 2

Stack Overflow用户

发布于 2018-01-22 00:15:22

使用$((...))执行算术。

代码语言:javascript
复制
for i in $((LINES)) $((LINES-1)) $((LINES-2))

如果没有它,它将尝试运行以下命令:

代码语言:javascript
复制
head -18 http_access.log
head -18-1 http_access.log
head -18-2 http_access.log

后两者都是错误。

编写for循环的一个更灵活的方法是使用C样式的语法:

代码语言:javascript
复制
for ((i = LINES - 2; i <= LINES; ++i)); do
    ...
done
票数 3
EN

Stack Overflow用户

发布于 2018-01-22 00:30:29

您了解了JohnKugelman's answer的原因,我将只提出一个简化的代码,它可能适用于您:

代码语言:javascript
复制
while read -ra fields; do
    [[ ${fields[9]} = 200 ]] && echo "Line ${fields[0]} has 200 code: ${fields[4]}"
done < <(cat -n http_access.log | tail -n 3 | tac)
  • cat -n:文件的数字行
  • tail -n 3:打印最后3行。您只需将这个号码改为更多行即可。
  • tac:以反向顺序打印tail输出的线条
  • read -ra fields:将字段读入数组$fields
  • ${fields[0]}:行号
  • ${fields[num_of_field]}:单个字段

您还可以使用wc而不是使用cat -n进行编号。对于较大的投入,这将稍微快一点:

代码语言:javascript
复制
lines=$(wc -l < http_access.log)
while read -ra fields; do
    [[ ${fields[8]} = 200 ]] && echo "Line $lines has 200 code: ${fields[3]}"
    ((lines--))
done < <(tail -n 3 http_access.log | tac)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48373070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档