กำลังรับตัวแปรเชลล์เข้า 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 และตัวแปร
อ่านคำถามที่พบบ่อยนี้