AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1436828
Accepted
vladimir pavloski
vladimir pavloski
Asked: 2019-05-15 11:01:02 +0800 CST2019-05-15 11:01:02 +0800 CST 2019-05-15 11:01:02 +0800 CST

Como alinhar as colunas da saída do comando ls no Xubuntu 16.04.6?

  • 772

Eu tenho essa função em .bashrc:

{ ls -lhNGhgF --color=always --group-directories-first --time-style="+%d-%b-%Y $newline%H:%M" | awk '
            { 
            $3 ="\033[1;31m"        $3 "\033[0m";
            $4 ="\033[1;48;5;196m"  $4 "\033[0m"; 
            $5 ="\033[1;30m"        $5 "\033[0m"; 
            print; 
            }
      '
}

Funciona, mas as colunas da saída não estão alinhadas. Como posso consertar isso?

ubuntu bash-scripting
  • 1 1 respostas
  • 248 Views

1 respostas

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2019-05-15T13:51:39+08:002019-05-15T13:51:39+08:00

    Preâmbulo

    Este é um caso em que a análise da saída de lsé justificada. É errado usar lspara obter dados para programas . Aqui você deseja obter uma saída legível por humanos e torná-la mais legível para humanos . Isso é muito menos crítico; se algo der errado, você provavelmente notará imediatamente.

    As implementações de lspodem gerar uma saída ligeiramente diferente, mesmo que ofereçam suporte a todas as opções de que você precisa. Por esse motivo, qualquer solução para um problema desse tipo deve ser adaptada às necessidades de cada um ls.

    Só para constar: meu testbed é o Kubuntu 18.04.2 LTS.


    Código

    Use esta função:

    lsi() {
    
    local c3=$'\033[1;31m'
    local c4=$'\033[1;48;5;196m'
    local c5=$(printf '\033[1;30m')
    local c0=$'\033[0m'
    
    command ls -hGgF --color=always --group-directories-first --time-style="+%d-%b-%Y $newline%H:%M" "$@" \
    | sed -E "s|([^ ]+ +)([^ ]+ +)([^ ]+ +)([^ ]+)( +[^ ]+ +)|\1\2$c3\3$c0$c4\4$c0$c5\5$c0|"
    
    }
    

    Explicação:

    Primeiro, armazeno as strings de que precisamos como variáveis ​​locais. Estou usando $''uma sintaxe que funciona no Bash, exceto pela c5qual é (por motivos educacionais) recuperada da saída de printf. O ponto é que o método with printffuncionará mesmo em sh, portanto, se você precisar que essa função funcione em um shell que não entenda o Bash's $'', você saberá o caminho.

    Em seguida, estou usando sedexpressões regulares estendidas para pesquisar e substituir. Qualquer coluna, exceto a última, pode ser correspondida, [^ ]+ +o que significa "pelo menos um não-espaço e pelo menos um espaço". Na substituição, o que for correspondido pelo 1º conjunto de parênteses ( (…)) é referido como \1; pelo 2º set – como \2; e assim por diante. Dessa forma, posso combinar as cinco primeiras colunas e "substituí-las" por si mesmas usando \1\2\3\4\5. Esta única operação é sem operação, até que eu injete strings armazenadas anteriormente nos lugares certos:

     \1\2$c3\3$c0$c4\4$c0$c5\5$c0
         ^^^  ^^^^^^  ^^^^^^  ^^^ 
    

    Notas:

    • Você deve ter notado que as colunas 4 e 5 são correspondidas em ([^ ]+)( +[^ ]+ +)vez de universais ([^ ]+ +)repetidas duas vezes. Se fosse ([^ ]+ +)([^ ]+ +)então os caracteres de espaço entre essas colunas pertenceriam logicamente à 4ª, portanto seriam impressos em vermelho por causa da cor de fundo que você escolheu para a 4ª coluna. Incluí-los na 5ª coluna resolve o problema.

    • Não injeto nada entre a 1ª e a 2ª coluna, então poderia combinar ambas com um conjunto de parênteses (ou seja, ([^ ]+ +[^ ]+ +)) e a string de substituição ficaria assim: \1$c3\2$c0$c4\3$c0$c5\4$c0. Em seguida \1, referir-se-ia a duas colunas, \4referir-se-ia à 5ª. Decidi evitar confusão e manter esses números coerentes com a numeração natural das colunas.

    • command lsgarante que a função não execute uma função chamada ls, mesmo que haja uma definida. Isso é excessivo aqui, mas se você decidir renomear lsipara ls, commandajudará a evitar a recursão infinita indesejada.

    • Eu adicionei "$@"no final da minha lsinvocação para que eu possa fazer lsi /, lsi /dev/sd*etc. Observe que isso também me permite especificar opções adicionais que podem funcionar bem (por exemplo lsi -a) ou não tão bem (elas podem mudar as colunas sem mudar a coloração, por exemplo lsi -i) .

    • Compactei as opções. Com -gvocê não precisa -l; e você teve -hduas vezes; e acho -Nirrelevante ao usar lsem um cachimbo. Mesmo assim o seu lspode variar, opções em excesso só prejudicam a elegância. Use o que funcionar para você.

    • 0

relate perguntas

  • Integração com putty e Ubuntu

  • Não é possível abrir a porta entre o Windows 10 e a VM do Ubuntu hospedada localmente criada no Hyper-v

  • Erro ssh do contêiner do Docker: ssh_exchange_identification: conexão fechada pelo host remoto

  • O apache2 pode funcionar sem arquivos conf?

  • pasta compartilhada vmwared não está funcionando

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve