gpt4 book ai didi

bash - 减少 awk 遍数

转载 作者:行者123 更新时间:2023-11-29 09:17:26 25 4
gpt4 key购买 nike

我在 Teradata 数据库上工作,有一个空间检查脚本。脚本应该根据在脚本开始时定义的空间使用值将标志提升为 CRITICAL 或 WARNING。

我的示例 SQL 文件输出是 (DatabaseOutput.log) 文件,如下所示,该文件用作 awk block 的输入。

### Some multiline Database query, resulting in Database Space usage

*** Query completed. 11 rows found. 4 columns returned.
*** Total elapsed time was 11 seconds.

## Output of the query, I am interested in DatabaseName, Perc2, MaxPerm

DatabaseName Perc Perc2 MaxPerm
---------------------------------------------------- ---------------------- ------- -----------
AAA 9.21899768137583E-001 92.19 10102320
BBB 9.19923819717036E-001 91.99 524160
CCC 9.17517791271651E-001 91.75 1687440
DDD 9.15820363471060E-001 91.58 816720
EEE 9.09293748338489E-001 90.93 149760
FFF 9.07840905921109E-001 90.78 6934080
GGG 9.04946085680591E-001 90.49 7273440
HHH 8.54498111733230E-001 85.45 2538960
III 8.22783559253080E-001 82.28 7598400
JJJ 8.02181524253446E-001 80.22 8077680

+---------+---------+---------+---------+---------+---------+---+---------+-

要求的输出是

WARNING                           AAA     92.19  10102320
WARNING BBB 91.99 524160
WARNING CCC 91.75 1687440
WARNING DDD 91.58 816720
WARNING EEE 90.93 149760
WARNING FFF 90.78 6934080
WARNING GGG 90.49 7273440

我的工作 awk 代码需要三遍。它可以减少到一次 awk 吗?

工作 awk 代码:

cLvlCRIT=95
cLvlWARN=90

cat DatabaseOutput.log |
awk '/-------------------/,/^$/' | # captures output block; it excludes query, logon, logoff information and header line but keeps separator's line.
awk '{if (NR >= 2) {print}}' | # removes separator line, prints all lines from line 2 to EOF
awk -v lLvlCRIT=$cLvlCRIT -v lLvlWARN=$cLvlWARN ' {
if ( $1 != "StartCapture" && $3 >= lLvlCRIT ) {
printf("%11s%30s%10s%10s\n", "CRITICAL",$1,$3,$4)
}
if ( $1 != "StartCapture" && $3 >= lLvlWARN && $3 < lLvlCRIT ) {
printf("%11s%30s%10s%10s\n", "WARNING",$1,$3,$4)
}
} '

提前致谢!

最佳答案

您可以使用标志在 awk 中获取 block :

awk -v lLvlCRIT="$cLvlCRIT" -v lLvlWARN="$cLvlWARN" '
/^----------------------------------------------------/ {block=1; next}
/^$/ && block {exit} # if there is only one data block pattern - exit
# otherwise just reset block to 0 to find next block
block { your code on the block }'

因此要重现您的示例:

awk -v lLvlCRIT="$cLvlCRIT" -v lLvlWARN="$cLvlWARN" '
/^----------------------------------------------------/ {block=1; next}
/^$/ && block {exit}
block {if ( $3 >= lLvlCRIT )
printf("%11s%30s%10s%10s\n", "CRITICAL",$1,$3,$4)
else if ( $3 >= lLvlWARN )
printf("%11s%30s%10s%10s\n", "WARNING",$1,$3,$4) }' file
WARNING AAA 92.19 10102320
WARNING BBB 91.99 524160
WARNING CCC 91.75 1687440
WARNING DDD 91.58 816720
WARNING EEE 90.93 149760
WARNING FFF 90.78 6934080
WARNING GGG 90.49 7273440

关于bash - 减少 awk 遍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48064217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com