Com sed
e nl
:
nl -ba -nrz -s: /etc/fstab | \
sed '/^[[:digit:]]*:[[:blank:]]*\(#\|$\)/d;//!{s/\/&&/g}' | \
column -t | sed 's|^0*\([[:digit:]]*\):\(.\)|c\\
|' | sed -f - /etc/fstab
ou com sed
e grep
:
grep -nvE '^[[:blank:]]*(#|$)' /etc/fstab | \
sed -E 's/\/&&/g;s/^([[:digit:]])*:(.*)/c\\
/' | column -t | sed -f - /etc/fstab
ou menor, com sed
e awk
:
awk '!/^[[:blank:]]*(#|$)/{print NR"c\";gsub(/\/,"&&");print}' \
/etc/fstab | column -t | sed -f - /etc/fstab
Com um arquivo de teste:
# /etc/fstab: static file system information
# <file system> <dir> <type> <options> <dump> <pass>
LABEL=ROOT / ext4 noatime,discard 0 1
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1
# /home was on /dev/sda2 during installation
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2
LABEL=SWAP none swap sw,discard 0 0
UUID=7fa3-cb08 /media ext4 defaults 0 0
a saída é:
# /etc/fstab: static file system information
# <file system> <dir> <type> <options> <dump> <pass>
LABEL=ROOT / ext4 noatime,discard 0 1
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1
# /home was on /dev/sda2 during installation
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2
LABEL=SWAP none swap sw,discard 0 0
UUID=7fa3-cb08 /media ext4 defaults 0 0
Como funcionam:
O último sed -f - /etc/fstab
modifica apenas as definições de pontos de montagem em /etc/fstab
(deixando as outras linhas - incluindo as vazias - inalteradas) usando um script- f
ile ( -
lido de stdin
) produzido pelo anterior comandos:
4c\
LABEL=ROOT / ext4 noatime,discard 0 1
5c\
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1
7c\
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2
8c\
LABEL=SWAP none swap sw,discard 0 0
9c\
UUID=7fa3-cb08 /media ext4 defaults 0 0
O primeiro usa nl -ba -nrz -s:
para numerar todas as linhas e depois
sed '/^[[:digit:]]*:[[:blank:]]*\(#\|$\)/d;//!{s/\/&&/g}'
exclui linhas que foram originalmente comentadas ou vazias e escapa quaisquer barras invertidas nas linhas restantes (não necessário neste caso específico, eu sei) a saída é então canalizada para column -t
, então somente as definições de pontos de montagem são colunadas:
000004:LABEL=ROOT / ext4 noatime,discard 0 1
000005:UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1
000007:UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2
000008:LABEL=SWAP none swap sw,discard 0 0
000009:UUID=7fa3-cb08 /media ext4 defaults 0 0
isso é processado posteriormente com
sed 's|^0*\([[:digit:]]*\):\(.\)|c\\
|'
para produzir o arquivo de script mencionado acima.
O segundo e o terceiro são similares (eles produzem a mesma saída), então
grep -nvE '^[[:blank:]]*(#|$)' | sed -E 's/\/&&/g;s/^([[:digit:]])*:(.*)/c\\
/'
ou
awk '!/^[[:blank:]]*(#|$)/{print NR"c\";gsub(/\/,"&&");print}'
irá corresponder apenas às definições de pontos de montagem, escape das barras invertidas (se houver), imprima o número da linha seguido por c\
e (em uma linha separada) o conteúdo real da linha:
4c\
LABEL=ROOT / ext4 noatime,discard 0 1
5c\
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1
7c\
UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2
8c\
LABEL=SWAP none swap sw,discard 0 0
9c\
UUID=7fa3-cb08 /media ext4 defaults 0 0
que é então canalizado para column -t
para produzir o mesmo arquivo de script.
Outra forma com ed
faz o mesmo, mas lê o arquivo apenas uma vez:
ed -s <<IN <(nl -ba -nrz -s: /etc/fstab) | sort -t: -k1,1 | cut -d: -f2-
g/^[[:digit:]]*:[[:blank:]]*\(#\|$\)/p
g//d
,w !column -t
q
IN
As linhas numeradas são usadas como entrada para ed
, o primeiro subcomando p
rints de todas as linhas ( g
) que foram originalmente comentadas ou vazias, a segunda d
as elimina e então a segunda as linhas restantes são passadas como entrada ( w
) para o comando shell ( !
) column -t
. A saída inteira é sort
ed e cut
remove os números iniciais.