regex - 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
解决方案
假设您想将多个用户与您搜索的“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() 以确保命令有效。
推荐阅读
- ruby-on-rails - 关联和视图限制的最佳做法是什么?
- javascript - Firebase 弹出式登录弹出窗口关闭用户错误
- github - 在 Github 中创建一个“发布”条目
- python - threading.Timer 如何在内部(低级线程)等待?
- python - 在python中的分区上滚动总和
- mysql - 查询 SQL Server 表的行之间的成对关系的重复结果
- python - K-means,计算我的质心的新位置
- django-rest-framework - DRF:如何在 get 方法中获取用户对象作为响应?
- angular - 如何以角度同时呈现与 app-router.module 链接的所有子组件
- kubernetes - 将节点加入集群并使用 kubeadm 配置文件配置集群