如何消除重复结果?

时间:2015-03-17 19:07:21

标签: bash shell

我写了一个bash脚本来检查/ etc / fstab,fsck Option(最后一栏)

0 - 禁用

1 - 启用**

#!/bin/bash
for i in $(cat /etc/fstab | grep -v 'proc\|sda\|rootvg\|sysfs\|debugfs\|fd0\|.host\|nfshome:\|devpts' | awk '{print $6}') ; do
for n in $(cat /etc/fstab | grep -v 'proc\|sda\|rootvg\|sysfs\|debugfs\|fd0\|.host\|nfshome:\|devpts' | awk '{print $1}') ; do
if [[ "$i" != "0" ]] ; then
        echo "$n = FSCK check on NON-OS Filesystem ERROR !!!"
else
        echo "The Non OS Partiton FSCK Complted Successfully !!!"
fi
done
done

输出:

 /dev/repovg/lvol1 = FSCK check on NON-OS Filesystem ERROR !!!
/dev/appvg/appvol-os = FSCK check on NON-OS Filesystem ERROR !!!
/dev/TEST12/TEST12 = FSCK check on NON-OS Filesystem ERROR !!!
/dev/repovg/lvol1 = FSCK check on NON-OS Filesystem ERROR !!!
/dev/appvg/appvol-os = FSCK check on NON-OS Filesystem ERROR !!!
/dev/TEST12/TEST12 = FSCK check on NON-OS Filesystem ERROR !!!
/dev/repovg/lvol1 = FSCK check on NON-OS Filesystem ERROR !!!
/dev/appvg/appvol-os = FSCK check on NON-OS Filesystem ERROR !!!
/dev/TEST12/TEST12 = FSCK check on NON-OS Filesystem ERROR !!!

有什么方法可以消除重复值。

我可以尝试

  

sh + x script.sh |排序-u

但是,我在脚本本身可以做些什么吗?

4 个答案:

答案 0 :(得分:1)

你根本不应该使用嵌套循环。在awk中尝试这样的事情:

awk '!/proc|sda|rootvg|sysfs|debugfs|fd0|.host|nfshome:|devpts/ {
    if ($6 != 0) print $1, "= FSCK check on NON-OS Filesystem ERROR !!!"
    else print "The Non OS Partiton FSCK Complted Successfully !!!"
}' /etc/fstab

这将逐行读取/etc/fstab,跳过与正则表达式匹配的行(如grep中所示)。对于不匹配的行,它会检查第6列并根据值打印两条消息中的一条。

顺便说一句,.中的.host表示“任何字符”,因此如果它应该表示文字\.或考虑删除,则应该将其.转义为{{1}}它完全是。

答案 1 :(得分:0)

我认为你可以在排序

之后输入uniq

答案 2 :(得分:0)

如果您想要消除脚本中的所有重复项,您必须跟踪这些值并仅打印出您尚未打印的值。管道到"排序-u"应该足够好了。

答案 3 :(得分:0)

您将最后一列中的每个值与每个挂载点组合在一起,不仅会给您太多消息,还会给您错误消息。

gawk '($NF=="0"){ print $1 }' /etc/fstab

应该只打印最后一列中带有0的第一列条目,并将其放在那里(使用你已经拥有的grep),而不需要另一个循环。