У меня есть пример файла / etc / passwd, например:
tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash
Я пытаюсь перечислить всех пользователей с домашней папкой в /home/
.
я написал
cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
где e.txt - текст, который я скопировал здесь.
Я понимаю, что есть проблема с обратной косой чертой, которая является escape-символом, но как мне ее исправить, чтобы я мог перечислить их в одной строке команды?
cat
и направлять инструментам, подобнымawk
илиsed
подобным, поскольку им можно дать имя файла в качестве аргумента.grep home e.txt | cut -d ":" -f 1
. Поздравляем с вашей наградой UUOC. Однако это не очень хорошее решение. Что если существует служба «homebackups», которая работает под отдельным пользователем, названным в честь демона? Это ложный позитив.cat > tool
вариант таких командных строк, потому что это может улучшить ясность, поддерживая поток слева направо ввода-обработки-вывода трубной цепи. Это является менее эффективным, но почти всегда минимально так. Он также делает добавление прогресс бар , где отношение и полезно при работе в интерактивном режиме очень очевидно (просто заменитьcat
с ,pv
если он установлен).Ответы:
Вы можете избежать косой черты, как показано ниже:
Другой трюк будет использовать сложный разделитель полей:
-F'[:/]'
- относиться к обоим:
и/
быть разделителем полейисточник
Вы можете использовать кавычки вместо
/
регулярного выражения, чтобы избежать экранирования/
:Причём
awk
,{if (foo) ... }
часто можно упростить до всегоfoo {...}
.источник
Предполагая,
e.txt
что на самом деле/etc/passwd
, вы должны использоватьgetent passwd
вместо анализа файла, так как информация учетной записи пользователя может храниться в нескольких местах, указанных в/etc/nsswitch.conf
LDAP.Обратите внимание, что
print
утверждение подразумевается, когда условие выполняется. Это напечатает всю строку, хотя. Это напечатает только имя пользователя:источник
Альтернатива для тех из нас, кто просто не любит awk:
Объяснение:
grep -E
позволяет использовать несколько расширенных функций регулярных выражений([^:]*:)
соответствует одному столбцу, включая следующий разделитель ':'^([^:]*:){5}
соответствует первым пяти столбцам каждой строки^([^:]*:){5}/home/
соответствует каждой строке, где 6-й столбец начинается с '/ home /'cut -d: -f1
выбирает только первый столбец своего ввода, используя в:
качестве разделителя столбцовисточник
Вы также можете использовать
index
для сопоставления с фиксированной строкой, например,grep -F
и использовать возвращаемое значение, чтобы убедиться, что оно соответствует началу строкиили если требуется регулярное выражение, передайте его как переменную окружения
источник
Просто для разнообразия
объяснение
Вариация, если вы хотите быть разборчивым в том, где
/home/
находитсяисточник