我必须获取用户输入的 UID,然后使用它来引用 /etc/passwd 目录并按名字对数据进行排序,并按顺序仅显示用户名、名字、姓氏。我遇到的问题是对输出进行排序。如果我使用类似的命令
cat /etc/passwd |grep $id_prefix | sort | cut -d: -f1,5
输出按用户名排序并按姓氏、名字顺序显示。我知道我可以将命令更改为类似的命令。
cat /etc/passwd |grep $id_prefix | sort | cut -d: -f5 | sed 's/\([^ ]*\)[ ][ ]*\([^ ]*\)/\2 \1/'
然后我将对输出进行排序并按照我想要的方式剪切,但它不会包含 FIELD1(用户名)。我该如何编写它才能正确显示我需要的所有字段并对它们进行排序?
答案1
你可以这样做:
awk -F: '{ print $1" "$5 }' /etc/passwd | sort -k2
/etc/passwd
这将从第二个字段中解析用户名和评论字段sort
,该字段将是用户的名字,前提是它们按名字和姓氏顺序列出。
这是合并的示例grep
:
grep "500\|501\|502" /etc/passwd | awk -F: '{ print $1" "$5 }' | sort -k2
jira Atlassian JIRA
dick Richard Jameson
bob Robert Gillespie
编辑:
使用它可以反转文件中姓氏、名字的顺序/etc/passwd
:
awk -F: '{ print $1" "$5 }' /etc/passwd | awk '{ print $1" "$3" "$2 }' | sort -k2
上面的示例修改了/etc/passwd
文件中的姓氏、名字:
grep "500\|501\|502" /etc/passwd | awk -F: '{ print $1" "$5 }' | awk '{ print $1" "$3" "$2 }' | sort -k2
如果没有也不应该有任何分隔名字/姓氏、姓氏/名字的逗号,则此方法有效。
编辑(第二个):
由于姓氏/名字以逗号分隔,因此应该有效:
awk -F: /$id_prefix/'{ print $1" "$5 }' /etc/passwd | awk -F, '{ print $1" "$2 }' | awk '{ print $1" "$3" "$2 }' | sort -k2
感谢@Jidder 建议不要从grep
to进行管道传输awk
。
答案2
你必须这样做:
grep mohsen /etc/passwd | awk -F':' {'split($5,a,",");printf "username is :%s ,uid is: %s , name is %s \n",$1,$3,a[1] '}
输出是:
username is :mohsen ,uid is: 1000 , name is Mohsen Pahlevanzadeh
答案3
我认为你可以摆脱这样的事情:
grep $id_prefix /etc/passwd | cut --delimiter: --fields=1,5 | sort --field-separator=: --key=2
如果您的上下文需要,您还可以添加--ignore-case
选项。sort
查看它的文档以获得更多选择。
答案4
不知道为什么人们将 grep 导入 awk 中。
你可以用 awk 来完成这一切。这假定名字和姓氏之间用空格分隔。
其中 USERNAME 是搜索词
awk -F: '/USERNAME/{split($5,a," ");print $1,a[2],a[1]}' etc/passwd