如何使用该cut
命令从文件中提取用户名和登录 shell 列表/etc/passwd
,其中生成的用户名和登录 shell 由单个空格分隔?
使用登录 shell 作为主键,使用用户名作为辅助键,按字母升序对结果列表进行排序。将结果存储在新创建的文件中~/usershells.txt
。
这是我尝试的命令:
cut -d /etc/passwd -k7 -k1 | sort > ~/usershells.txt
答案1
cut -f 1,7 -d: /etc/passwd | tr ":" " " | sort -k 2,2d -k 1,1d
这将使用字典排序将字段 2 作为主键进行排序,将字段 1 作为辅助键进行排序。
如果您想切换列,只需使用 awk:
cut -f 1,7 -d: /etc/passwd | tr ":" " " | sort -k 2,2d -k 1,1d | awk '{print $2,$1}'
这建议使用 awk 来获取:
awk -F ":" '{print $7,$1}' /etc/passwd | sort -k 2,2d -k 1,1d
这不是使用 cut,但不确定使用 cut 的要求对您来说有多难。
如果您根本不想使用 awk,您仍然可以切换列顺序。
下面是一个使用 while 循环和 read 的示例:
cut -f 1,7 -d: /etc/passwd | tr ":" " " | sort -k 2,2d -k 1,1d | while read -r c1 c2;do echo "$c2 $c1";done
使用“剪切和粘贴”的另一种选择:
paste <(cut -f7 -d: /etc/passwd) <(cut -f1 -d: /etc/passwd) | sort -k 2,2d -k 1,1d
或者,如果单个空格是硬性要求:
paste -d " " <(cut -f7 -d: /etc/passwd) <(cut -f1 -d: /etc/passwd) | sort -k 2,2d -k 1,1d
只需使用 > ~/usershells.txt 将列出的任何选项重定向到文件
当然,您仍然可以使用剪切和粘贴来保持原始顺序并仍然在外壳上排序:
paste -d " " <(cut -f1 -d: /etc/passwd) <(cut -f7 -d: /etc/passwd) | sort -k 2,2d -k 1,1d > ~/usershells.txt
答案2
对于排序,您不必使用cut
,只需使用sort
with管道:
sort -t " " -k 7 /etc/password | sort -t " " -k 1
管道顺序确保登录 shell 将用作主键,用户名将用作辅助键。
-t " "
将用作space
分隔符。
要仅显示两列,请使用cut
(排序后):
sort -t " " -k 7 /etc/password | sort -t " " -k 1 | cut -f 1,7 -d:
最后您可以将输出保存在文件中usershells.txt
:
sort -t " " -k 7 /etc/password | sort -t " " -k 1 | cut -f 1,7 -d: > ~/usershells.txt
如果您的默认分隔符是:
您可以tr
使用丹尼_l提到:
tr ":" " " /etc/password | sort -t " " -k 7| sort -t " " -k 1 | cut -f 1,7 -d: > ~/usershells.txt
答案3
参数 f 允许您选择字段,d 设置分隔符是什么
cut -f 1,7 -d: /etc/passwd
答案4
cut -f 1,7 -d: /etc/passwd | tr ":" " " | sort > ~/usershells.txt