使用 grep 搜索文件

使用 grep 搜索文件

回复: grep 命令。

我必须在一个文件中搜索学校 Linux 系统中所有学生的姓名。我能够做到这一点并返回大约 665 个名字。 (文件的第一个字符串/etc/passwd)。

从那里开始,我需要对名字以“o”结尾的学生以及名字中包含两个或多个“o”的学生进行排序。

这实际上不是给我的——这确实是作业,而是给朋友的。

我已经过了做家庭作业的年龄了:)

他必须使用 grep 才能得到结果。

我已经很多年没有使用 grep 了,我玩了一会儿,但无法避免使用其他命令来实现这一点。我只是好奇社区中是否有人知道如何使用 grep 来做到这一点。

/etc/passwd对于文件中以字母 'o' 结尾的名称:

grep -Eo '^[a-zA-Z0-9._-]+' /etc/passwd | grep -Eo 'o$'

这可以工作,但不会显示整个名称,仅显示与文件中的请求匹配的单个匹配项的字母“o”。

没有把握 :

1)如何显示输出,即..全名? 2)如何搜索名字中含有多个“o”的名字?

例如,从/etc/passwd文件中......我想显示一个文件中以字母“o”结尾的所有用户的输出我想显示另一个文件中包含多个字母“o”的所有用户

答案1

我仍然不完全确定你想做什么,但这应该有帮助。

获取包含多个 的名称o

$ awk -F':' '$1~/.*o.*o/{print $1}' /etc/passwd
root
nobody
colord
foo

或者

cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*' 

或者,使用grep(在这种情况下这是愚蠢的)并sed删除尾随冒号:

grep -oP '^.*?:' /etc/passwd |grep '.*o.*o.*' | sed 's/://'

如果您确实需要单独使用grep,请尝试以下操作:

grep -oP '^.*?:' /etc/passwd |grep '.*o.*o.*' | grep -o '[^:]*'

获取包含多个o且以 结尾的名称o

awk -F':' '$1~/.*o.*o/{print $1}' /etc/passwd | grep 'o$'

或者

cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*' | grep 'o$'

纯 grep:

grep -oP '^.*?:' /etc/passwd |grep '.*o.*o.*' | grep -o '[^:]*' | grep 'o$'

将输出保存到不同的文件

cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*' > two_os.txt
cut -d':' -f 1 /etc/passwd | grep '.*o.*o.*' > last_o.txt

答案2

我认为他的意思是以“o”结尾或包含“oo”,

cut -d: -f1 /etc/passwd | grep -E "oo|o$" |sort

但如果我们必须使用 grep 而不是 grep -E

(cut -d: -f1 /etc/passwd | grep "oo"; cut -d: -f1 /etc/passwd | grep "o$" /tmp/names) |sort |uniq

在 Perl 中,

#!/bin/env perl
use strict;
use warnings;
open(my $fh,"< /etc/passwd") || die "cannot open passwd";
while(my $line=<$fh>) {
    my @cols = split(/:/,$line);
    if( $cols[0] =~ /oo/ || $cols[0] =~ /o$/ ) { print "$cols[0]\n"; }
}

相关内容