วิธีเขียน `awk here document`


0

ฉันมีสคริปต์ทุบตี:

#!/bin/bash

gawk -f realmap.awk realmap.log | column -ts: > realmap.csv

gnuplot <<-_EOF_
    set term png
    set out 'realmap.png'
    set xlabel 'index'
    set ylabel 'bytes'
    set style data lp
    plot 'realmap.csv' u 1:2 t col, '' u 1:3 t col, '' u 1:4 t col, '' u 1:5 t col, '' u 1:6 t col, '' u 1:7 t col
_EOF_

rm realmap.csv

display realmap.png

และสคริปต์ awk:

#!/usr/bin/gawk -f

BEGIN{
    printf("%s:%s:%s:%s:%s:%s:%s\n", "index", "total", "used", "free", "cached", "buffers", "cache")
}

/^#/{
    gsub("#", "")
    printf("%d:", $0+1)
}

/^M/{
    printf("%d:%d:%d:%d:", $2,$3,$4,$7)
}

/^-/{
    printf("%d:%d\n", $3, $4)
}

จะรวมสคริปต์ทั้งสองนี้เป็นหนึ่งเดียวได้อย่างไร


คุณหมายถึงอะไรโดยการรวม ??? ชุดค่าผสมขึ้นอยู่กับฟังก์ชันการทำงานที่คุณต้องการบรรลุ ...
Vineet Menon

คำตอบ:


1

คุณไม่จำเป็นต้องมี "เอกสารที่นี่" เพียงวางโปรแกรม awk ทั้งหมด - เสนอราคาอย่างถูกต้องเพื่อไม่ให้เชลล์อัญประกาศและ metacharacters ทั้งหมดอยู่ภายในและเชลล์ linefeeds และช่องว่างอื่น ๆ ไม่ได้ทำให้มันถูกแยกเป็นหลายอาร์กิวเมนต์โดยเชลล์ - อาร์กิวเมนต์บรรทัดคำสั่งแรกโดยไม่ใช้ awk 's -f ตัวเลือก ไม่มี -fอาร์กิวเมนต์บรรทัดคำสั่งแรกคือโปรแกรมที่จะเรียกใช้ awk หน้าคู่มือคือเพื่อนของคุณ


1
คุณมีตัวอย่างหรือไม่
David Given

5

บันทึก:

สคริปต์การบริโภคตัวเอง รูปแบบในตัวอย่างโค้ดที่ 2 สามารถใช้สำหรับสิ่งใดก็ได้ที่อ่านไฟล์ อย่าถูกรบกวนจากการใช้ OP ของ awk.

ตอบ:

สิ่งที่คุณถามหาเป็น heredoc มันเป็นเรื่องยุ่งยากที่จะใช้ในกรณีนี้ แต่ฉันรัก heredocs ดังนั้นฉันจะแสดงวิธีทำ คุณต้องรวมคุณสมบัติทุบตีที่รู้จักน้อยลง การทดแทนกระบวนการ ด้วย & lt; ()

#!/bin/bash

  # The <( begins a process substitution. It's valid to use with -f because what gets
  # substituted is a file descriptor like /dev/fd/5
  # The quoting on '_EOF_' prevents the shell from expanding the contents of the heredoc,
  # as if it were a big double quoted string. So, your $2, $3, etc. are safe.
gawk -f <(cat - <<-'_EOF_'
    BEGIN{
        printf("%s:%s:%s:%s:%s:%s:%s\n", "index", "total", "used", "free", "cached", "buffers", "cache")
    }

    /^#/{
        gsub("#", "")
        printf("%d:", $0+1)
    }

    /^M/{
        printf("%d:%d:%d:%d:", $2,$3,$4,$7)
    }

    /^-/{
        printf("%d:%d\n", $3, $4)
    }
_EOF_
) realmap.log | column -ts: > realmap.csv

gnuplot <<-_EOF_
    set term png
    set out 'realmap.png'
    set xlabel 'index'
    set ylabel 'bytes'
    set style data lp
    plot 'realmap.csv' u 1:2 t col, '' u 1:3 t col, '' u 1:4 t col, '' u 1:5 t col, '' u 1:6 t col, '' u 1:7 t col
_EOF_

rm realmap.csv

display realmap.png

นั่นคือคำตอบที่คุณถาม ตอนนี้วิธีที่ฉันจะทำก็คือสิ่งที่ฉันเรียกว่ารูปแบบสคริปต์ที่ใช้งานได้เอง

#!/bin/bash

  # The <( begins a process substitution. It's valid to use with -f because what gets
  # substituted is a file descriptor like /dev/fd/5
  # Notice the use of brackets. That prevents the following line from matching itself.
gawk -f <(sed -e '/[B]EGIN_AWK1/,/[E]ND_AWK1/!d' $0) realmap.log | column -ts: > realmap.csv

gnuplot <<-_EOF_
    set term png
    set out 'realmap.png'
    set xlabel 'index'
    set ylabel 'bytes'
    set style data lp
    plot 'realmap.csv' u 1:2 t col, '' u 1:3 t col, '' u 1:4 t col, '' u 1:5 t col, '' u 1:6 t col, '' u 1:7 t col
_EOF_

rm realmap.csv

display realmap.png

exit  ## Execution stops here. The rest is consumed by subprocesses of this script!

#BEGIN_AWK1
    BEGIN{
        printf("%s:%s:%s:%s:%s:%s:%s\n", "index", "total", "used", "free", "cached", "buffers", "cache")
    }

    /^#/{
        gsub("#", "")
        printf("%d:", $0+1)
    }

    /^M/{
        printf("%d:%d:%d:%d:", $2,$3,$4,$7)
    }

    /^-/{
        printf("%d:%d\n", $3, $4)
    }
#END_AWK1

สำหรับฉันที่ค่อนข้างง่ายต่อการติดตามและคุณสามารถใส่ AWK หลายตัวหรือสคริปต์อื่น ๆ ไว้ในไฟล์เดียวโดยการเพิ่มตัวคั่น

เพลิดเพลินไปกับการทุบตี! อย่าลังเลที่จะเยี่ยมชม #bash บน freenode เพื่อรับคำตอบที่รวดเร็วยิ่งขึ้น

สำหรับข้อมูลเพิ่มเติมดู http://tldp.org/LDP/abs/html/process-sub.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.