Eu quero grep a saída do meu ls -l
comando:
-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 rahmu
na coluna $ 3, portanto, a saída do meu grep
comando 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.
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 emfind
vez disso.--printf
opçãostat
pode ser útil em locais onde você pode considerar a análisels
. Mas geralmentefind
é o que você deseja (como o @Gilles mencionou).Respostas:
Mais uma vez
awk
salva o dia!Aqui está uma maneira direta de fazer isso, com uma sintaxe relativamente simples:
ou ainda mais simples: (Graças a Peter.O nos comentários)
fonte
ls -l | awk '$3=="rahmu"'
... e, a propósito, a abertura(
do suporte deve ser depoisif
...awk '{if($3 ...'
LANG=C ls -l | awk ...
Se você deseja corresponder apenas parte da string em uma determinada coluna, pode usar os conselhos de https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches
fonte
Se por coluna, você quer dizer coluna de tamanho fixo, você pode:
onde
^
significa o início da linha,.
significa qualquer caractere e\{15\}
significa exatamente 15 ocorrências do caractere anterior (qualquer caractere neste caso).fonte
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:
A parte delimitada por '//' pode ser qualquer tipo de expressão regular.
fonte
Para grep com base na coluna de nome de usuário único (e imprimir apenas arquivos), você pode tentar:
Para diretórios, mude
-
parad
, 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.fonte