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 / ubuntu / Perguntas / 1541429
Accepted
Alan
Alan
Asked: 2025-02-14 20:49:23 +0800 CST2025-02-14 20:49:23 +0800 CST 2025-02-14 20:49:23 +0800 CST

Como concatenar duas saídas de comando em uma única linha em um script bash?

  • 772

Execute o Ubuntu 24.04 LTS se isso fizer alguma diferença.

Estou tentando exibir o resultado de dois comandos em um script bash (a saída é para stdout) em uma única linha, mas não consigo fazer funcionar - recebo as duas saídas em duas linhas.

O comando que tentei (e muitas variações dele) é:

ssh [email protected] -- 'echo -n "VMName : " && lsblk | grep -i disk' && 'echo -n "  Hypervisor = HypervisorHostName"'

Isso gera duas linhas como esta:

Nome da VM: vda 254:0 0 20G 0 disco

Hipervisor = HypervisorHostName

enquanto eu gostaria de obter:

VMName: vda 254:0 0 20G 0 disco Hypervisor = HypervisorHostName

Suspeito que seja trivialmente fácil. Estou perdendo o óbvio aqui?

Obrigado,

Alan.

bash
  • 5 5 respostas
  • 514 Views

5 respostas

  • Voted
  1. Best Answer
    Raffa
    2025-02-15T00:11:29+08:002025-02-15T00:11:29+08:00

    Observe que a parte da sua linha de comando que está depois do &&ie final echo -n " Hypervisor = HypervisorHostName"será executada na máquina local de onde você está sshfazendo o download após ssho fechamento da sessão e não será executada na máquina remota ou durante a sshsessão... No seu caso ssh, são passados ​​apenas os comandos entre o primeiro conjunto de aspas simples '...'.

    Dito isso, você parece lidar principalmente com strings sobre as quais você aparentemente teria controle total sobre como elas seriam impressas, exceto pela lsblk | grep -i diskparte onde grepdecide que... Eu estava pensando por que não transformar isso também em uma string usando a sintaxe de substituição de comando $(...)e então formatar tudo como uma string usando o built-in do shell printfcom seu especificador de string %sassim:

    ssh [email protected] -- 'printf "%s\n" "VMName : $(lsblk | grep -i disk) Hypervisor = HypervisorHostName"' 
    
    • 5
  2. steeldriver
    2025-02-14T23:21:43+08:002025-02-14T23:21:43+08:00

    Em geral, você pode canalizar a saída padrão para paste -sconcatenar pares de linhas.

    Entretanto, neste caso, eu sugeriria usar awkem vez de greppara que você possa imprimir a saída formatada que deseja diretamente, por exemplo:

    $ lsblk | gawk -v IGNORECASE=1 '/disk/{print "VMNAME : " $0 " Hypervisor = HypervisorHostName"}'
    VMNAME : sda      8:0    0    36G  0 disk  Hypervisor = HypervisorHostName
    

    Você pode omitir IGNORECASE=1e usar qualquer POSIX awkse realmente não precisar de correspondência que não diferencie maiúsculas de minúsculas.

    Alternativamente, você pode ir até o fim e usar a lsblksaída JSON do comando e selecionar o disco e imprimir a string desejada usando jq- o que protegeria contra correspondências falsas da string "disco" em outro lugar na saída - por exemplo

    $ lsblk -J | jq -r '.blockdevices[] | select(.type == "disk") | 
        "VMNAME : \(.name) \(.size) Hypervisor = HypervisorHostName"'
    VMNAME : sda    36G     Hypervisor = HypervisorHostName
    

    ou

    $ lsblk -J | jq -r '.blockdevices[] | select(.type == "disk") | 
        ["VMNAME : ", .name, .size, "Hypervisor = HypervisorHostName"] | @tsv'
    VMNAME :        sda     36G     Hypervisor = HypervisorHostName
    

    (Omiti alguns campos que ."maj:min"provavelmente não são de interesse).

    • 4
  3. Hannu
    2025-02-15T00:21:12+08:002025-02-15T00:21:12+08:00

    Um conjunto de coisas simples que podem fazer você começar:

    # comentários em linha, como este
    
    # primeiro eco tem opção para não imprimir uma quebra de linha
    $ eco -n "a" && eco "b"
    sobre
    
    # o comando $( ) executa o comando e deixa sua saída como texto
    $ eco "$(eco a && eco b)"
    um
    b
    
    # o mesmo que acima, mas; observe que o pipe é apenas para echo b
    $ echo "$(eco a && echo b | tr -d '\n' )"
    um
    b
    
    # Mesmo aqui...
    $ echo "$(echo a && echo b | tr '\n' ' ' )"
    um
    b
    
    # O parêntesis extra "une" os comandos (eles são executados em um subshell),
    # então AMBOS enviam sua saída para o pipe
    $ echo "$( (eco a && echo b) | tr '\n' ' ' )"
    sobre
    
    # usando a opção -d do tr para remover quebras de linha
    $ echo "$( (echo a && echo b ) | tr -d '\n' )"
    sobre
    
    # ligeiramente simplificado
    $ (eco a && eco b) | tr '\n' ' '
    ab $
    
    

    www.tldp.org tem "guias Bash" em PDFs - eu recomendo dar uma olhada rápida para talvez pegar um truque ou dois.
    Com isso você sabe o que há, e pode procurar pesquisando.

    • 2
  4. robert rozee
    2025-02-14T21:23:54+08:002025-02-14T21:23:54+08:00

    Por favor, experimente isto:

    user@user-DH61BE:~$ whoami
    user
    user@user-DH61BE:~$ hostname
    user-DH61BE
    user@user-DH61BE:~$ { whoami & hostname; } | sed 'N;s/\n/ /'
    user-DH61BE user
    user@user-DH61BE:~$
    user@user-DH61BE:~$ { echo 'second-string' & echo 'first-string'; } | sed 'N;s/\n/ /'
    first-string second-string
    user@user-DH61BE:~$ 
    

    por favor nos avise se isso alcança o que você procura :-)

    adendo: como Terdon aponta, eu acidentalmente usei & em vez de &&. Como um bônus adicional, && obtém a ordem correta da esquerda para a direita:

    user@user-DH61BE:~$ { echo 'first-string' && echo 'second-string'; } | sed 'N;s/\n/ /'
    first-string second-string
    user@user-DH61BE:~$ 
    
    • -1
  5. user3353751
    2025-02-17T00:26:04+08:002025-02-17T00:26:04+08:00

    Isso é amaldiçoado, mas funciona até que não funcione mais e serve como seu próprio explicativo no último caso:

    sed 's,\x0a,,g'<<<$(echo `lnout && lnout2`)
    

    Melhor ainda como uma solução paliativa claramente visível, ela realmente funciona com a sintaxe:

    sed 's#\x0a##g'<<<$(echo `lnout && lnout2`)
    

    Caso começar a linha sem o ### não tenha sido explícito o suficiente.

    • -1

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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