Entfernen Sie Anführungszeichen (doppelt oder einfach) mit Awk


7

Ich möchte Anführungszeichen (doppelte Anführungszeichen) entfernen, die in der awk-Ausgabe erscheinen, wie dies erreicht werden kann

 # 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"

Unten finden Sie die Befehls- und Befehlsausgabe.

# 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>

Antworten:


7

Verwenden der awk- substrFunktion

Dadurch werden das erste und das letzte Zeichen aus jeder Zeichenfolge entfernt:

$ 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

Wie es funktioniert:

In dem Code, mit dem Sie begonnen haben, befand sich die Zeile

host=$4

Im überarbeiteten Code wird dies ersetzt durch:

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

Die substrFunktion gibt einen Teilstring von zurück $4. In diesem Fall beginnt es mit dem zweiten Zeichen und erstreckt sich über eine Länge von length($4)-2. Dies schließt also alle Zeichen außer dem ersten und dem letzten ein (dies sind doppelte Anführungszeichen).

Aus dem gleichen Grund ist dieser Befehl:

print host,$3)

wurde ersetzt durch:

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

Verwendung der gsubFunktion von GNU awk

Alternativ gsubkönnen Sie die doppelten Anführungszeichen entfernen:

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

Wie es funktioniert

Dies ist wieder genau wie der Code, mit dem Sie begonnen haben, jedoch mit zwei neuen Befehlen:

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

gsubmacht Substitutionen. In diesem Fall wird es "durch eine leere Zeichenfolge ersetzt, wodurch die doppelten Anführungszeichen entfernt werden. In der ersten Zeile oben werden sie entfernt $4(was der Host ist) und in der zweiten Zeile oben werden sie entfernt (was der Host $3ist port_state).

Verwenden des Feldtrenners von awk

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

thx John, kannst du bitte erklären, ich bin ein neuer Lernender.
krock1516

@Karn Ich habe gerade eine Erklärung für die Befehle substrund hinzugefügt gsub.
John1024

@ John Ziemlich genial, das hilft sehr. Gibt es eine Möglichkeit, Anführungszeichen mit "-F" mit awk zu entfernen? Nur eine heikle Frage in meinem Kopf.
krock1516

@ Karn Überhaupt nicht verrückt. Ich habe gerade eine -FLösung hinzugefügt .
John1024

@ John thx .. Ich habe auch versucht das gleiche es funktioniert.
krock1516
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.