首页 > 解决方案 > sed/grep - 显示第 1 列和第 5 列,删除第 5 列中的逗号并交换 Last-First,并在 /etc/passwd 中按姓氏字母顺序排序

问题描述

我的/etc/passwd文件需要一些 sed/grep 帮助。我的 /etc/passwd 文件中的输出示例是:

username1:x:5687:3794:Smith, Mike:/home/username1:/bin/bash

我的第一列是用户名,第五列是姓氏,第一列,它不是按字母顺序排列的。我需要显示第一列,然后在 First Name Last Name 中显示第五列,按姓氏的字母顺序排序。

我有 sed 命令来显示 First Name Last Name 中的第五列,按姓氏的字母顺序排序:

grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'

但简单地添加f1,5我的 cut 命令不会产生预期的输出,它会删除字母顺序,只是将第一列放在他们的名字之后,这不是我想要的。

我只能使用 sed 命令。我拥有和需要帮助的是

grep "$userid" /etc/passwd | cut -d: -f1,5 | sort | sed

我被困在这里,因为我对 sed 命令了解不多,userid 只是我从第一列脚本中的用户输入读取的变量。

所以一个示例输出将是:

username7    Abe Adams
username2    Jack Adams
username4    Ben Fab
username5    Jon Heat

标签: regexlinuxbashunixsed

解决方案


假设您想将多个用户与您搜索的“userid”匹配并且您希望它是一个字符串而不是正则表达式比较,这里是如何稳健地做到这一点:

$ awk -F':' -v userid='username' 'index($1,userid){n=split($5,names,/[ ,]+/); print $1, names[n], names[1]}' file |
    sort -k3
username1 Mike Smith

即使您的名字有两个以上的部分(例如 Billy Bob Thornton),我也正在使用 split() 以确保命令有效。


推荐阅读