Remove as primeiras 8 colunas da saída ls com AWK

1

Eu gostaria de usar o AWK para remover as 8 primeiras colunas da seguinte saída:


ls -l

lrwxrwxrwx 1 user user   23 jul 27 00:04 file1.pdf
-rw-rw-r-- 1 user user  107 may  8 13:59 file 2 with spaces.mp3
lrwxrwxrwx 1 user user   11 jul 24 19:43 file3-with-hyphens.txt
lrwxrwxrwx 1 user user   11 jul 24 19:43 and_another_file4_with_underscores.md
-rw-rw-r-- 1 user user  107 may  8 13:59 file 5 with way more spaces than the rest.mp3

e envie o resultado para um arquivo de texto. Eu posso fazer isso manualmente no vim com o visual block select, no entanto, eu preferiria ter um script para fazer isso automaticamente.

Olhando em volta, consegui encontrar esta página onde, alterando as partes relevantes do 9º exemplo e canalizar a saída para si mesma quantas vezes forem necessárias, consegui obter o resultado desejado, mas sinto que deve haver uma maneira melhor (mais elegante e / ou compacta) de fazê-lo, mas que não consegui encontre ou crie o meu próprio.

Meu código final é o seguinte:

awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 ~/file_folder_content.txt | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 | ... | awk '{for(i=1;i<=NF;i++)if(i!=x)f=f?f FS $i:$i;print f;f=""}' x=1 >> ~/file_folder_content.txt

Nota 1: Espero que a saída real do comando ls seja muito maior que isso.

Nota 2: Eu tentei imprimir o 9º campo, mas como alguns nomes de arquivos contêm espaços, isso só imprime a primeira palavra no nome do arquivo.

    
por Jesus DA 31.08.2018 / 04:33

2 respostas

1

Isso deve fazer o que você deseja em awk :

ls -l | awk '$9~/./{for (i=1;i<9;i++){$i=""}; gsub(/^ +/,""); print}'

Aqui está uma abordagem ligeiramente diferente em perl :

ls -l | perl -lane 'if ($F[7]=~/./) {s/.*$F[7]//; print}'

Observação: não posso deixar de recomendar que você pense bem sobre o que realmente deseja alcançar, pois pode haver maneiras melhores. Como mencionado por @confetti , apenas imprimir os nomes dos arquivos é mais fácil de ser feito com ls -1 .

Nota: Como corretamente apontado nos comentários, esta solução não é robusta. Gostaria de acrescentar que nenhuma análise de ls pode ser considerada segura e sadia.

Learning AWK: Como o OP explicou nos comentários que essa pergunta é parte de uma busca mais ampla para se tornar proficiente no AWK, tenho algumas recomendações.

por 31.08.2018 / 09:41
0

Isso parece um problema XY . ls -1 deve imprimir o que você deseja. Esta opção é exigida pelo POSIX, então é improvável que o seu ls não o suporte.

No entanto, se você estiver prestes a analisar o resultado, você não deve usar ls . Use find , de preferência com -print0 action.

Portanto, ls não é a ferramenta certa. Se você insistir em analisar a saída ls nua, então awk pode não ser a ferramenta certa também. Raciocínio:

  • Suas colunas são separadas por espaços; às vezes há dois ou três espaços consecutivos, isso difere de linha para linha. Portanto, com este separador ingênuo, um nome de arquivo em uma linha pode começar na enésima coluna, enquanto que em outra linha está em (N + 1) a coluna.
  • Você pode dizer a awk para tratar vários espaços como um separador ( awk -F ' +' ), mas isso gerará nomes de arquivos com muitos espaços consecutivos.
  • Então, você precisa de alguma lógica para identificar onde um nome de arquivo é iniciado em cada linha. Isso pode ser feito (eu acredito que awk é Turing completo), eu não posso te dar nenhuma solução de trabalho.

Mesmo a saída de ls -1 não deve ser analisada, ls -l é pior.

    
por 31.08.2018 / 09:42

Tags