我有一个关于 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
这会将字段分隔符设置为 ,并在打印您确实需要的字段之前:
使用 , 丢弃不需要的变量。_