在if test中,列表只包含一个特定字符串或多个相同的特定字符串

时间:2016-01-28 04:22:46

标签: linux bash

我有一个列表文件

mike
jack
jack
mike

有时是(没有麦克风)

jack
jack

我想测试此文件是否只包含一个mike或多个mike,如下所示

if [list **only** contains one `mike` or multiple `mike`'s]
then
do something
else
echo jack(other's name) is using it
done

4 个答案:

答案 0 :(得分:1)

bash

中的解决方案

您可以使用while循环read来读取

while read line; 
do  
   [ $line == "mike" ] && ((count=$count+1)) 
done < inputFile

$count将在文件中包含mike的计数。

$ echo $count
2

awk

中的解决方案
$ awk '/mike/{count++}; END{print count}' input
2

答案 1 :(得分:1)

find_mike () { 
    mike_count=$(grep -c 'mike');
    if (( mike_count == 1 )); then
        printf 'I found only one mike.'
    elif (( mike_count > 1 )); then
        printf 'I found %d mikes.' "$mike_count"
    else
        printf '%s\n' "I have no idea where is mike";
    fi
}

使用示例:

$ find_mike < input_file.txt
I found 2 mikes

答案 2 :(得分:1)

[ "$(sort inputfile | uniq)" = mike ]

对输入进行排序,然后删除所有相同的行。您需要对uniq的输入进行排序,因为它仅适用于连续的相同行。

简短形式:

[ "$(sort --unique inputfile)" = mike ]

答案 3 :(得分:0)

grep -xvq mike inputfile
  • -x:匹配整行
  • -v:反转匹配
  • -q:不要打印任何东西;退出第一场比赛

一旦找到不是mike的内容,此命令就会以0退出。如果文件为空或仅包含(任意数量)mike行,则以1退出。

grep非常非常快。它会尽快解析输入文件。

您可能希望通过在命令前添加感叹号来反转退出值。