AWK formatando incorretamente o comando do Utilitário de Disco

0

Estou tentando aprender o awk no momento e estou testando no comando disk utility .

Aqui está a saída quando eu corro Disk Utility list disk0

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            145.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
   4:           Linux Filesystem                         48.0 GB    disk0s4
   5:       Microsoft Basic Data WINDOWS                 38.0 GB    disk0s5
   6:                 Linux Swap                         18.8 GB    disk0s6

Agora, se eu executar diskutil list disk0 | awk 'NR > 2 {print}' , recebo isso como minha saída.

   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            145.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
   4:           Linux Filesystem                         48.0 GB    disk0s4
   5:       Microsoft Basic Data WINDOWS                 38.0 GB    disk0s5
   6:                 Linux Swap                         18.8 GB    disk0s6

Como você pode ver, a saída é a esperada. O problema agora é quando tento imprimir US $ 2, US $ 3 e US $ 4. A saída às vezes imprime "HD" quando deve imprimir o tamanho e outros problemas como esse.

diskutil list disk0 | awk 'NR > 2 {print $1}'

0:
1:
2:
3:
4:
5:
6:

Resultado esperado

diskutil list disk0 | awk 'NR > 2 {print $2}'

GUID_partition_scheme
EFI
Apple_HFS
Apple_Boot
Linux
Microsoft
Linux

Resultado esperado

GUID_partition_scheme
EFI
Apple_HFS
Apple_Boot
Linux Filesystem
Microsoft Basic Data
Linux Swap

Como você pode ver as saídas do comando conforme esperado até o sistema de arquivos Linux. Isto é devido a haver espaços na palavra?

Isso agora afeta tudo o que vem depois dele, por exemplo

diskutil list disk0 | awk 'NR > 2 {print $3}' exibe

*251.0
EFI
Macintosh
Recovery
Filesystem
Basic
Swap

quando deve aparecer

EFI
Macintosh HD
Recovery HD

Windows

Como eu obteria o formato AWK como seria de esperar?

    
por iProgram 01.09.2015 / 12:27

2 respostas

1

Com bash , você pode fazer:

diskutil list disk0 | { read; read; while read i; do echo ${i:6:27}; done; }
  • Os dois primeiros read s devem ignorar o primeiro para as linhas.
  • O loop while lê a linha de entrada por linha e imprime a parte desejada.

Editar: Se precisar ser awk , use:

diskutil list disk0 | awk 'NR>2{$0=substr($0,6,27);sub("^ +","",$0);print}'
  • NR>2 omite as duas primeiras linhas na saída
  • substr() corta a parte relevante
  • sub() remove os espaços iniciais
  • e finalmente print imprime a linha
por 01.09.2015 / 13:01
1

diskutil output é formatado com múltiplos espaços para saída em colunas ordenadas. Extraia os campos requeridos usando a função substr do awk.

Por exemplo, para extrair o tipo e o nome de diskutil . As funções substr extraem os campos da saída diskutil. Por exemplo, o campo de nome começa na posição 6 e tem até 27 caracteres de comprimento. As funções gsub apenas retiram os espaços em branco iniciais e finais dos campos.

diskutil list disk0 | awk 'NR > 2 {
   name=substr($0, 33,20);  # name field - position 33, length 20 chars
   gsub(/ /,"",name)    # trim spacing

   type=substr($0, 6, 27);  # type field - position 6, length 27 chars
   gsub(/ /,"",type)    # trim spacing
   print "name="name," type="type
}' 
    
por 01.09.2015 / 12:41