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 / 737099
Accepted
yael
yael
Asked: 2023-02-28 00:00:40 +0800 CST2023-02-28 00:00:40 +0800 CST 2023-02-28 00:00:40 +0800 CST

Como excluir todos os UUID do fstab, mas não o UUID do sistema de arquivos de inicialização

  • 772

no fstabarquivo de exemplo a seguir, queremos excluir todas as linhas que começam com UUID, mas exceto a UUIDlinha com boota palavra

/dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
/dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0


UUID=0b14011d-f69d-4c4c-8ce0-6240bb0a574a   /var/kafka/mp1                      xfs defaults,noatime 0 0
UUID=2d7872f2-96d4-4ba9-8a17-a1115542645c   /var/kafka/mp2                      xfs defaults,noatime 0 0
UUID=79bdbf56-9a09-4505-ab8e-41ce9432cf0f   /var/kafka/mp3                      xfs defaults,noatime 0 0
UUID=ca42a388-83d4-4f8b-aff7-3450d836eef7   /var/kafka/mp4                      xfs defaults,noatime 0 0
UUID=62d356bb-c393-4a74-bbf9-984b60d3b5c4   /var/kafka/mp5                      xfs defaults,noatime 0 0
UUID=d4071a83-204f-475f-8917-cdd77ef6b1ed   /var/kafka/mp6                      xfs defaults,noatime 0 0

os resultados excluídos devem ser os seguintes

/dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
/dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0

até agora temos o seguinte sed

 sed -i '/^UUID/d'  /etc/fstab

mas a abordagem acima exclui todas as UUIDlinhas

text-processing
  • 6 6 respostas
  • 853 Views

6 respostas

  • Voted
  1. Stéphane Chazelas
    2023-02-28T14:51:48+08:002023-02-28T14:51:48+08:00

    Parece-me que você deseja excluir as linhas cujo primeiro campo começa com UUID=e o segundo campo não é /boot.

    Então awk, ou o modo awk do perl pareceria uma escolha óbvia:

    awk '! ($1 ~ /^UUID=/ && $2 != "/boot")' /etc/fstab
    

    (GNU awk pode editar no local com -i inplace).

    perl -lae 'print unless $F[0] =~ /^UUID=/ && $F[1] ne "/boot"' /etc/fstab
    

    ( perltem -ipara edição local).

    O equivalente poderia ser feito com sed:

    sed '/^[[:space:]]*[^[:space:]]\{1,\}[[:space:]]\{1,\}/boot\([[:space:]].*\)\{0,1\}$/b
         /^[[:space:]]*UUID=/d' /etc/fstab
    

    Alguns seds podem fazer edição no local com -i(a maioria) ou -i ''(FreeBSD e derivados, incluindo macos).

    • 6
  2. meuh
    2023-02-28T00:15:50+08:002023-02-28T00:15:50+08:00

    Existem muitas possibilidades. Mantendo-o simples, você pode usar

    '/^UUID/{
       /\/boot/b
       d
    }'
    

    que usa {}para incluir mais comandos a serem executados quando o padrão é correspondido. Se a inicialização for correspondida, bramifica para o final dos comandos, caso contrário, dé feito. Alternativamente,

    '/^UUID/{
       /\/boot/!d
    }'
    

    Se a inicialização não corresponder, exclua. Esses padrões devem ser aprimorados com correspondências para espaços em branco, mas você pode não se importar se entender o que espera do arquivo.

    As versões de uma linha podem não funcionar com algumas versões de sed:

    '/^UUID/{/\/boot/b;d;}'
    

    e

    '/^UUID/{/\/boot/!d;}'
    
    • 4
  3. Best Answer
    ralz
    2023-02-28T00:22:19+08:002023-02-28T00:22:19+08:00

    Primeiro diga ao sed para imprimir as linhas que contêm boot, depois diga para deletar as linhas que contêm UUID, separe as expressões com;

    sed -i '/boot/p;/UUID/d' /etc/fstab
    

    Como a expressão de impressão foi fornecida antes da expressão de exclusão, a linha que contém boot será impressa, antes das linhas com UUID serem excluídas, se você alterar as posições da expressão, isso não funcionará.

    Dado o exemplo que você deu, você deve obter algo assim

    /dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
    UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
    /dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0
    

    Você também pode adicionar a parte para excluir linhas vazias, ^marcar o início da linha e $marcar o final da linha, portanto, adicione a expressão para excluir as linhas que têm o final $da linha logo após o início da linha ^.

    sed -i '/boot/p;/UUID/d;/^$/d' /etc/fstab
    


    EDITAR

    Conforme observado nos comentários de Stéphane Chazelas, isso imprimirá a linha que contém boot duas vezes, se não contiver UUID na mesma linha, algo assim seria melhor.

    sed -i '/^UUID/{/boot/!d};/^$/d' /etc/fstab
    

    Ele excluirá as linhas que começam com UUID, exceto se contiverem /boot e, em seguida, excluirá todas as linhas vazias

    • 4
  4. Gilles Quénot
    2023-02-28T00:15:49+08:002023-02-28T00:15:49+08:00

    Com Perl :

    perl -i -pe 's@^UUID\S+\s++(?!/boot).*\n@@' /etc/fstab
    

    O -ilike em sed, substitua na linha

    A expressão regular corresponde da seguinte forma:

    Nó Explicação
    ^ o começo da corda
    UUID 'UUID'
    \S+ sem espaço em branco (todos exceto \n, \r, \t, \f e " ") (1 ou mais vezes (combinando o máximo possível))
    \s++ espaço em branco (\n, \r, \t, \f e " ") Corresponde 1 ou mais vezes e não retorna nada
    (?! olhe adiante para ver se não há:
    /boot '/bota'
    ) fim da antecipação
    .* qualquer caractere exceto \n (0 ou mais vezes (combinando o máximo possível))
    \n '\n' (nova linha)
    • 2
  5. terdon
    2023-02-28T01:19:32+08:002023-02-28T01:19:32+08:00

    Eu mesmo faria isso no awk, já que podemos tirar proveito da ação padrão quando algo for avaliado como verdadeiro, que é imprimir a linha. Portanto, tudo o que precisamos é testar se esta linha corresponde bootou não UUID:

    $ awk '/boot/ || !/UUID/' file 
    /dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
    UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
    /dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0
    
    
    

    Você também pode remover as linhas em branco:

    $ awk '/./ && (/boot/ || !/UUID/)' file 
    /dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
    UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
    /dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0
    

    E você pode torná-lo um pouco mais seguro, garantindo que /bootseja correspondido e como uma única "palavra", e que UUIDesteja no início da linha e seguido por =:

    awk '/./ && (/\/boot\>/ || !/^UUID=/)' file 
    

    E, com GNU awk, você pode usar -i inplacepara editar o arquivo original, assim como sed:

    gawk -i inplace '/./ && (/boot/ || !/UUID/)' file 
    

    Se você absolutamente deve usar sed, aqui está outra abordagem:

    $ sed -n '/\/boot/p; /UUID/!p' file
    /dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
    UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
    /dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0
    
    
    

    O -ndesliga a impressão da linha e, em seguida, imprimimos ( p) se a linha corresponder /bootou não UUID(o !pno final de /UUID/!psignifica "imprimir se NÃO corresponder").

    Finalmente, aqui está outra abordagem perl:

    $ perl -ne 'print if /\/boot/ || !/UUID/ ' file
    /dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
    UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
    /dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0
    
    
    
    • 2
  6. Shadur
    2023-02-28T20:39:07+08:002023-02-28T20:39:07+08:00

    Não posso enfatizar isso o suficiente: você não quer fazer isso com um script sed .

    Em vez disso, use algo como Ansible.

    Apenas uma leitura rápida da documentação de seu mountmódulo sugere que você pode automatizá-lo para todo o seu cluster de mais de 2500 sistemas com algo parecido com as seguintes linhas:

    name: Remove kafka1 mount
      ansible.posix.mount:
        backup: true
        path: '/var/kafka/{{ item }}'
        state: absent
      loop:
        - 'mp1'
        - 'mp2'
        - 'mp3' 
    

    Isso vai

    1. Evitar a necessidade de correspondência de padrões meticulosamente minuciosa, que pode ou não funcionar para todos os casos;
    2. Permite executar o script em todos os sistemas com apenas uma chamada, evitando erros de digitação causados ​​por trabalho repetitivo
    3. Gere um backup de sua entrada fstab da qual você poderá se recuperar caso você tenha perdido alguma coisa afinal
    4. Permitir que você teste as coisas antes de executar o script e potencialmente inutilizar mais de 2.000 sistemas.
    • 2

relate perguntas

  • Grep para um conjunto de linhas de $START a $END AND que contém uma correspondência em $MIDDLE

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

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

    • 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

    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
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • 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
    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

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