กำลังรับตัวแปรเชลล์เข้า awk
อาจทำได้หลายวิธี บางคนดีกว่าคนอื่น สิ่งนี้ควรครอบคลุมส่วนใหญ่ หากคุณมีความคิดเห็นโปรดออกจากด้านล่าง v1.5
การใช้-v (วิธีที่ดีที่สุดพกพามากที่สุด)
ใช้-vตัวเลือก: (PS ใช้ช่องว่างหลังจากนั้น-vหรือจะพกพาได้น้อยลงเช่นawk -v var=ไม่ใช่awk -vvar=)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
สิ่งนี้ควรเข้ากันได้กับส่วนใหญ่awkและตัวแปรมีอยู่ในBEGINบล็อกด้วย:
หากคุณมีหลายตัวแปร:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
การเตือน อย่างที่เอ็ดมอร์ตันเขียนลำดับการหลบหนีจะถูกตีความดังนั้น\tจะกลายเป็นของจริงtabและไม่ใช่\tว่าเป็นสิ่งที่คุณค้นหา สามารถแก้ไขได้โดยใช้ENVIRON[]หรือเข้าถึงผ่านทางARGV[]
ป.ล.ถ้าคุณชอบแถบแนวตั้งสามเส้นเป็นตัวคั่น|||มันจะหนีไม่พ้นดังนั้นใช้-F"[|][|][|]"
ตัวอย่างการรับข้อมูลจากโปรแกรม / ฟังก์ชั่นอินน์ไปที่awk(ใช้วันที่นี่)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
ตัวแปรหลังจากโค้ดบล็อก
ที่นี่เราได้รับตัวแปรหลังจากawkรหัส สิ่งนี้จะทำงานได้ดีตราบใดที่คุณไม่ต้องการตัวแปรในBEGINบล็อก:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
awk '{print a,b,$0}' a="$var1" b="$var2" file
- ด้วยวิธีนี้เรายังสามารถตั้งค่าตัวคั่นฟิลด์ที่แตกต่างกัน
FSสำหรับแต่ละไฟล์
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- ตัวแปรหลังจากบล็อกรหัสจะไม่ทำงานสำหรับ
BEGINบล็อก:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
นี่สตริง
ตัวแปรยังสามารถเพิ่มให้กับการawkใช้สตริงที่นี่จากเปลือกหอยที่สนับสนุนพวกเขา (รวมถึง Bash):
awk '{print $0}' <<< "$variable"
test
นี่เป็นเช่นเดียวกับ:
printf '%s' "$variable" | awk '{print $0}'
ปล. นี้ถือว่าตัวแปรเป็นไฟล์อินพุต
ENVIRON อินพุต
ในฐานะที่เป็น TrueY เขียนคุณสามารถใช้ENVIRONในการพิมพ์ตัวแปรของสภาพแวดล้อม การตั้งค่าตัวแปรก่อนเรียกใช้ AWK คุณสามารถพิมพ์ออกมาดังนี้:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV อินพุต
อย่างที่ Steven Penny เขียนคุณสามารถใช้ARGVรับข้อมูลเป็น awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
ในการรับข้อมูลลงในโค้ดนั้นไม่ใช่แค่ BEGIN:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
ตัวแปรภายในรหัส: ใช้ด้วยความระมัดระวัง
คุณสามารถใช้ตัวแปรภายในawkรหัส แต่มันยุ่งและอ่านยากและตามที่Charles Duffyชี้ไปรุ่นนี้อาจตกเป็นเหยื่อของการฉีดโค้ด หากมีคนเพิ่มสิ่งที่ไม่ดีให้กับตัวแปรมันจะถูกเรียกใช้งานเป็นส่วนหนึ่งของawkรหัส
สิ่งนี้ทำงานโดยการแยกตัวแปรภายในโค้ดดังนั้นมันจึงกลายเป็นส่วนหนึ่งของมัน
หากคุณต้องการทำการawkเปลี่ยนแปลงแบบไดนามิกด้วยการใช้ตัวแปรคุณสามารถทำได้ด้วยวิธีนี้ แต่อย่าใช้สำหรับตัวแปรปกติ
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
นี่คือตัวอย่างของการฉีดรหัส:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
คุณสามารถเพิ่มคำสั่งมากมายawkด้วยวิธีนี้ แม้แต่ทำให้มันล้มเหลวด้วยคำสั่งที่ไม่ถูกต้อง
ข้อมูลเสริม:
ใช้เครื่องหมายคำพูดคู่
มันเป็นการดีเสมอที่"$variable"
จะใส่เครื่องหมายคำพูดคู่หากไม่ได้จะเพิ่มหลายบรรทัดเป็นบรรทัดเดียวที่ยาว
ตัวอย่าง:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
ข้อผิดพลาดอื่น ๆ ที่คุณจะได้รับโดยไม่ต้องใส่เครื่องหมายคำพูดคู่:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
และด้วยเครื่องหมายคำพูดเดี่ยวมันไม่ได้เป็นการเพิ่มค่าของตัวแปร:
awk -v var='$variable' 'BEGIN {print var}'
$variable
ข้อมูลเพิ่มเติมเกี่ยวกับ AWK และตัวแปร
อ่านคำถามที่พบบ่อยนี้