บันทึก:
สคริปต์การบริโภคตัวเอง รูปแบบในตัวอย่างโค้ดที่ 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