打印/etc/passwd的一些字段

打印/etc/passwd的一些字段

我有一个关于 Linux 中通配符使用的问题。这里我有 /etc/passwd 文件中一长串行中的一些行。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
...

从这一行仅打印出用户名、UID 号和 GID 号的适当命令是什么(如果可能,请显示多种方法,以便我可以进一步探索)?

答案1

不需要“通配符”或正则表达式的一种方法是使用cut.cut可以处理文本文件中指定的字符分隔行,这/etc/passwd恰好是。

cut -d: -f1,3,4 /etc/passwd

输出将包含以冒号分隔的字段。看起来 GNUcut有一个额外的选项“--output-delimiter”,但你也可以使用tr

cut -d: -f1,3,4 /etc/passwd | tr ':' '\t'

cut像这样工作的选项:

  • -d:- 使用冒号字符作为字段分隔符。默认为选项卡。
  • -f1,3,4- 输出字段编号 1、3 和 4。cut使用 1 索引字段,从行的左侧开始。字段 2 是“x”,其中过去出现的是加密密码。

awk命令也可以工作:

awk -F : '{print $1, $3, $3}' /etc/passwd

-F :选项指示awk使用冒号分隔字段。awk指行中的字段从左到右为 $1、$2、$3 ...。 $0 保存整行,这通常是您想要打印的内容,但这次不是。

sed可以这样做:

sed 's/^\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):..*/\1 \3 \4/' /etc/passwd 

sed命令中,我们终于遇到了“通配符”,尽管在这种情况下它们看起来很难看。

我的建议是更喜欢cut命令。该sed示例表明,获得您想要的内容的正则表达式可能很丑陋,因此很难获得正确的结果。awk可以比 , 做更多的事情cut,因为awk默认情况下使用空格来分隔标记。与摆弄字段分隔符规范相比,这可以节省时间cut

答案2

使用read内置:

while IFS=: read -r user _ uid gid _; do printf "%s\t%s\t%s\n" "$user" "$uid" "$gid"; done </etc/passwd

这会将字段分隔符设置为 ,并在打印您确实需要的字段之前:使用 , 丢弃不需要的变量。_

相关内容