Я пытаюсь использовать одну команду для сканирования /etc /passwd для поля gecos в формате «Пользователь (идентификатор пользователя) (Настоящее имя)», поэтому вывод будет «Пользователь Брайан - это Брайан». Я пытался в течение хорошего часа и не могу найти хорошее решение. Я уверен, что мне нужно использовать grep, но не могу найти хороший способ сделать это.

4 ответа4

2
awk -F: '$1=="brian" {print "User", $1, "is", $8}' /etc/passwd

Оставьте $1=="brian" если вы хотите напечатать каждую строку в файле.

0

awk -F: '{print "Пользователь", $ 1, "is", $ 5;}' /etc /passwd

Использование awk кажется лучшим выбором.

0

Согласно комментарию Паскаля, вам нужно использовать утилиту, такую как awk (или Perl, Python, Ruby и т.д.). Эта команда awk будет работать для файлов passwd с разделенными запятыми полями GECOS, в которых имя пользователя будет первым:

awk -F: '{split($5,a,","); print "User "$1" is "a[1]}' /etc/passwd
0

Ваш вопрос немного расплывчатый, но все ответы до сих пор решают проблему парсинга строки passwd в ваш формат. Однако ваше предложение использовать grep заставляет меня думать, что вы заинтересованы также в выборе конкретной записи, а не в распечатывании строки для каждого пользователя в системе.

grep , безусловно, является одной из возможностей для этого, но я считаю, что команда getent является более чистым способом получения записей из файла passwd.

Поскольку существует множество решений на основе awk , я попытался выполнить синтаксический анализ с помощью sed вместо. Это просто для того, чтобы получить более красочный набор ответов, я бы не посчитал его лучше или проще для этой задачи.

#!/bin/bash
if [[ $# != 1 ]]; then
    echo "$0: wrong number of arguments"
    echo -n "Usage: "
    echo "$0 {username | UID}"
fi

getent passwd "$1" \
    | sed 's/\(.*\):.*:.*:.*:\(.*\):.*:.*$/User \1 is \2/'

Расширение сценария для принятия произвольного числа аргументов остается упражнением для читателя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .