回复: 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"; }
}