Adiciona strings a um arquivo com comandos

3

Eu preciso adicionar:

user_xattr,acl,barrier=1

ao meu arquivo / etc / fstab. Existe uma maneira de fazer isso através do script via shell?

Eu só quero editar a montagem ' / '.

Aqui está o que eu tenho antes de editá-lo manualmente:

UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 errors=remount-ro 0 1

Aqui está o que parece depois de adicionar manualmente as linhas:

UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1

Eu sei que o comando sed -i não funcionará aqui porque adiciona apenas linhas ...

Além disso, o script deve ser executado em vários computadores, por isso é necessário "saber" que o UUID será diferente.

    
por Elliot Labs 04.04.2014 / 16:02

2 respostas

11

Na verdade, sed pode funcionar perfeitamente, mas aqui estão mais algumas opções:

1. sed

sudo sed -i.old -r '/[ \t]\/[ \t]/{s/(ext4[\t ]*)([^\t ]*)/,user_xattr,acl,barrier=1/}' /etc/fstab

Explicação:

  • -i.old : Edite o arquivo no lugar e crie fstab.old como backup do arquivo original antes das alterações.
  • -r : ativa as expressões regulares estendidas.
  • /[ \t]\/[ \t]/{} : Se esta linha corresponder a um / rodeado por um espaço ou tabulação (se esta linha descrever o / ponto de montagem).
  • s/(ext4[\t ]*)([^\t ]*)/,user_xattr,acl,barrier=1/ : s/pat/replacement/ é o operador de substituição, ele substituirá pat por replacement . Aqui, nós estamos combinando ext4 e qualquer espaço ou tab seguinte (necessário para ancorar a correspondência, se os seus sistemas de arquivos não são ext4, você precisará mudar isso) e então capturar (é o que os parênteses fazem) o trecho mais longo de caracteres não brancos depois disso. Em outras palavras, capturando o campo de opções do fstab. Em seguida, substituímos aqueles com (o primeiro padrão capturado), (o 3º padrão de capturaf, as opções originais) mais as opções extras que você deseja adicionar.

2. Perl

sudo perl -i.old -pane 's/$F[3]/$F[3],user_xattr,acl,barrier=1/ if $F[1] eq "/"' /etc/fstab

Explicação:

  • -i.old : Novamente, isso fará com que o arquivo seja editado e um backup chamado fstab.old será criado.
  • -pane : -p significa imprimir cada linha, -a divide automaticamente as linhas de entrada nos campos no espaço em branco e as salva como a matriz @F . -n significa ler linha por linha e -e permite que você passe um script na linha de comando.
  • O script real adicionará as opções extras ao valor atual do quarto campo ( $F[3] , primeiro campo é $F[0] ) somente se o segundo campo ( $F[1] , o ponto de montagem) for / .

3. awk

sudo cp /etc/fstab /etc/fstab.old && 
 awk '(=="/"){=",user_xattr,acl,barrier=1"}1;' /etc/fstab.old | sudo tee /etc/fstab

Explicação:

A maioria das versões de awk não permite a edição em vigor, portanto, o primeiro comando criará uma cópia de backup. O awk verificará, então, se o segundo campo é / e, em caso afirmativo, adicionará o texto necessário ao quarto campo, as opções. O 1; é um atalho do awk para "imprimir a linha". O sudo tee é apenas um truque para permitir a impressão em /etc/fstab , já que o simples redirecionamento não funcionará com sudo .

4. puta pura

sudo cp /etc/fstab /etc.fstab.old
while read fs mp ty op du pa; do 
    [[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op"; 
    printf "%s %s %s %s %s %s\n" "$fs" "$mp" "$ty" "$op" "$du" "$pa"; 
done < /etc/fstab.old | sudo tee /etc/fstab

Explicação

  • while read fs mp ty op du pa; do ...; done < /etc/fstab : Leia cada linha fstab e divida nos campos relevantes.
  • [[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op"; se o ponto de montagem for / , adicione as opções extras a $op .
  • O printf apenas imprime cada linha corretamente.
por terdon 04.04.2014 / 16:42
1

sed -i não é usado somente para adicionar linhas como você disse. Pode ser usado em muitos outros casos. E no seu caso como segue:

str="/[[:space:]]*ext4[[:space:]]*errors=remount-ro[[:space:]]*0[[:space:]]*1"
sed -i.bak "s#$str#/ ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1#" /etc/fstab

Assim como $str , que é igual a algo como / ext4 errors=remount-r 0 1 (onde cada espaço pode ser qualquer grupo de espaços em branco <tab> e <space> ) será substituído por / ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1 em /etc/fstab file. / p>

A classe [:space:] (que corresponde aos caracteres em branco <tab> e <space> ) é especificado por POSIX , então você não deve ter problemas em usá-lo em qualquer shell.

    
por Radu Rădeanu 04.04.2014 / 16:38