Я хочу, чтобы мой 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 очень трудны для меня так, я не уверен, как заставить его работать. Я попробовал (и всегда пробуйте), чтение решений других, но я думаю, что мне будет нужен в объясненный мне, если я когда-нибудь захочу учиться.
Если возможный я стараюсь избегать территории жемчуга. Я еще не могу обработать так много, хотя я понимаю то, чем это прославляется.
Что-либо еще необходимо знать для помощи мне, сообщенный мне.
Спасибо! (также, сначала отправляйте когда-либо здесь),
Этот awk
команда делает то, что Вы хотите. Во-первых, Вы устанавливаете разделитель записей на :
с FS=":"
, проверяете, ли третий элемент 1000-60000, и если так, элемент печати 1 (имя пользователя):
awk 'FS=":" {if ($3 > 999 && $3 < 60001) print $1}' < /etc/passwd
Другой 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
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
).
[]
, 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();
}
}
Процедура
userlist.java
Компиляция и выполнение с Вашим предпочтительным Java IDE. Если Вы предпочтете командную строку, сделайте
javac UserList.java && java UserList
, то Вывод появится в консоли Вашего Демонстрационного вывода 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]