Como executar o grep em uma única coluna?

33

Eu quero grep a saída do meu comando ls -l :

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Eu quero executar grep rahmu na coluna $ 3 apenas, então a saída do meu comando grep deve ficar assim:

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

Qual é a maneira mais simples de fazer isso? A resposta deve ser portátil em muitos Unices, preferencialmente com foco no Linux e no Solaris.

NB: Eu não estou procurando uma maneira de encontrar todos os arquivos pertencentes a um determinado usuário. Este exemplo foi dado apenas para tornar a minha pergunta mais clara.

    
por rahmu 15.02.2012 / 15:41

5 respostas

43

Mais uma vez awk salva o dia!

Aqui está uma maneira simples de fazer isso, com uma sintaxe relativamente simples:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

ou ainda mais simples: (obrigado a Peter.O nos comentários)

ls -l | awk '$3 == "rahmu"' 
    
por 15.02.2012 / 15:51
11

Se você deseja corresponder apenas parte da sequência em uma determinada coluna, use o conselho de link

some_command | awk '$6 ~ /string/'
    
por 01.06.2016 / 22:41
10

Se por coluna, você quer dizer coluna de tamanho fixo, você poderia:

ls -l | grep "^.\{15\}rahmu"

onde ^ significa o começo da linha, . significa qualquer caractere e \{15\} significa exatamente 15 ocorrências do caractere anterior (qualquer caractere neste caso).

    
por 15.02.2012 / 18:22
1

Para grep com base na coluna de nome de usuário único (e imprimir somente arquivos), você pode tentar:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

Para diretórios, altere - para d , para qualquer tipo, remova - .

Basicamente, ele seleciona cada coluna por \S\+\s\+ , que corresponde a caracteres não espaciais seguidos por caracteres de espaço, portanto, combinamos três primeiras colunas e, em seguida, o nome de usuário.

    
por 12.11.2015 / 14:55
1

Eu sei que estou atrasado para a festa, mas acredito que uma solução muito geral para esse problema é usar o awk com expressões regulares como:

awk '$3~/rahmu/{print}' input_file

A parte delimitada por '//' pode ser qualquer tipo de expressão regular.

    
por 15.09.2017 / 12:11

Tags