抓取文件的某些内容


9

因此,我知道存在解决此问题的工具,因为我已经听说过它们,但我不知道它们是什么。

我想做类似过滤掉所有数据的事情,但是/ etc / passwd中的用户名。

例如,我想从以下文件中获取user1,user2和user3。在这种情况下,逻辑可以是“将文本限制为文件每一行的第一个':'。

user1:x:1:4
user2:x:2:5
user3:x:3:6

输出为:

user1
user2
user3

Answers:


19

cut正是出于这个目的而存在。该-d标志指定分隔符,并-f指定要输出的字段:

cut -d: -f1 /etc/passwd

参数to -f可以1,3显示第一个和第三个字段,或者1-3显示前三个。还有-band -c标志读取字节和字符而不是字段。如果您需要更灵活的东西,通常awk可以解决问题(请参阅Matthew的答案


13

每次您要从表格输入中提取数据时,都应考虑awk。它几乎可以在每个Unix系统上使用,因此有以下习惯:

awk -F':' '{print $1}' /etc/passwd 
  • -F':':定义“:”作为列定界符。
  • '{}':对每一行执行此指令。
  • print $1:将第一列打印到屏幕上。

3
随机注释:awk需要一个文件名,因此您可以跳过管道并直接执行awk -F: '{print $1}' /etc/passwd
Michael Mrozek

我似乎总是忘记了awk需要一个文件名,我似乎总是在管道中使用它...类似于sed | awk等...
马修·布兰尼根

几乎与文件工作的一切需要的文件名(trat是不几件事情几个例子)。
暂停,直到另行通知。

3

这是Perl的单行代码:

perl -F/:/ -lane 'print $F[0]' /etc/passwd

1

在perl和awk下面,有第三个工具用于sd:

sed 's/:.*//' FILE 

这是替代命令:从冒号:替代,后跟一个点,该点是百搭字符,用于任何数量(*)且不包含任何字符。

它是's(ubstitute)/ FROM / TO /',TO为空,这意味着“删除第一个冒号(因为sed默认为贪婪))(到行尾,因为sed在整个行中都可以正常工作)。

当然cut也是一个很好的命令,但我会说来自另一个家庭。


1

在您的示例中,所有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作为参数。)


cat仍然没有用:colrm 6 < FILE
manatwork 2012年

是的,是的,但不是没有用,就像在call中那样cat foo | grep bar
用户未知

1

仅出于完整性考虑,不需要外部命令,shell(Bourne shell或兼容的shell)可以单独处理它:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

当然,这可能是所有可能的解决方案中最慢的一种,因此对于大文件,请选择另一个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.