awk中不能直接用$var来引用shell的变量,昨天写的shell脚本,有一列是不正确的,导致最后一列>50那处数据不正确,悲催的语法。有空再把质量统计数据加入到支撑平台吧。
#app avg quality
echo "app avg quality:"
awk -F , '$5==" app=blog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=mblog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=album"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=video"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=profile"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=guestbook"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=discuss"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=request"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=setting"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
awk -F , '$5==" app=scomment"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500") {print$3}' $currentFilePath|awk -F = '{sum+=$2;j++};END{print sum/(j+1)}'
#app network quality >50
echo "app network quality >$normal"
awk -F , '{if($5==" app=blog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=mblog"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=album"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=video"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=profile"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=guestbook"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=discuss"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=request"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=setting"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath
awk -F , '{if($5==" app=scomment"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>$(normal)){j++}};END{print j+0}' $currentFilePath ;
#上面的$(normal)是不正确的,会导致数据计算出错。
awk在调用shell变量时,需要使用参数-v,修改后:
awk -v normal=$normal -F , '{if($5==" app=scomment"&&($7==" resultCode=200"||$7==" resultCode=404"||$7==" resultCode=500")&&substr($3,12)+0>normal){j++}};END{print j+0}' $currentFilePath ;
其中$normal、为shell中变量,可以看出,每调用一次变量都要加一个-v参数,后面使用shell变量的时候,就不用加$了,直接用normal就好了。
其中$currentFilePath不在awk语句中,所以不受影响。
ps:sed一般使用单引号,sed引用shell变量时使用双引号即可,因为双引号是弱转义,不会去除$的变量表示功能,而单引号为强转义,会把$作为一般符号表示,所以不会表示为变量。
分享到:
相关推荐
- **函数**:Shell允许定义和调用函数,提高代码复用性。 - **输入/输出重定向**:与Unix命令类似,Shell脚本也可以重定向输入和输出。 - **管道与进程控制**:通过管道连接多个命令,利用fork、exec、wait等命令...
3. 命令解释器:在 shell 脚本中调用 awk,将 awk 程序作为参数传递,增强了脚本的灵活性。 在实际使用中,awk 可以作为 shell 脚本的一部分,与其他 UNIX 工具如 sed、grep、sort 和 find 结合,构建出强大的文本...
- -v:定义变量,用于从shell中向awk脚本传递变量。 - -fprogfile:调用并执行指定的程序文件,该文件应符合awk语法。 awk内置变量包括: - ARGC:表示命令行参数的个数。 - ARGV:表示命令行参数数组。 - ARGIND:...
shell 是一个命令语言解释器,它拥有自己内建的 shell 命令集,shell 也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由 shell 先解释然后传给 Linux 核心。有一些命令,比如改变工作目录命令 cd,是...
在IT领域,尤其是在Linux系统管理中,Bash Shell、awk和sed是不可或缺的工具,它们在文本处理和自动化任务执行方面发挥着重要作用。本指南将深入解析这些工具的使用实例和精解,帮助读者理解并掌握这些强大的命令行...
在本场景中,shell脚本将作为主框架,用于调用awk和sed命令,并处理输入输出。 2. **Awk**:这是一个强大的文本分析工具,能够处理每一行的数据并根据模式进行操作。在JSON文件中,awk可以用来定位包含特定字段的行...
### 关于Shell中的sed与awk #### 一、引言 在Unix及类Unix系统(如Linux)中,`sed` 和 `awk` 是两个极其强大的文本处理工具,被广泛应用于脚本编写、数据处理以及各种自动化任务中。本文旨在深入探讨这两个工具的...
在Linux系统中,Shell脚本是进行自动化任务和系统管理的强大工具,而awk则是一种文本分析工具,常常被集成在Shell脚本中处理文本数据。本文将深入探讨awk的学习及其在Shell编程中的应用。 awk这个名字来源于它的...
- **字段分割**:AWK 自动将每行文本按照默认分隔符(通常是空格)进行分割,并存储在预定义的变量中(如 `$1`, `$2` 等)。 - **条件执行**:AWK 支持基于条件的代码块执行,例如只有当特定条件满足时才执行某些...
- **命令行调用**:最常用的方式是直接在命令行中调用 AWK,例如 `awk 'pattern {action}' filename`,其中 `pattern` 表示模式匹配条件,`action` 表示匹配成功后执行的动作。 - **脚本文件**:也可以将 AWK 程序...
1. 命令行调用:在命令行中直接输入 awk 命令,适用于简单的处理任务,或者在 shell script 中嵌入 awk 命令。 2. `-f` 选项调用:将 awk 程序编写到一个文件中,通过 `-f` 选项指定该文件,让 awk 解释器执行,适用...
AWK脚本可以嵌入到shell脚本中,与其他Unix工具配合使用,实现更复杂的任务。 **一.13 附录** 这部分可能包含更多关于AWK的参考资料、示例和常见问题解答。 通过深入学习这些章节,你可以掌握AWK的基本概念和高级...
在Shell脚本中,awk命令是一个强大的文本分析工具,它能根据指定的模式对文本进行处理。`print`是awk中最基本的操作之一,用于输出匹配到的行或者自定义的输出内容。本文将深入讲解shell中awk `print`的用法。 首先...
变量赋值用于在awk脚本中使用外部变量;“文件(s)”则指定了需要处理的一个或多个文件。 #### 二、awk命令详解 1. **模式匹配**: awk支持正则表达式来匹配特定的模式。例如: ```sh awk '/root/' test ``` 这...