检查特定字符串是否在文件bash中

时间:2010-12-05 08:50:01

标签: bash search string full-text-search pattern-matching

我想编写一个脚本来检查重复项 例如:我有一个文本文件,其中包含格式为/ etc / passwd

的信息
alice:x:1008:555:William Williams:/home/bill:/bin/bash
bob:x:1018:588:Bobs Boos:/home/bob:/bin/bash
bob:x:1019:528:Robt Ross:/home/bob:/bin/bash
james:x:1012:518:Tilly James:/home/bob:/bin/bash

我想简单地检查是否有重复的用户,如果有,请将该行输出到标准错误。所以在上面的例子中,因为bob出现两次,我的输出只会产生类似的东西:

Error duplicate user
bob:x:1018:588:Bobs Boos:/home/bob:/bin/bash
bob:x:1019:528:Robt Ross:/home/bob:/bin/bash

现在我有一个while循环,它读取每一行,并使用以“:”分隔的awk -F将每条信息存储在一个变量中。存储我的用户名后,我不太确定最好的方法来检查它是否已经存在。

我的代码的某些部分:

while read line; do
        echo $line
        user=`echo $line | awk -F : '{print $1}'`
        match=`grep $user $1`($1 is the txtfile)
        if [ $? -ne 0 ]; then
                echo "Unique user"
        else
                echo "Not unique user"
                then somehow grep those lines and output it
        fi
done

匹配不会产生正确的结果
建议?

3 个答案:

答案 0 :(得分:4)

而不是重新发明轮子,使用以下工具:

  • cut提取第一个字段
  • sortuniq仅保留重复的行。

    cut -d : -f 1 | sort | uniq -d | while read i ; do
                                       echo "error: duplicate user $i"
                                     done
    

答案 1 :(得分:1)

听起来像awk给我的工作:

% awk -F':' '
/:/ {
    count[$1] += 1
}

END {
    for (user in count) {
        if (count[user] > 1) {
            print user " appears in the file " count[user] " times."
        }
    }
}
' /etc/passwd 

答案 2 :(得分:0)

Perl-proposal:

perl -F: -lanE 'push @{$h{$F[0]}},$_; END{for $k (keys %h){if(@{$h{$k}}>1){say "Error";say for @{$h{$k}}}}}' file