Como executar o grep em uma única coluna?

42

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

-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

Quero executar apenas grep rahmuna coluna $ 3, portanto, a saída do meu grepcomando 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 focando no Linux e Solaris.

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

rahmu
fonte
5
Observe que a análise da saída de lsé inerentemente frágil (pense no que acontece se um nome de usuário contiver espaço em branco - e sim, isso acontece em algumas plataformas). Use em findvez disso.
Gilles 'SO- stop be evil'
Isso não responde à pergunta do título, mas mencionarei que a --printfopção statpode ser útil em locais onde você pode considerar a análise ls. Mas geralmente findé o que você deseja (como o @Gilles mencionou).
Curinga

Respostas:

49

Mais uma vez awksalva o dia!

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

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

ou ainda mais simples: (Graças a Peter.O nos comentários)

ls -l | awk '$3 == "rahmu"' 
rahmu
fonte
9
Ou: ls -l | awk '$3=="rahmu"'... e, a propósito, a abertura (do suporte deve ser depois if...awk '{if($3 ...'
Peter.O
3
@ Peter.O +1 de mim. Seu comando é mais sucinto, correto, pois print é o padrão para uma correspondência awk.
BSD
Para evitar problemas de localização (formato de data afeta a ordem das colunas) é muitas vezes sugerido para garantir formato e linguagem standard:LANG=C ls -l | awk ...
fheub
11

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

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

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

jfg956
fonte
2

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.

PejoPhylo
fonte
1

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

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

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

Basicamente, seleciona cada coluna pela \S\+\s\+qual corresponde a caracteres que não são espaços, seguidos por caracteres de espaço, portanto, estamos combinando as três primeiras colunas e o nome de usuário.

kenorb
fonte