DevOps बूटकैंप · पाठ

awk में रिकॉर्ड, फ़ील्ड और कस्टम विभाजक

इनपुट और आउटपुट फ़ील्ड विभाजकों को नियंत्रित करके CSV, TSV और लॉग पंक्तियों को साफ़ कॉलम में बाँटें।

पाठ 1, कुल 4 में से13 चरण

awk में रिकॉर्ड, फ़ील्ड और कस्टम विभाजक, CoddyKit पर DevOps बूटकैंप का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह DevOps बूटकैंप सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। DevOps बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

awk में रिकॉर्ड और फ़ील्ड क्या होते हैं

awk इनपुट को पंक्ति-दर-पंक्ति पढ़ता है। हर पंक्ति को रिकॉर्ड कहा जाता है और उस पंक्ति के भीतर खाली स्थान से अलग किए गए हर खंड को फ़ील्ड कहा जाता है।

  • $0 — वर्तमान रिकॉर्ड (पूरी पंक्ति)
  • $1 — पहला फ़ील्ड
  • $2 — दूसरा फ़ील्ड
  • $NF — अंतिम फ़ील्ड (NF = फ़ील्डों की संख्या)

डिफ़ॉल्ट रूप से awk फ़ील्डों को खाली स्थान की किसी भी लगातार श्रृंखला (स्पेस या टैब) पर विभाजित करता है। इससे यह लॉग विश्लेषण, कमांड आउटपुट और खाली स्थान से अलग किए गए डेटा के लिए तुरंत उपयोगी बन जाता है।

#!/usr/bin/env bash
# Show how awk sees records and fields
echo 'alice 30 engineer' | awk '{ print "Name:", $1, "Age:", $2, "Role:", $3 }'

# $NF is always the last field — regardless of how many there are
echo 'one two three four five' | awk '{ print "Last field:", $NF }'

इनपुट फ़ील्ड विभाजक: FS

अंतर्निर्मित चर FS (फ़ील्ड विभाजक) awk को बताता है कि हर रिकॉर्ड को फ़ील्डों में कैसे बाँटना है। इसका डिफ़ॉल्ट मान एकल स्पेस है, जो खाली-स्थान-विभाजन मोड सक्रिय करता है।

आप FS को दो तरीकों से निर्धारित कर सकते हैं:

  • कमांड लाइन पर -F ध्वज के साथ: awk -F':'
  • BEGIN खंड के भीतर: BEGIN { FS = ":" }

दोनों समान हैं। लंबे स्क्रिप्टों में BEGIN खंड वाला तरीका पसंद किया जाता है, क्योंकि इससे विन्यास स्क्रिप्ट के भीतर ही रहता है और वह अधिक पठनीय तथा पोर्टेबल बनती है।

#!/usr/bin/env bash
# Parse /etc/passwd using ':' as the field separator
# Field 1 = username, field 3 = UID, field 7 = shell
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin' \
  | awk -F':' '{ print $1, "UID="$3, "shell="$7 }'

BEGIN खंड में FS निर्धारित करना

एक-पंक्ति वाली स्क्रिप्ट से लंबी स्क्रिप्टों के लिए BEGIN खंड के भीतर FS रखना मानक तरीका है। BEGIN खंड awk के किसी भी इनपुट को पढ़ने से पहले चलता है, इसलिए पहला रिकॉर्ड आने तक विभाजक तैयार रहता है।

इस पद्धति से आप एक साथ कई चर निर्धारित कर सकते हैं, टिप्पणियाँ जोड़ सकते हैं और अपना तर्क एक स्क्रिप्ट फ़ाइल में स्व-निहित रख सकते हैं।

वास्तविक दुनिया में मिलने वाले सामान्य विभाजक:

  • कोलन : — /etc/passwd, /etc/shadow
  • टैब \t — TSV निर्यात, कंपाइलर आउटपुट
  • अल्पविराम , — CSV फ़ाइलें (सरल, उद्धृत फ़ील्ड के बिना)
  • पाइप | — कुछ लॉग प्रारूप, डेटाबेस डंप
#!/usr/bin/env bash
# awk script using BEGIN to set FS for TSV input
printf 'alice\t30\tengineer\nbob\t25\tdesigner\ncarol\t35\tmanager\n' \
  | awk 'BEGIN { FS = "\t" } { printf "%-10s age=%-3s role=%s\n", $1, $2, $3 }'

awk से CSV फ़ाइलों का विश्लेषण

CSV (अल्पविराम से अलग किए गए मान) शेल इंजीनियरिंग में सबसे सामान्य डेटा प्रारूपों में से एक है। FS="," निर्धारित करने पर awk अल्पविरामों को विभाजक मानता है।

महत्वपूर्ण सावधानी: awk का अंतर्निर्मित CSV प्रबंधन उन उद्धृत फ़ील्डों को संभालता नहीं है जिनमें अल्पविराम हों (जैसे, "Smith, John")। उद्धृत अल्पविरामों के बिना सरल CSV के लिए यह पूरी तरह ठीक काम करता है। उद्धृत फ़ील्ड वाले RFC 4180-अनुरूप CSV के लिए उचित CSV विश्लेषक या miller/csvkit का उपयोग करें।

वास्तविक दुनिया का एक सामान्य कार्य विशेष स्तंभ निकालना और मान के आधार पर पंक्तियों को छाँटना है — FS निर्धारित होने के बाद awk से दोनों काम बहुत सरल हैं।

#!/usr/bin/env bash
# Simple CSV: extract name and salary columns, filter salary > 50000
data='name,department,salary
alice,engineering,95000
bob,marketing,48000
carol,engineering,112000
dave,hr,45000'

echo "$data" | awk -F',' '
  NR == 1 { next }          # skip header row
  $3 > 50000 { print $1, "earns", $3 }
'

बहु-अक्षरीय और रेगेक्स फ़ील्ड विभाजक

awk का FS केवल एक अक्षर तक सीमित नहीं है — यह एक रेगुलर एक्सप्रेशन भी हो सकता है। यह उन वास्तविक लॉग प्रारूपों के लिए शक्तिशाली है जिनमें फ़ील्ड अलग-अलग लंबाई वाले विभाजकों से अलग होते हैं।

रेगेक्स विभाजकों के उदाहरण:

  • FS = "[,;]" — अल्पविराम या अर्धविराम, किसी एक पर विभाजित करें
  • FS = "[ \t]+" — एक या अधिक स्पेस/टैब पर विभाजित करें (डिफ़ॉल्ट के समान, लेकिन स्पष्ट)
  • FS = "::" — शाब्दिक दोहरे कोलन पर विभाजित करें
  • FS = "\\|" — पाइप अक्षर पर विभाजित करें (एस्केप करना आवश्यक है)

जब FS रेगेक्स होता है, तो awk (gawk) उसे शाब्दिक स्ट्रिंग के बजाय एक प्रतिरूप मानता है।

#!/usr/bin/env bash
# Log lines with mixed delimiters: split on " | " or "::" or ","
# Here we split on one or more spaces or pipe characters
printf '2024-01-15 | ERROR | disk full | /dev/sda1\n2024-01-15 | INFO  | startup ok | main\n' \
  | awk -F' \\| ' '{ printf "date=%-12s level=%-6s msg=%s\n", $1, $2, $3 }'

# Split on multiple possible delimiters using character class
echo 'alpha,beta;gamma,delta;epsilon' \
  | awk -F'[,;]' '{ for(i=1; i<=NF; i++) print i": "$i }'

आउटपुट फ़ील्ड विभाजक: OFS

OFS (आउटपुट फ़ील्ड विभाजक) यह नियंत्रित करता है कि जब आप print से रिकॉर्ड का पुनर्निर्माण करते हैं, तो awk फ़ील्डों के बीच क्या रखता है। इसका डिफ़ॉल्ट मान एकल स्पेस है।

मुख्य बात यह है: OFS फ़ील्डों के बीच तभी डाला जाता है जब आप print में अल्पविराम वाले वाक्य-विन्यास का उपयोग करते हैं या किसी फ़ील्ड को मान देते हैं और awk $0 का पुनर्निर्माण करता है। यदि आप स्रोत कोड में स्पेस के साथ संयोजन करते हैं, तो OFS का उपयोग नहीं होता।

  • print $1, $2, $3 — अल्पविराम फ़ील्डों के बीच OFS सक्रिय करते हैं
  • print $1 " " $2 — स्पष्ट स्पेस, OFS की उपेक्षा होती है

एक सामान्य पद्धति: FS="," और OFS="\t" निर्धारित करके CSV पढ़ें, रूपांतरित करें और TSV लिखें।

#!/usr/bin/env bash
# Convert CSV to TSV using FS and OFS
data='alice,30,engineer
bob,25,designer
carol,35,manager'

echo "$data" | awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2, $3 }'

echo '---'

# OFS also applies when you modify a field — awk rebuilds $0 with OFS
echo 'alice,30,engineer' | awk 'BEGIN { FS=","; OFS=" | " } { $1=$1; print $0 }'

OFS से awk को $0 का पुनर्निर्माण करवाना

एक सूक्ष्म लेकिन महत्वपूर्ण युक्ति है: किसी भी फ़ील्ड को मान देना (यहाँ तक कि फ़ील्ड को स्वयं का मान देना, $1=$1) awk को सभी फ़ील्डों को OFS से जोड़कर $0 का पुनर्निर्माण करने के लिए बाध्य करता है।

रिकॉर्ड के विभाजकों को हर फ़ील्ड को हाथ से प्रिंट किए बिना पुन:स्वरूपित करने का यह आदर्श तरीका है:

  • FS को इनपुट विभाजक पर निर्धारित करें
  • OFS को इच्छित आउटपुट विभाजक पर निर्धारित करें
  • $1=$1 से पुनर्निर्माण शुरू करें
  • $0 प्रिंट करें

यह तरीका किसी भी संख्या में फ़ील्डों के लिए काम करता है और $1, $2, $3, ... को पहले से लिखने से बचाता है।

#!/usr/bin/env bash
# Reformat a pipe-delimited file to comma-separated WITHOUT listing every field
printf 'alice|30|engineer|london\nbob|25|designer|paris\ncarol|35|manager|berlin\n' \
  | awk 'BEGIN { FS="|"; OFS="," } { $1=$1; print $0 }'

# Useful when you don't know how many fields there are:
printf 'a|b|c|d|e|f|g\n1|2|3|4|5|6|7\n' \
  | awk 'BEGIN { FS="|"; OFS="\t" } { $1=$1; print $0 }'

रिकॉर्ड विभाजक: RS

जिस तरह FS किसी रिकॉर्ड के भीतर फ़ील्ड को अलग करता है, उसी तरह RS (रिकॉर्ड विभाजक) यह निर्धारित करता है कि रिकॉर्ड एक-दूसरे से कैसे अलग होंगे। डिफ़ॉल्ट रूप से RS newline होता है, इसलिए awk एक बार में एक पंक्ति को संसाधित करता है।

RS बदलने पर बहु-पंक्ति रिकॉर्ड का शक्तिशाली संसाधन संभव हो जाता है:

  • RS="" — अनुच्छेद मोड: रिक्त पंक्तियाँ रिकॉर्ड को अलग करती हैं (फ़ील्ड कई पंक्तियों में हो सकते हैं)
  • RS=";" — अर्धविरामों पर विभाजन (SQL डंप के लिए उपयोगी)
  • RS="\n" — स्पष्ट newline (डिफ़ॉल्ट)

अनुच्छेद मोड (RS="") में बहु-पंक्ति रिकॉर्ड के भीतर फ़ील्ड को विभाजित करने के लिए FS का उपयोग जारी रहता है, और रिकॉर्ड के भीतर के newline भी अपने-आप फ़ील्ड विभाजक माने जाते हैं।

#!/usr/bin/env bash
# Paragraph mode: each blank-line-separated block is one record
# Useful for processing structured text blocks (e.g., stanzas, config sections)
data='Name: Alice
Role: Engineer
City: London

Name: Bob
Role: Designer
City: Paris'

echo "$data" | awk 'BEGIN { RS=""; FS="\n" } {
  print "Record", NR":"
  for (i=1; i<=NF; i++) print "  ", $i
  print ""
}'

आउटपुट रिकॉर्ड विभाजक: ORS

ORS (आउटपुट रिकॉर्ड विभाजक) प्रत्येक print कथन के बाद प्रिंट होता है। डिफ़ॉल्ट रूप से यह newline (\n) होता है, इसी कारण हर print नई पंक्ति में जाता है।

ORS बदलने से आप ये काम कर सकते हैं:

  • रिकॉर्ड को एक ही पंक्ति में जोड़ना: ORS=" "
  • आउटपुट रिकॉर्ड के बीच रिक्त पंक्तियाँ जोड़ना: ORS="\n\n"
  • JSON या XML अंश जैसे कस्टम आउटपुट प्रारूप बनाना

ध्यान दें कि printf ORS का उपयोग नहीं करता — यह केवल सीधे लिखे गए print कथन पर लागू होता है। जब आपको फ़ॉर्मैटिंग पर पूरा नियंत्रण चाहिए, तब printf का उपयोग करें।

#!/usr/bin/env bash
# Join all matching lines onto one line by setting ORS to a space
printf 'apple\nbanana\ncherry\ndate\n' | awk '{ ORS=" " } { print $0 }'
echo  # final newline

# Add a blank line after every output record for readability
printf 'alice 30 engineer\nbob 25 designer\ncarol 35 manager\n' \
  | awk 'BEGIN { ORS="\n\n" } { print $1, "is a", $3 }'

व्यावहारिक उदाहरण: Apache एक्सेस लॉग का विश्लेषण

Apache/nginx एक्सेस लॉग का प्रारूप सुविख्यात होता है और उनमें फ़ील्ड रिक्त स्थानों से अलग किए जाते हैं। कुछ फ़ील्ड (जैसे समय-चिह्न) में रिक्त स्थान होते हैं और वे कोष्ठक या उद्धरण चिह्नों में लिखे जाते हैं — इसलिए awk से सीधे फ़ील्ड विभाजित करना कठिन हो जाता है।

एक व्यावहारिक तरीका यह है कि संरचना को ध्यान में रखने वाला रेगेक्स FS उपयोग करें, या सटीक प्रारूप ज्ञात होने पर स्थिति के आधार पर विशिष्ट फ़ील्ड निकालें।

संयुक्त लॉग प्रारूप के फ़ील्ड लगभग इस प्रकार होते हैं:

  1. क्लाइंट IP
  2. पहचानकर्ता (आमतौर पर -)
  3. प्रमाणीकरण उपयोगकर्ता (आमतौर पर -)
  4. समय-चिह्न (कोष्ठकों में, एक टोकन माना जाता है)
  5. अनुरोध विधि+पथ+प्रोटोकॉल (उद्धरण चिह्नों में)
  6. HTTP स्थिति कोड
  7. प्रतिक्रिया के बाइट
#!/usr/bin/env bash
# Parse a simulated Apache Combined Log Format line
# Extract: IP, status code, bytes, and request path
logs='192.168.1.10 - alice [15/Jan/2024:10:23:45 +0000] "GET /api/users HTTP/1.1" 200 1523
10.0.0.5 - - [15/Jan/2024:10:23:46 +0000] "POST /login HTTP/1.1" 401 89
172.16.0.3 - bob [15/Jan/2024:10:23:47 +0000] "GET /dashboard HTTP/1.1" 200 8741'

echo "$logs" | awk '{
  ip     = $1
  status = $9
  bytes  = $10
  # Extract the request path from the quoted string in field 7
  split($7, parts, "/")
  path = "/" parts[2]
  printf "ip=%-15s status=%s bytes=%-6s endpoint=%s\n", ip, status, bytes, path
}'

FS, OFS, RS और ORS को प्रोसेसिंग श्रृंखला में मिलाना

वास्तविक शेल इंजीनियरिंग में आप इन विभाजकों का उपयोग शायद ही कभी अलग-अलग करते हैं। एक सामान्य प्रोसेसिंग श्रृंखला प्रतिरूप में awk को प्रोसेसिंग श्रृंखला के बीच एक प्रारूप परिवर्तक के रूप में उपयोग किया जाता है, जो एक संरचित प्रारूप को दूसरे में बदलता है।

विभाजकों को मिलाने से जुड़ी मुख्य बातें:

  • प्रारूप बदलते समय BEGIN में हमेशा FS और OFS दोनों निर्धारित करें
  • जब सभी फ़ील्ड को अलग-अलग लिखे बिना उनका पुनःप्रारूपण करना हो, तो $0 को फिर से बनाने के लिए $1=$1 का उपयोग करें
  • RS तभी बदलें जब आपके रिकॉर्ड वास्तव में कई पंक्तियों में फैले हों
  • आउटपुट रिकॉर्ड के बीच की दूरी नियंत्रित करने के लिए ORS का उपयोग करें
  • सटीक फ़ॉर्मैटिंग के लिए printf को प्राथमिकता दें; जब ORS का अपने-आप समाप्ति जोड़ना सुविधाजनक हो, तब print का उपयोग करें
#!/usr/bin/env bash
# Full pipeline: read a colon-delimited file,
# filter rows where field 3 (UID) >= 1000 (real users),
# then output as tab-separated: username, UID, home dir
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
alice:x:1001:1001:Alice:/home/alice:/bin/bash
bob:x:1002:1002:Bob:/home/bob:/bin/zsh
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin' \
  | awk 'BEGIN { FS=":"; OFS="\t" } $3 >= 1000 { print $1, $3, $6 }'

ज्ञान जाँच: OFS और फ़ील्ड का पुनर्निर्माण

जाँचें कि awk में फ़ील्ड असाइनमेंट के साथ OFS किस प्रकार काम करता है, यह आपकी समझ में आया है या नहीं।

पाठ का पुनरावलोकन: रिकॉर्ड, फ़ील्ड और विभाजक

अब आपके पास awk द्वारा संरचित डेटा को पढ़ने और लिखने के तरीके पर पूरा नियंत्रण है। चार विभाजक चरों का सारांश यहाँ दिया गया है:

  • FS — इनपुट फ़ील्ड विभाजक। इसे -F या BEGIN में निर्धारित करें। यह कोई वर्ण, स्ट्रिंग या रेगेक्स हो सकता है। डिफ़ॉल्ट: रिक्त स्थान।
  • OFS — आउटपुट फ़ील्ड विभाजक। print $1, $2 कॉल में फ़ील्ड के बीच और फ़ील्ड असाइनमेंट के बाद awk द्वारा $0 को फिर से बनाते समय इसे डाला जाता है। डिफ़ॉल्ट: एक रिक्त स्थान।
  • RS — इनपुट रिकॉर्ड विभाजक। यह निर्धारित करता है कि रिकॉर्ड (पंक्तियाँ) किससे अलग होंगे। डिफ़ॉल्ट: newline। अनुच्छेद मोड के लिए इसे रिक्त स्ट्रिंग पर सेट करें।
  • ORS — आउटपुट रिकॉर्ड विभाजक। प्रत्येक print के बाद जोड़ा जाता है। डिफ़ॉल्ट: newline। पंक्तियों को जोड़ने या उनके बीच दूरी बढ़ाने के लिए इसे बदलें।

याद रखने योग्य सबसे महत्वपूर्ण प्रतिरूप यह है: BEGIN में FS और OFS दोनों निर्धारित करें, फिर सभी फ़ील्ड में सीमांककों का पुनःप्रारूपण करने के लिए $1=$1 से $0 को फिर से बनाएँ, ताकि फ़ील्ड की स्थितियों को पहले से लिखना न पड़े। यह प्रतिरूप किसी भी संख्या में स्तंभों वाली फ़ाइलों के साथ काम करता है और awk-आधारित प्रारूप-परिवर्तन प्रोसेसिंग श्रृंखलाओं की नींव है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ DevOps बूटकैंप सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
142
पाठ
568

अक्सर पूछे जाने वाले प्रश्न

क्या “awk में रिकॉर्ड, फ़ील्ड और कस्टम विभाजक” पाठ निःशुल्क है?

हाँ — DevOps बूटकैंप अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “awk में रिकॉर्ड, फ़ील्ड और कस्टम विभाजक” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। DevOps बूटकैंप पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“awk में रिकॉर्ड, फ़ील्ड और कस्टम विभाजक” में मैं क्या सीखूँगा?

इनपुट और आउटपुट फ़ील्ड विभाजकों को नियंत्रित करके CSV, TSV और लॉग पंक्तियों को साफ़ कॉलम में बाँटें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ DevOps बूटकैंप का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या DevOps बूटकैंप शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर DevOps बूटकैंप शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“awk में रिकॉर्ड, फ़ील्ड और कस्टम विभाजक” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस DevOps बूटकैंप पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर DevOps बूटकैंप पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. awk में रिकॉर्ड, फ़ील्ड और कस्टम विभाजक
  2. पैटर्न, रेंज और BEGIN/END ब्लॉक
  3. awk ऐरे और समूहों से समुच्चयन
  4. awk फ़ंक्शन, printf फ़ॉर्मैटिंग और रिपोर्ट निर्माण
← DevOps बूटकैंप पर वापस जाएँ