में शेल चर प्राप्त करना 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
का उपयोग करके भी जोड़ा जा सकता है जो उन्हें समर्थन करते हैं (बैश सहित):
awk '{print $0}' <<< "$variable"
test
यह समान है:
printf '%s' "$variable" | awk '{print $0}'
PS इस चर को फ़ाइल इनपुट के रूप में मानता है।
ENVIRON
इनपुट
जैसा कि TrueY लिखता है, आप पर्यावरण चरENVIRON
प्रिंट करने के लिए उपयोग कर सकते हैं । AWK चलाने से पहले एक चर सेट करना, आप इसे इस तरह प्रिंट कर सकते हैं:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
इनपुट
जैसा कि स्टीवन पेनी लिखते हैं, आप ARGV
डेटा को जागृत करने के लिए उपयोग कर सकते हैं :
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 और चर के बारे में अधिक जानकारी
इस FAQ पढ़ें ।