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 / unix / Perguntas / 427746
Accepted
dot
dot
Asked: 2018-03-03 10:41:15 +0800 CST2018-03-03 10:41:15 +0800 CST 2018-03-03 10:41:15 +0800 CST

como extrair apenas uma parte específica de um nome de arquivo no bash [duplicado]

  • 772
Esta pergunta já tem respostas aqui :
como extrair parte de um nome de arquivo antes de '.' ou antes da prorrogação (6 respostas)
Fechado há 4 anos .

Tenho a seguinte lista de arquivos:

lab-1:/tmp/tmp.NMFaDO# ls                                                                                              
webserver.123.net.1970-01-01.csv          webserver.123.net.2016-10-01.csv          webserver.123.net.2017-10-01.csv                
webserver.123.net.2015-11-01.csv          webserver.123.net.2016-11-01.csv          webserver.123.net.2017-11-01.csv                
webserver.123.net.2015-12-01.csv          webserver.123.net.2016-12-01.csv          webserver.123.net.2017-12-01.csv                
webserver.123.net.2016-01-01.csv          webserver.123.net.2017-01-01.csv          webserver.123.net.2018-01-01.csv                
webserver.123.net.2016-02-01.csv          webserver.123.net.2017-02-01.csv          webserver.123.net.2018-02-01.csv                
webserver.123.net.2016-03-01.csv          webserver.123.net.2017-03-01.csv          webserver.123.net.current.csv                   
webserver.123.net.2016-04-01.csv          webserver.123.net.2017-04-01.csv          webserver.123.net.db.done                       
webserver.123.net.2016-05-01.csv          webserver.123.net.2017-05-01.csv          webserver.123.net.records_to_delete.txt         
webserver.123.net.2016-06-01.csv          webserver.123.net.2017-06-01.csv          sip2.ci2.lab.jwm2.net.2018-02-01.csv               
webserver.123.net.2016-07-01.csv          webserver.123.net.2017-07-01.csv          sip2.ci2.lab.jwm2.net.db.done                      
webserver.123.net.2016-08-01.csv          webserver.123.net.2017-08-01.csv          sip2.ci2.lab.jwm2.net.records_to_delete.txt        
webserver.123.net.2016-09-01.csv          webserver.123.net.2017-09-01.csv                                                             

Dentro de um script bash, preciso percorrer essa lista e extrair apenas a parte da data do nome do arquivo. Consegui descobrir como fazer isso de dentro da
pasta que contém os arquivos usando este comando:

lab-1:/tmp/tmp.NMFaDO# ls webserver.123.net*.csv | sed 's/webserver.123.net.\(.*\)\.csv/\1/'                     
1970-01-01                                                                                                                                   
2015-11-01                                                                                                                                   
2015-12-01                                                                                                                                   
2016-01-01                                                                                                                                   
2016-02-01                                                                                                                                   
2016-03-01                                                                                                                                   
2016-04-01                                                                                                                                   
2016-05-01                                                                                                                                   
2016-06-01                                                                                                                                   
2016-07-01                                                                                                                                   
2016-08-01                                                                                                                                   
2016-09-01                                                                                                                                   
2016-10-01                                                                                                                                   
2016-11-01                                                                                                                                   
2016-12-01                                                                                                                                   
2017-01-01                                                                                                                                   
2017-02-01                                                                                                                                   
2017-03-01                                                                                                                                   
2017-04-01                                                                                                                                   
2017-05-01                                                                                                                                   
2017-06-01                                                                                                                                   
2017-07-01                                                                                                                                   
2017-08-01                                                                                                                                   
2017-09-01                                                                                                                         
2017-10-01                    
2017-11-01                   
2017-12-01               
2018-01-01              
2018-02-01  
current

mas não consigo fazer a lógica funcionar dentro do meu script bash:

dir=/tmp/tmp.NMFaDO
server=webserver.123.net
for csvfile in $dir/$server.*.csv
do 
  echo $csvfile | sed 's/$dir\/$server.\(.*\)\.csv/\1/'
done

No momento, está imprimindo o caminho completo do nome assim:

/tmp/tmp.NMFaDO/webserver.123.net.1970-01-01.csv
/tmp/tmp.NMFaDO/webserver.123.net.2015-11-01.csv

etc.

Alguém pode me dizer o que estou perdendo no meu script bash? obrigado.

bash shell-script
  • 2 2 respostas
  • 7057 Views

2 respostas

  • Voted
  1. ilkkachu
    2018-03-03T10:58:18+08:002018-03-03T10:58:18+08:00

    Com o formato de nome de arquivo assim, você pode remover a extensão e depois remover tudo até o último ponto.

    Com expansão de parâmetros:

    for f in ./webserver.123.*; do
        d=${f%.csv}          # remove trailing .csv
        d=${d##*.}           # remove all up to (now) last .
        echo "filename: $f date: $d"
    done
    

    ou com sed:

    for f in ./webserver.123.*; do
        d=$(echo "$f" | sed -e 's/\.csv$//' -e 's/.*\.//');
        echo "filename: $f date: $d";
    done
    
    • 6
  2. Best Answer
    Gilles Quenot
    2018-03-03T10:45:31+08:002018-03-03T10:45:31+08:00

    Tome cuidado com as citações que você usa: então

    dir=/tmp/tmp.NMFaDO
    server=webserver.123.net
    for csvfile in $dir/$server.*.csv
    do 
      echo "$csvfile" | sed "s|$dir/$server.\(.*\)\.csv|\1|"
    done
    

    "Duplique aspas" todo literal que contém espaços/metacaracteres e toda expansão: "$var", "$(command "$var")", "${array[@]}", "a & b". Use 'single quotes'para código ou literal $'s: 'Costs $5 US', ssh host 'echo "$HOSTNAME"'. Veja
    http://mywiki.wooledge.org/Quotes
    http://mywiki.wooledge.org/Arguments
    http://wiki.bash-hackers.org/syntax/words

    • 4

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • MySQL Select com função IN () com array bash

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

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

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

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