Я пытаюсь использовать одну команду для сканирования /etc /passwd для поля gecos в формате «Пользователь (идентификатор пользователя) (Настоящее имя)», поэтому вывод будет «Пользователь Брайан - это Брайан». Я пытался в течение хорошего часа и не могу найти хорошее решение. Я уверен, что мне нужно использовать grep, но не могу найти хороший способ сделать это.
4 ответа
awk -F: '$1=="brian" {print "User", $1, "is", $8}' /etc/passwd
Оставьте $1=="brian"
если вы хотите напечатать каждую строку в файле.
awk -F: '{print "Пользователь", $ 1, "is", $ 5;}' /etc /passwd
Использование awk кажется лучшим выбором.
Согласно комментарию Паскаля, вам нужно использовать утилиту, такую как awk (или Perl, Python, Ruby и т.д.). Эта команда awk будет работать для файлов passwd с разделенными запятыми полями GECOS, в которых имя пользователя будет первым:
awk -F: '{split($5,a,","); print "User "$1" is "a[1]}' /etc/passwd
Ваш вопрос немного расплывчатый, но все ответы до сих пор решают проблему парсинга строки 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/'
Расширение сценария для принятия произвольного числа аргументов остается упражнением для читателя.