cas*_*ash 4 text-processing regular-expression csv columns
我有一个关于在 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
...
Run Code Online (Sandbox Code Playgroud)
什么是合适的命令/命令来仅从这一行打印出用户名、UID 号和 GID 号(如果可能,显示多种方式,以便我可以进一步探索)?
不需要“通配符”或正则表达式的一种方法是使用cut
. cut
可以处理文本文件中指定字符分隔的行,这/etc/passwd
恰好是。
cut -d: -f1,3,4 /etc/passwd
Run Code Online (Sandbox Code Playgroud)
输出将具有以冒号分隔的字段。看起来 GNUcut
有一个额外的选项,“--output-delimiter”,但你也可以使用tr
:
cut -d: -f1,3,4 /etc/passwd | tr ':' '\t'
Run Code Online (Sandbox Code Playgroud)
cut
像这样工作的选项:
-d:
- 使用冒号字符作为字段分隔符。默认为选项卡。-f1,3,4
- 输出字段编号 1、3 和 4。cut
使用 1 索引字段,从行的左侧开始。字段 2 将是“x”,即过去出现的加密密码。该awk
命令也可以工作:
awk -F : '{print $1, $3, $3}' /etc/passwd
Run Code Online (Sandbox Code Playgroud)
该-F :
选项告诉awk
使用冒号分隔字段。awk
将一行中的字段从左到右表示为 $1、$2、$3 ...。$0 包含整行,这通常是您要打印的内容,但这次不是。
sed
可以这样做:
sed 's/^\([^:]*\):\([^:]*\):\([^:]*\):\([^:]*\):..*/\1 \3 \4/' /etc/passwd
Run Code Online (Sandbox Code Playgroud)
在sed
命令中,我们终于得到了“通配符”,尽管在这种情况下它们看起来很丑陋。
我的建议是更喜欢cut
命令。该sed
示例表明,获得您想要的内容的正则表达式可能很丑陋,因此很难获得正确的结果。awk
可以做更多cut
,awk
因为默认情况下使用空格来分隔标记。这可以节省摆弄cut
字段分隔符规范的时间。