Xóa Báo giá (gấp đôi hoặc đơn) bằng Awk


7

Tôi muốn xóa dấu ngoặc kép (dấu ngoặc kép) xuất hiện trong đầu ra awk, làm thế nào để đạt được

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

Dưới đây là đầu ra lệnh & lệnh ..

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

Câu trả lời:


7

Sử dụng substrchức năng của awk

Thao tác này sẽ xóa các ký tự đầu tiên và cuối cùng khỏi mỗi chuỗi:

$ 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

Làm thế nào nó hoạt động:

Trong mã mà bạn bắt đầu, có dòng

host=$4

Trong mã sửa đổi, được thay thế bằng:

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

Các substrchức năng trả về một chuỗi con của $4. Trong trường hợp này, nó bắt đầu từ ký tự thứ hai và kéo dài một chiều dài length($4)-2. Do đó, điều này bao gồm tất cả các ký tự ngoại trừ đầu tiên và cuối cùng (là dấu ngoặc kép).

Vì lý do tương tự, lệnh này:

print host,$3)

đã được thay thế bằng:

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

Sử dụng gsubchức năng của GNU awk

Ngoài ra, gsubcó thể được sử dụng để loại bỏ dấu ngoặc kép:

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

Làm thế nào nó hoạt động

Đây lại là giống như mã mà bạn đã bắt đầu nhưng với hai lệnh mới được thêm vào:

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

gsubkhông thay thế. Trong trường hợp này, nó thay thế "bằng một chuỗi rỗng, có hiệu lực loại bỏ dấu ngoặc kép. Trên dòng đầu tiên ở trên, nó loại bỏ chúng khỏi $4(là máy chủ lưu trữ) và trên dòng thứ hai ở trên, nó loại bỏ chúng khỏi $3(đó là port_state).

Sử dụng Dấu tách trường của awk

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

Thx John, bạn có thể giải thích, tôi là một người mới học.
krock1516

@Karn Tôi chỉ cần thêm một số giải thích cho các lệnh substrgsub.
John1024

@ John Khá tuyệt vời, điều đó giúp ích rất nhiều. Có bất kỳ khả năng để loại bỏ các trích dẫn với "-F" với awk, chỉ là một câu hỏi ngớ ngẩn trong tâm trí của tôi.
krock1516

@Karn Không điên chút nào. Tôi chỉ cần thêm một -Fgiải pháp.
John1024

@ John thx .. Tôi cũng đã thử nó hoạt động tương tự.
krock1516
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.