如何反转已通过排序和剪切命令传送的输出

如何反转已通过排序和剪切命令传送的输出

我必须获取用户输入的 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 建议不要从grepto进行管道传输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

相关内容