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.


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"' 

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).


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.