У меня есть вопрос, похожий на другой на этом сайте, где человек должен был найти список всех пользователей, использующих grep или awk из / etc / passwd. Это сработало для меня, но я попытался перевести его, чтобы найти и перечислить домашние каталоги. Я уже знаю, что вы не можете сделать это в одну строку, поэтому я знаю, что я бы использовал конвейер. Я провел онлайн-исследование, но не могу понять, в чем проблема. Если я использую grep и сделаю что-то вроде следующего:
grep -oE '^[/*/]$' /etc/passwd
... это, вероятно, выдаст мне ошибку, или покажет мне файлы / bin / bash, а это не то, что мне нужно. Мне просто нужны имена пользователей и их домашние каталоги, перечисленные с помощью grep! Я также не уверен, будет ли * отображать другие косые черты в виде символов, так как некоторые домашние каталоги имеют больше, чем просто два / (косые черты).
источник
/etc/passwd
может или не может быть, где все пользователи. Учтите такжеgetent passwd
.Ответы:
Grep на самом деле не инструмент для анализа данных таким образом, grep больше подходит для сопоставления с образцом, а вы пытаетесь выполнить обработку текста. Вы хотели бы использовать awk.
awk
Команда-F":"
Устанавливает разделитель данных на:$7 == "/bin/false"
Проверяет, является ли 7-й столбец данных / bin / false{print "User: "$1 "Home Dir: "$6}'
Говорит распечатать первый и шестой столбцы в указанном формате./etc/passwd
Файл, который мы обрабатываемисточник
grep -oE '^[^:]+' /etc/passwd
это дает мне только пользователей, которые мне нужны, чтобы сделать что-то подобное или что-то подобное, чтобы иметь домашние каталоги с собойВы можете использовать
cut
для разделения файлов со столбцами по определенному разделителю:Или
-f1,6
для столбцов (полей) 1 и 6.источник
Как уже отмечали другие,
grep
это не лучший инструмент для этого. Если вы настаиваете на его использовании, и если выgrep
поддерживаете-o
(печатать только совпадающую часть строки) и-P
(используйте регулярные выражения, совместимые с Perl), вы можете сделать это:Обратите внимание, что это будет печатать всех пользователей, включая пользователей системы. Я показываю только 4 строки в качестве примера.
Это напечатает имя пользователя и домашние каталоги всех пользователей, но в отдельных строках. Затем вам нужно объединить каждую пару строк, чтобы собрать их вместе:
объяснение
Регулярное выражение состоит из двух частей, оно ищет
^[^:]+
OR (вот что|
значит).*:\K[^:]+(?=:[^:]+)
. Первый ищет один или несколько не:
символов из начала строки. Это соответствует имени пользователя. Вторая часть ищет как можно больше символов до a:
(.*:
), а затем отбрасывает их (вот что\K
делает), чтобы они не печатались. Затем он соответствует строке non-, за:
которой следует:
и non-:
.(?=foo)
Конструкция называется положительным опережением и способ сопоставления символов после шаблона , не включая эти символы в самой игре.Команда
perl
заменит символы новой строки на:
и пробелы, если номер текущей строки$.
делится на 2. Итак, каждая вторая строка.источник
perl -naf: -e 'print $F[0]." : ".$F[5].$/'
поэтомуsed 'N;s/\n/ : /'
может быть лучшим партнеромgrep -oP
.Я считаю, что вы можете сделать это с помощью «cut», используя только один двоичный файл, избегая каналов, достигая тех же результатов, что и другие ответы, но более элегантным способом :), например так:
Если вы хотите, чтобы вывод был лучше отформатирован + в алфавитном порядке, вот, но компромисс заключается в том, что вы должны использовать больше двоичных файлов:
источник