Проверьте, находится ли конкретная строка в файле bash - PullRequest
1 голос
/ 05 декабря 2010

Я хочу написать скрипт для проверки на дубликаты Например: у меня есть текстовый файл с информацией в формате / 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 ]

4 голосов
/ 05 декабря 2010

вместо того, чтобы заново изобретать колесо, используйте следующие инструменты:

  • cut для извлечения первого поля
  • sort и uniq для сохранения только дублированных строк.

    cut -d : -f 1 | sort | uniq -d | while read i ; do
                                       echo "error: duplicate user $i"
                                     done
    
1 голос
/ 05 декабря 2010

Звучит как работа для 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 
0 голосов
/ 05 декабря 2010

Perl-предложение:

perl -F: -lanE 'push @{$h{$F[0]}},$_; END{for $k (keys %h){if(@{$h{$k}}>1){say "Error";say for @{$h{$k}}}}}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...