Remove Quotes (double ou single) com Awk

7

Eu quero remover aspas (aspas duplas) que aparecem na saída do awk, como isso pode ser alcançado

 # systool -c fc_host -v | awk '/Class Device =/{host=$4}/port_state/{print  host,$3}'   (This is my awk output sorted)
"host1" "Online"
"host2" "Online"

Abaixo está o comando & saída de comando ..

# systool -c fc_host -v

  Class Device = "host1"


  Class Device path = "/sys/class/fc_host/host1"

active_fc4s         = "0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 "

fabric_name         = "0x100000051ee8aecf"

issue_lip           = <store method only>

maxframe_size       = "2048 bytes"

    node_name           = "0x20000000c98f62a7"

    port_id             = "0x652500"

    port_name           = "0x10000000c98f62a7"

    port_state          = "Online"

    port_type           = "NPort (fabric via point-to-point)"

    speed               = "8 Gbit"

    supported_classes   = "Class 3"

    supported_fc4s      = "0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 "

    supported_speeds    = "2 Gbit, 4 Gbit, 8 Gbit"

    tgtid_bind_type     = "wwpn (World Wide Port Name)"

    uevent              = <store method only>

    Device = "host1"
    Device path = "/sys/devices/pci0000:00/0000:00:07.0/0000:0e:00.0/host1"
      uevent              = <store method only>
    
por krock1516 14.04.2015 / 04:16

1 resposta

5

Usando a função substr do awk

Isso remove o primeiro e o último caractere de cada string:

$ systool -c fc_host -v | awk '/Class Device =/{host=substr($4,2,length($4)-2)}/port_state/{print host,substr($3,2,length($3)-2)}'
host1 Online

Como funciona:

No código com o qual você começou, havia a linha

host=$4

No código revisado, isso é substituído por:

host=substr($4,2,length($4)-2)

A função substr retorna uma subcadeia de $4 . Nesse caso, ele inicia a partir do segundo caractere e estende um comprimento de length($4)-2 . Assim, isso inclui todos os caracteres, exceto o primeiro e o último (que são aspas duplas).

Pelo mesmo motivo, este comando:

print host,$3)

foi substituído por:

print host,substr($3,2,length($3)-2)

Usando a função gsub do GNU awk

Como alternativa, gsub pode ser usado para remover as aspas duplas:

$ systool -c fc_host -v | awk '/Class Device =/{gsub("\"","",$4);host=$4}/port_state/{gsub("\"","",$3);print host,$3}'
host1 Online

Como funciona

Novamente, é como o código que você começou, mas com dois novos comandos adicionados:

gsub("\"","",$4)
gsub("\"","",$3)

gsub faz substituições. Nesse caso, ele substitui " por uma string vazia, removendo as aspas duplas. Na primeira linha acima, ele os remove de $4 (que é o host) e na segunda linha acima, remove-os de $3 (que é o port_state ).

Usando o Separador de Campo do awk

$ systool -c fc_host -v | awk -F'"' '/Class Device =/{host=$2} /port_state/{print host,$2}'
host1 Online
    
por 14.04.2015 / 04:27

Tags