nosso objetivo é criar um script bash que exclua os números UUID não utilizados/desnecessários do /etc/fstab
arquivo,
breve histórico - em nossos laboratórios, temos mais de 500 servidores RHEL e queremos corrigir os fstab
arquivos que possuem fstab
configuração incorreta, como números UUID não utilizados ou números UUID não utilizados que estão nas linhas de comentários, etc.
criamos o seguinte script bash como exemplo.
#!/bin/bash
blkid_list_of_uuid=` blkid | awk -F'UUID=' '{print $2}' | awk '{print $1}' | sed s'/"/ /g' `
grep UUID /etc/fstab >/tmp/fstab
while read line_from_fstab
do
echo "checking if ${line_from_fstab} is unused UUID"
if [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]
then
#sed -i "/$line_from_fstab/d" /etc/fstab
echo "delete unused line ${line_from_fstab} from fstab"
fi
done < /tmp/fstab
capturamos o blkid
número na blkid_list_of_uuid
variável. e filtre as linhas UUID do fstab para o /tmp/fstab
arquivo
o objetivo da sintaxe if - [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]
é excluir por sed (por enquanto em comentário) as linhas UUID /etc/fstab
que não estão em uso
mas o regex não está funcionando e o script exclui o UUID que está em uso
exemplo de blkid
blkid
/dev/mapper/vg-VOL_root: UUID="49232c87-6c49-411d-b744-c6c847cfd8ec" TYPE="xfs"
/dev/sda2: UUID="Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu" TYPE="LVM2_member"
/dev/sda1: UUID="0d5c6164-bb9b-43f4-aa9b-092069801a1b" TYPE="xfs"
/dev/mapper/vg-VOL_swap: UUID="81140364-4b8e-412c-b909-ef0432162a45" TYPE="swap"
/dev/mapper/vg-VOL_var: UUID="e1574eeb-5a78-4a52-b7e3-c53e2b8a4220" TYPE="xfs"
/dev/sdb: UUID="547977e2-a899-4a75-a31c-e362195c264c" TYPE="ext4"
/dev/mapper/vg-VOL_docker: UUID="2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b" TYPE="xfs"
/dev/sdc: UUID="1a289232-0cfe-4df7-9ad5-6a6e2362a1c5" TYPE="ext4"
/dev/sdd: UUID="91493d1f-ffe9-4f5f-aa6d-586d2c99f029" TYPE="ext4"
/dev/sde: UUID="f11845e7-1dcb-4b81-a1d4-9a5fe7da6240" TYPE="ext4"
A razão pela qual não está funcionando é porque você está tentando combinar as coisas erradas. Isto é o que sua
blkid
variável contém:Isso significa que isso:
fica algo assim:
Claro, isso nunca será verdade: você está procurando a
fstab
linha inteira na lista de UUIDs encontrados. O que você queria fazer é procurar oUUID
único.Não faça isso, use um dos métodos fornecidos nas outras respostas, usar o shell para esse tipo de coisa é uma má ideia , mas para completar, aqui está uma abordagem baseada principalmente no shell usando a lógica que acho que você quis dizer usar (observe que isso requer GNU
grep
):São
BAD:
os UUIDs do meu/etc/fstab
arquivo que não foram encontrados na saída doblkid
meu sistema.Sem entrada de amostra e saída esperada, é um palpite não testado, mas acho que é isso que você deseja, usando qualquer awk:
O texto acima assume
blkid
o formato de saída conforme mostrado em https://linux.101hacks.com/unix/blkid :e
/etc/fstab
formato de conteúdo conforme mostrado em https://wiki.archlinux.org/title/fstab :conforme encontrado por uma rápida pesquisa no Google.
Não tenho certeza se você pode usar uma lista de uuid como regexp.
para pegar essa lista eu usei
onde
-F\"
usar"
como separadorfor(i=1;i<=NF;i++)
ande na linhaif ($i ~ / UUID=/ )
se UUID= for encontrado ( spaceantes do UUID ser obrigatório) ...{ i++ ; print $i ; break ; } }'
.. obtenha o próximo campo (UUID real) e imprima-o, saia do loop.em seguida eu uso um simples
grep
(você pode usar
grep -q
para diminuir o lixo)esse resultado em
raramente há necessidade de canalizar dois
awk
e umsed
blkid_list_of_uuid também pode ser armazenado em um arquivo temporário, resultando em(não funcionará porque
${line_from_fstab}
não é um uuid)conforme apontado, implantar e executar script bash em 500 VMs pode não ser uma boa ideia no longo prazo, eu consideraria ansible.
Terdon respondeu o que você fez de errado. Vou apenas fornecer um exemplo de uma maneira mais simples de fazer o que você tentou:
Isso deve gerar fstab como você deseja, com a diferença de que isso não trata os UUIDs como expressões regulares ou
sed
comandos potenciais. Você pode direcionar a saída para/tmp/fstab
movê-la para/etc/fstab
.Eu usei
lsblk
em vez deblkid
porque a página de manualblkid
recomendalsblk
elsblk
não requer privilégios de root, emborablkid
aparentemente exija.