no fstab
arquivo de exemplo a seguir, queremos excluir todas as linhas que começam com UUID
, mas exceto a UUID
linha com boot
a 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 UUID
linhas
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:(GNU awk pode editar no local com
-i inplace
).(
perl
tem-i
para edição local).O equivalente poderia ser feito com
sed
:Alguns
sed
s podem fazer edição no local com-i
(a maioria) ou-i ''
(FreeBSD e derivados, incluindo macos).Existem muitas possibilidades. Mantendo-o simples, você pode usar
que usa
{}
para incluir mais comandos a serem executados quando o padrão é correspondido. Se a inicialização for correspondida,b
ramifica para o final dos comandos, caso contrário,d
é feito. Alternativamente,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
:e
Primeiro diga ao sed para imprimir as linhas que contêm
boot
, depois diga para deletar as linhas que contêmUUID
, separe as expressões com;
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
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^
.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.
Ele excluirá as linhas que começam com UUID, exceto se contiverem /boot e, em seguida, excluirá todas as linhas vazias
Com Perl :
O
-i
like emsed
, substitua na linhaA expressão regular corresponde da seguinte forma:
^
UUID
\S+
\s++
(?!
/boot
)
.*
\n
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
boot
ou nãoUUID
:Você também pode remover as linhas em branco:
E você pode torná-lo um pouco mais seguro, garantindo que
/boot
seja correspondido e como uma única "palavra", e queUUID
esteja no início da linha e seguido por=
:E, com GNU awk, você pode usar
-i inplace
para editar o arquivo original, assim comosed
:Se você absolutamente deve usar
sed
, aqui está outra abordagem:O
-n
desliga a impressão da linha e, em seguida, imprimimos (p
) se a linha corresponder/boot
ou nãoUUID
(o!p
no final de/UUID/!p
significa "imprimir se NÃO corresponder").Finalmente, aqui está outra abordagem perl:
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
mount
módulo sugere que você pode automatizá-lo para todo o seu cluster de mais de 2500 sistemas com algo parecido com as seguintes linhas:Isso vai