基本上,我试图检查日志中是否有200个http响应,在最后3行中。但我得到了下面的错误。正因为如此,head命令是failing..Please帮助
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--帮助”以获取更多信息。
发布于 2018-01-22 00:15:22
使用$((...))执行算术。
for i in $((LINES)) $((LINES-1)) $((LINES-2))如果没有它,它将尝试运行以下命令:
head -18 http_access.log
head -18-1 http_access.log
head -18-2 http_access.log后两者都是错误。
编写for循环的一个更灵活的方法是使用C样式的语法:
for ((i = LINES - 2; i <= LINES; ++i)); do
...
done发布于 2018-01-22 00:30:29
您了解了JohnKugelman's answer的原因,我将只提出一个简化的代码,它可能适用于您:
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进行编号。对于较大的投入,这将稍微快一点:
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)https://stackoverflow.com/questions/48373070
复制相似问题