Используя grep в/etc/passwd для выборки списка пользователей и пользователей системы, отличая обоих

Я хочу, чтобы мой grep распечатал список пользователей от/etc/passwd, и я изучил значения минимакса/etc/login.def для тех, я хочу, чтобы мой grep выбрал:

# Min/max values for automatic uid selection in useradd
#
UID_MIN          1000
UID_MAX         60000
# System accounts
#SYS_UID_MIN          100
#SYS_UID_MAX          999

Фактические идентификаторы пользователей запускаются в 1 000 и конец в 60 000, и идентификаторы пользователя системы запускаются в 100 и конец в 999.

Таким образом, я заставил свой сценарий быть похожим на это (предупреждение испанского текста):

2)
echo 
echo "LISTA DE USUARIOS"
cat /etc/passwd | grep -E "*:[*-6][0-9][0-9][0-9][0-9]:*" | cut -d":" -f1
echo
echo "LISTA DE USUARIOS DEL SISTEMA"
cat /etc/passwd | grep -E "*:[1-9][0-9][0-9]:*" | cut -d":" -f1 
;;

Это очевидно просто не, работа и grep очень трудны для меня так, я не уверен, как заставить его работать. Я попробовал (и всегда пробуйте), чтение решений других, но я думаю, что мне будет нужен в объясненный мне, если я когда-нибудь захочу учиться.

Если возможный я стараюсь избегать территории жемчуга. Я еще не могу обработать так много, хотя я понимаю то, чем это прославляется.

Что-либо еще необходимо знать для помощи мне, сообщенный мне.

Спасибо! (также, сначала отправляйте когда-либо здесь),

0
задан 25 August 2015 в 00:26

4 ответа

Этот awk команда делает то, что Вы хотите. Во-первых, Вы устанавливаете разделитель записей на : с FS=":", проверяете, ли третий элемент 1000-60000, и если так, элемент печати 1 (имя пользователя):

awk 'FS=":" {if ($3 > 999 && $3 < 60001) print $1}' < /etc/passwd
1
ответ дан 25 August 2015 в 10:26
  • 1
    Вы могли использовать ' diff' определить, является ли файл текстом или двоичным файлом и также добавляет проверку размера. –  16 November 2016 в 00:35

Другой awk версия, с массивами. Немного более длинный, но рабочий

awk -F':' ' $3 >= 1000 && $1 != "nobody" {i++;humanuser[i]=$1 } $3 < 999 { k++;sysuser[k]=$1} END {printf"****HUMAN USERS\n";for (j=1;j<=i;j++) printf humanuser[j]" "; printf "\n*****SYSTEM USERS\n"; for(m=1;m<=k;m++) printf sysuser[m]" "}' /etc/passwd

Демонстрационный вывод:

****HUMAN USERS
xieerqi testuser 
*****SYSTEM USERS
root daemon bin sys sync games man lp mail news uucp proxy www-data backup list irc gnats libuuid syslog messagebus usbmux dnsmasq avahi-autoipd kernoops rtkit saned whoopsie speech-dispatcher avahi lightdm colord hplip pulse gdm 
1
ответ дан 25 August 2015 в 10:26
  • 1
    Почему не cat "${files[$(($RANDOM % ${#files[@]}))]}" (принятие files isn' t пустой)? – David Foerster 16 November 2016 в 01:02

Можно использовать grep с Perl Совместимый RegEx (PCRE):

  • Для получения имен пользователей с UID >= 1000:

    grep -Po '^[^:]+(?=:[^:]+:\d{4,})' /etc/passwd
    
  • Для получения имен пользователей с 100 <= UID <= 999:

    grep -Po '^[^:]+(?=:[^:]+:\d{3})' /etc/passwd
    

Здесь -P указывает, что PCRE, -o указывает, что мы собираемся взять только подобранную часть.

  • ^[^:]+ получает нас имя пользователя, все до первого :

  • (?=) является нулевой шириной положительный предварительный шаблон, мы используем это, чтобы гарантировать, чтобы мы соответствовали нашей желаемой части после имени пользователя

  • :[^:]+: соответствия :x: и затем \d{4,} соответствия, которым четыре или больше цифры (>=1000)

  • , С другой стороны :[^:]+: соответствовали :x: затем \d{3} соответствия точно три цифры (100 to 999).

0
ответ дан 25 August 2015 в 10:26
  • 1
    @DavidFoerster на самом деле, в [], you' ре уже в арифметическом контексте, таким образом, это может быть далее сжато к: ${files[RANDOM % ${#files[@]}]} – muru 16 November 2016 в 03:23

DISCLAMER: следующий ответ Java в образовательных целях и забаве кодировать только. Если Вы downvote, объясните в комментариях почему.

Код

рев кода читает каждую строку от /etc/passwd, разделяет ту строку на строки с : как разделитель и пользователи видов в зависимости от их UID в соответствующий ArrayLists.

пакет com.askubuntu.users.serg;

импорт java.io. Файл; импорт java.io. FileNotFoundException; импорт java.io. IOException; импорт java.util. ArrayList; импорт java.util. Сканер;

/**
 * 
 * A program to sort human and system users from /etc/password
 * 
 * @author Serg Kolo
 *
 */
public class UserList {
    private static final String SEPARATOR = "=============";
    private static final int SYS_UID_MAX = 999;
    private static final int UID_MAX = 1000;
    private static final String FILENAME_PASSWD = "/etc/passwd";
    private static final String COLON = ":";
    private static final String NOBODY = "nobody";

    /**
     * 
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) {
        File f = new File(FILENAME_PASSWD);
        try (Scanner readFile = new Scanner(f)) {
            ArrayList<String> humanUsers = new ArrayList<>();
            ArrayList<String> systemUser = new ArrayList<>();

            while (readFile.hasNext()) {
                String[] field = readFile.nextLine().split(COLON);
                int uid = Integer.parseInt(field[2]);

                if (uid >= UID_MAX && (!NOBODY.equals(field[0]))) {
                    humanUsers.add(field[0]);
                } else if (uid <= SYS_UID_MAX) {
                    systemUser.add(field[0]);
                }
            }
            printUsers(humanUsers, "Human Users:");
            printUsers(systemUser, "System Users:");
        } catch (FileNotFoundException e) {
            System.err.println(e.getLocalizedMessage());
        }
    }

    /**
     * 
     * print users
     * 
     * @param users
     * @param header
     */
    private static void printUsers(ArrayList<String> users, String header) {
        System.out.println(header);
        System.out.println(SEPARATOR);
        System.out.println(users);
        System.out.println();
    }
}

Процедура

  1. Сохраняют код выше как userlist.java
  2. Компиляция и выполнение с Вашим предпочтительным Java IDE. Если Вы предпочтете командную строку, сделайте

    javac UserList.java && java UserList
    
  3. , то Вывод появится в консоли Вашего Демонстрационного вывода IDE

Human Users:
=============
[xieerqi, testuser]
System Users:
=============
[root, daemon, bin, sys, sync, games, man, lp, mail, news, uucp, proxy, www-data, backup, list, irc, gnats, libuuid, syslog, messagebus, usbmux, dnsmasq, avahi-autoipd, kernoops, rtkit, saned, whoopsie, speech-dispatcher, avahi, lightdm, colord, hplip, pulse, gdm, sshd]
0
ответ дан 25 August 2015 в 10:26
  • 1
    Спасибо @c-s-Cameron. Портативный диск теперь является не больше, чем бывшим внутренним диском компьютера, который имел двойную загрузку, таким образом, это имеет личинку. Я полагаю, что, если я поместил его снова в ноутбуке, это загрузится, поскольку это раньше делало. Но let' s предполагают, что я мог использовать восстановление начальной загрузки для портативного диска, я предполагаю, что то, что Вы предлагаете, - то, что я загружаюсь с существующим твердотельным диском (никакая личинка, поскольку это только имеет человечность), тогда я установил бы восстановление начальной загрузки и буду использовать его для восстановления начальной загрузки внешнего диска usb. Это может быть сделано, не влияя на начальную загрузку основного твердотельного диска?спасибо. – Javier 23 November 2016 в 11:15

Другие вопросы по тегам:

Похожие вопросы: