所以我知道存在解决这个问题的工具,因为我听说过它们,但我不知道它们是什么。
我想做一些类似过滤掉 /etc/passwd 中除用户名之外的所有数据的操作。
例如,我想从以下文件中获取 user1、user2 和 user3。在这种情况下,逻辑可能是“抓取文件每一行上的第一个‘:’文本”。
user1:x:1:4
user2:x:2:5
user3:x:3:6
输出将是:
user1
user2
user3
答案1
cut
正是为了这个目的而存在。该-d
标志指定分隔符,并-f
指定要输出哪些字段:
cut -d: -f1 /etc/passwd
的参数-f
可以是1,3
显示第一个和第三个字段,或者1-3
显示前三个字段;还有-b
和-c
标志来读取字节和字符而不是字段。如果您需要更灵活的东西,通常awk
可以解决问题(请参阅马修的回答)
答案2
每次你想从表格输入中提取数据时,你应该考虑awk。它几乎在每个 Unix 系统上都可用,所以这是一个好习惯:
awk -F':' '{print $1}' /etc/passwd
-F':'
: 将“:”定义为列分隔符。'{}'
:对每一行执行该指令。print $1
:将第一列打印到屏幕上。
答案3
这是 Perl 一行代码:
perl -F/:/ -lane 'print $F[0]' /etc/passwd
答案4
在您的示例中,所有 3 个名称的长度相同。在这种情况下 - 这可能会发生,但对于 /etc/passwd 则不太可能 - 您也可以使用 colrm:
echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3
或者,当然
cat FILE | colrm 6
(一种罕见的情况useless use of cat
不适用,因为您无法手动传递一个 FILE 作为参数。)