你好,
我们将非常感谢你在这个问题上的帮助。我对这个东西很陌生,我确实尝试过研究关于如何正确执行此操作,但到目前为止我还无法使其发挥作用。我有几个地图文件,我使用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
您的代码中有几个错误。我正在尝试用对你的代码的最小更改来修复它。
-
grep-q将提供结果是否可用或不类似0或1,因此您可以直接在上使用它们。但是,如果您将输出管道连接到awk,则它将只使用0/1作为输入,而不是整行。
-
没有选项的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