Usando o grep para procurar um arquivo

1

Re: comando grep.

Eu tenho que pesquisar um arquivo para os nomes de todos os alunos no sistema Linux da escola. Eu sou capaz de fazer isso e retornar cerca de 665 nomes. (Primeira string do arquivo /etc/passwd ).

De lá, preciso classificar os alunos cujo nome termina em "o" e também aqueles que têm dois ou mais "o" em seu nome.

Isto não é realmente para mim - é dever de casa, mas para um amigo.

Eu já passei da idade do dever de casa:)

Ele tem que usar o grep para obter os resultados.

Eu não tenho usado grep há anos, eu joguei um pouco, mas não consigo evitar usar outros comandos para conseguir isso. Eu estava apenas curioso para ver se alguém na comunidade sabia como fazer isso usando o grep.

Para os nomes no arquivo /etc/passwd que terminam na letra 'o':

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

Isso funciona, mas não exibe o nome completo, apenas a letra 'o' para a única correspondência para a solicitação no arquivo.

Não tenho certeza:

1) como exibir a saída, ou seja, .. nome inteiro? 2) como procurar por esses nomes com mais de um 'o' em seu nome?

Do arquivo /etc/passwd por exemplo .... Quero exibir a saída de todos os usuários que terminam com a letra 'o' em um arquivo Quero exibir todos os usuários que contêm mais de uma letra 'o' em outro arquivo

    
por Anthon 14.10.2013 / 19:27

2 respostas

2

Ainda não tenho certeza do que você está tentando fazer, mas isso deve ajudar.

obtenha nomes que contenham mais de um o :

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

ou

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

Ou usando grep (que é bobagem nesse caso) e sed para remover os dois pontos:

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

Se você realmente precisa fazer isso usando grep sozinho, tente isto:

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

obtenha nomes que contenham mais de um o e termine em o :

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

ou

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

pure grep:

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

salva a saída em arquivos diferentes

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

Acho que ele significa terminar em 'o' OU conter "oo",

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

Mas, se precisarmos usar grep, em vez de grep -E ,

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

E em 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"; }
}
    
por 15.10.2013 / 06:27

Tags