Else Condition in If Else Bash Script not Working



你好,

我们将非常感谢你在这个问题上的帮助。我对这个东西很陌生,我确实尝试过研究关于如何正确执行此操作,但到目前为止我还无法使其发挥作用。我有几个地图文件,我使用grep命令过滤这些文件来提取违规消息,如下所示:

grep "SoftBin 404" wmap*CP2
wmap_01_CP2:DISP_OB:    SoftBin 404 is 11 dice exceeded Bin Reject Control limit of 11 dice
wmap_03_CP2:DISP_OB:    SoftBin 404 is 11 dice exceeded Bin Reject Control limit of 11 dice
wmap_17_CP2:DISP_OB:    SoftBin 404 is 13 dice exceeded Bin Reject Control limit of 11 dice
grep "SoftBin 418" wmap*CP2
wmap_01_CP2:DISP_OB:    SoftBin 418 is 22 dice exceeded Bin Reject Control limit of 20 dice
wmap_02_CP2:DISP_OB:    SoftBin 418 is 32 dice exceeded Bin Reject Control limit of 20 dice
wmap_03_CP2:DISP_OB:    SoftBin 418 is 48 dice exceeded Bin Reject Control limit of 20 dice
wmap_04_CP2:DISP_OB:    SoftBin 418 is 43 dice exceeded Bin Reject Control limit of 20 dice

现在我只想过滤那些失败次数超过25的消息。我可以用awk:

grep "SoftBin 404" wmap*CP2 | awk '$5>25'

上面没有返回任何结果,因为映射的失败数量(第5列(只有11、11和13,小于25。

grep "SoftBin 418" wmap*CP2 | awk '$5>25'
wmap_02_CP2:DISP_OB:    SoftBin 418 is 32 dice exceeded Bin Reject Control limit of 20 dice
wmap_03_CP2:DISP_OB:    SoftBin 418 is 48 dice exceeded Bin Reject Control limit of 20 dice
wmap_04_CP2:DISP_OB:    SoftBin 418 is 43 dice exceeded Bin Reject Control limit of 20 dice

现在我想使用if-else语句将其放入bash脚本中,但我在获取其他部分工作。这是我的脚本:

more test.sh 
#! /bin/bash 
printf "n"
SB404=$(grep -q "Softbin 404" wmap*CP2 | awk '$5>25')
SB404_stat="$?"
if [ "$SB404_stat" -eq 0 ] ; then
echo "Softbin 404 for reprobe" ; grep "SoftBin 404" wmap*CP2 | awk '$5>25'
else
echo "No Softbin 404 for reprobe"
fi
printf "n"
SB418=$(grep -q "Softbin 418" wmap*CP2 | awk '$5>25')
SB418_stat="$?"
if [ "$SB418_stat" -eq 0 ] ; then
echo "Softbin 418 for reprobe" ; grep "SoftBin 418" wmap*CP2 | awk '$5>25'
else
echo "No Softbin 418 for reprobe"
fi
printf "n"

我在一个论坛上读到并应用了grep -q部分,但我不确定这是否足够,因为我还有awk部分,它将决定这行的最终结果。我知道我错过了什么或者我完全错了。这是我的输出:

./test.sh 
Softbin 404 for reprobe
Softbin 418 for reprobe
wmap_02_CP2:DISP_OB:    SoftBin 418 is 32 dice exceeded Bin Reject Control limit of 20 dice
wmap_03_CP2:DISP_OB:    SoftBin 418 is 48 dice exceeded Bin Reject Control limit of 20 dice
wmap_04_CP2:DISP_OB:    SoftBin 418 is 43 dice exceeded Bin Reject Control limit of 20 dice

抱歉,如果时间太长,我只想让我的问题尽可能清楚。提前感谢你能提供的所有帮助。再次感谢。

Mike

您的代码中有几个错误。我正在尝试用对你的代码的最小更改来修复它。

  1. grep-q将提供结果是否可用或不类似0或1,因此您可以直接在上使用它们。但是,如果您将输出管道连接到awk,则它将只使用0/1作为输入,而不是整行。

  2. 没有选项的grep i区分大小写。您搜索的是Softbin,而不是文件中可用的Softbin。

printf "n"
SB404_stat=$(grep "SoftBin 404" wmap*CP2 | awk '$5>25'| wc -l)
if [ $SB404_stat -ne 0 ] ; then
echo "Softbin 404 for reprobe" ; grep "SoftBin 404" wmap*CP2 | awk '$5>25'
else
echo "No Softbin 404 for reprobe"
fi
printf "n"
SB418_stat=$(grep "SoftBin 418" wmap*CP2 | awk '$5>25' | wc -l)
if [ $SB418_stat -ne 0 ] ; then
echo "Softbin 418 for reprobe" ; grep "SoftBin 418" wmap*CP2 | awk '$5>25'
else
echo "No Softbin 418 for reprobe"
fi
printf "n"

结果

No Softbin 404 for reprobe
Softbin 418 for reprobe
wmapaCP2: SoftBin 418 is 32 dice exceeded Bin Reject Control limit of 20 dice
wmapaCP2: SoftBin 418 is 48 dice exceeded Bin Reject Control limit of 20 dice
wmapaCP2: SoftBin 418 is 43 dice exceeded Bin Reject Control limit of 20 dice

您的代码使用:

SB404=$(grep -q "Softbin 404" wmap*CP2 | awk '$5>25')
SB404_stat="$?"
if [ "$SB404_stat" -eq 0 ] ; then
  • grep区分大小写(您搜索了"Softbin",但输入中只显示了"Softbin",因此不会产生输出
  • grep -q不产生输出,所以awk什么也看不到
  • $?是最近执行的程序(在本例中是管道中的最后一个程序-awk(的返回值,但是awk不会因为不满足条件而返回非零

你可以做一些类似的事情:

SB404=$(grep "SoftBin 404" wmap*CP2 | awk '$5>25{exit 1}'
SB404_stat="$?"
if [ "$SB404_stat" -eq 1 ]; then

然而,这是丑陋的。还有:

  • 您多次调用awk来做相同的事情
  • 您调用grep来做一些awk已经可以做的事情
  • awk也可以打印

script.awk

$2=="SoftBin" && $3==n && $5>25 {
if (!e++) printf "nSoftbin %s for reproben", n
print
}
END {
if (!e) printf "nNo Softbin %s for reproben", n
}

测试2.sh

#! /bin/bash
awk -f script.awk -v n=404 wmap*CP2
awk -f script.awk -v n=418 wmap*CP2
printf "n"

此代码仍然扫描wmap*CP2文件两次(但比原始文件的四次扫描要好(。根据文件的顺序和所需的输出,您可能只需要扫描一次。例如:

script2.awk

BEGIN {
split(n,t,",")
for (i in t) b[ t[i] ]++
}
$2=="SoftBin" && $3 in b && $5>25 {
if (!e[$3]++) printf "nSoftbin %s for reproben", $3
print
}
END {
for (i in b)
if (!e[i])
printf "nNo Softbin %s for reproben", i
printf "n"
}

测试3.sh

#!/bin/bash
awk -f script2.awk -v n=404,418 wmap*CP2

最新更新