Classificando saída com awk, e formatá-lo
Pergunta
Eu estou tentando formatar a saída de ls -la
a apenas contêm arquivos modificados em dezembro e saída-los muito bem, é isso que eles atualmente parecido:
ls -la | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5 Dec 4 20:15 folder/ Dec 4 19:51 ./ Dec 4 17:42 Folder\ John/ Dec 4 16:19 Homework\ MAT\ 08/ Dec 4 16:05 Folder\ Smith/
etc ..
Como posso criar algo como uma expressão regular para não incluir coisas como "./" e "../",
Além disso, como posso omitir a barra "\" para pastas que têm espaços entre eles. Eu gostaria de deixar cair a barra no final. Isso é possível através de um comando shell? Ou eu teria de usar Perl para fazer modificações para o teste? Eu quero a data e hora para permanecer como está. Qualquer ajuda seria muito apreciada!
A caixa tem linux e isto está sendo feito via SSH.
Editar:
Aqui está o que eu tenho até agora (graças a Mark e gbacon para isso)
ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5
Im apenas tendo problemas com a substituição de "\" com apenas um espaço "". Outras que Obrigado por toda a ajuda até este ponto!
Solução
Você pode usar find
para fazer a maioria do trabalho para você:
find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r
O diretório pai (..) não está incluído por padrão. O -mindepth 1
se livrar do diretório atual (.). Você pode remover o -maxdepth 1
para torná-lo recursivo, mas você deve mudar o %f
para %p
para incluir o caminho com o nome do arquivo.
Estes são os campos no -printf
:
- % Tb - nome do mês curto
- % Td - dia do mês
- % TM:% TM - horas e minutos
- % f - filename
No grep
Eu adicionei uma correspondência para o início da linha de modo que não irá corresponder a um arquivo chamado "Decimal" que foi modificado em novembro, por exemplo.
Outras dicas
Verifique e verifique se o comando 'ls' não é alias para outra coisa. Normalmente, ls "crus" não lhe dá o / para diretórios, nem deve ser escapar os espaços.
É evidente que algo está escapando os espaços para você para o seu awk estar imprimindo esses arquivos, desde awk tende a quebrar campo por espaços em branco, que é o que os \ personagens são para.
Spaces é nomes de arquivos são projetados especificamente para frustrar escrita fácil de script e tubos mashups como você está se tentando fazer aqui.
Você pode filtrar a saída de ls
:
ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5
Se você é conteúdo para usar Perl:
ls -la | perl -lane 's/\\ / /g;
print "@F[5..9]"
if $F[8] !~ m!^..?/?$! &&
$F[5] eq "Dec"'
Aqui está uma das suas respostas:
Como posso criar algo como uma expressão regular para não incluir coisas como "./" e "../",
Use ls -lA
vez de ls -la
.
Em vez de imprimir um número fixo de colunas, você pode imprimir tudo, desde a coluna 6 t o fim da linha:
ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } '
Eu não obter os espaços com barra invertida, então eu não sei por que você está recebendo isso. Para corrigi-lo, você pode adicionar o seguinte:
| sed 's/\\//g'
o que é com todos os greps e SEDS ???
ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }'
bem você pode soltar .
e ..
adicionando grep -v "\." | grep -v "\.\."
não tem certeza sobre o resto
Isso realmente me irrita ver pipelines com awk e grep / sed. Awk é uma ferramenta muito poderosa de processamento de linha.
ls -laF | awk '
/ \.\.?\/$/ {next}
/ Dec / {for (i=1; i<=5; i++) $i = ""; print}
' | sort -r | head -5