Corak, Julat dan Blok BEGIN/END
Tapis rekod dengan corak bersyarat dan hasilkan pengepala serta jumlah menggunakan blok BEGIN dan END
Corak, Julat dan Blok BEGIN/END ialah pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Penguasaan Baris Perintah Linux & Penskripan Bash, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Penguasaan Baris Perintah Linux & Penskripan Bash merangkumi sejumlah 4 pelajaran.
Apakah Corak awk?
Dalam awk, corak ialah syarat yang mengawal sama ada blok tindakan dilaksanakan untuk sesuatu baris input. Bentuk umum ialah:
awk 'pattern { action }' fileJika corak sepadan dengan rekod semasa, tindakan dijalankan. Jika tiada tindakan diberikan, awk mencetak seluruh baris secara lalai. Corak boleh berupa:
- Ungkapan nalar —
/regex/ - Ungkapan hubungan —
$3 > 100 - Ungkapan gabungan —
$1 == "ERROR" && $4 > 500 - Corak julat —
/start/,/end/ - Corak khas —
BEGINdanEND
Memahami corak ialah pintu masuk untuk menggunakan awk sebagai penapis data yang berkuasa, bukan sekadar pencetak lajur.
Corak Ungkapan Nalar untuk Menapis Baris
Jenis corak yang paling biasa ialah ungkapan nalar yang diapit oleh garis miring. awk menguji setiap baris terhadap ungkapan nalar tersebut dan menjalankan tindakan hanya pada padanan.
Di bawah, kami menapis fail bergaya /var/log/syslog untuk memaparkan hanya baris yang mengandungi perkataan ERROR:
#!/usr/bin/env bash
# Simulate a log file and filter ERROR lines
log=$(cat <<'EOF'
2026-06-11 08:01:22 INFO service started
2026-06-11 08:02:05 ERROR disk quota exceeded on /dev/sda1
2026-06-11 08:02:44 WARN memory usage at 80%
2026-06-11 08:03:10 ERROR connection timeout to 10.0.0.5
2026-06-11 08:03:55 INFO backup completed
EOF
)
echo "=== ERROR lines only ==="
echo "$log" | awk '/ERROR/ { print NR": "$0 }'Corak Negasi dan Gabungan
Awali corak ungkapan nalar dengan ! untuk menafikannya — ini sepadan dengan baris yang tidak mengandungi corak tersebut. Gabungkan beberapa syarat dengan && (AND) atau || (OR) untuk kawalan yang lebih terperinci.
!/DEBUG/— langkau baris nyahpepijat$3 > 500 && $5 == "POST"— permintaan POST yang besar/WARN/ || /ERROR/— mana-mana satu tahap keterukan
Contoh di bawah menghuraikan log akses ringkas dan mencetak hanya permintaan POST dengan saiz respons melebihi 1000 byte:
#!/usr/bin/env bash
access=$(cat <<'EOF'
10.0.0.1 GET /api/ping 200 48
10.0.0.2 POST /api/upload 201 2048
10.0.0.3 GET /api/users 200 512
10.0.0.4 POST /api/data 200 3500
10.0.0.5 POST /api/health 200 60
EOF
)
echo "Large POST requests (>1000 bytes):"
echo "$access" | awk '$2 == "POST" && $5 > 1000 { print $1, $3, "size="$5 }'Corak Julat: /start/,/end/
Corak julat memilih blok rekod berjujukan — daripada baris yang sepadan dengan /start/ hingga baris yang sepadan dengan /end/, termasuk kedua-duanya. Sintaksnya ialah:
awk '/start/,/end/ { action }' fileTingkah laku penting yang perlu diketahui:
- Julat diaktifkan pada baris pertama yang sepadan dengan
/start/dan dinyahaktifkan selepas baris seterusnya yang pertama sepadan dengan/end/. - Jika
/end/tidak pernah sepadan, julat kekal aktif sehingga EOF. - Beberapa julat yang tidak bertindih dalam fail yang sama diproses secara berasingan.
Oleh itu, corak julat amat sesuai untuk mengekstrak bahagian bertanda daripada fail konfigurasi, log dengan pengepala pembatas atau laporan berbilang blok.
Mengekstrak Bahagian dengan Corak Julat
Pertimbangkan konfigurasi pelayan yang mempunyai beberapa bahagian bernama, dengan pembatas berupa pengepala [section]. Kami hanya mahu baris dalam [database]:
#!/usr/bin/env bash
config=$(cat <<'EOF'
[server]
host = 0.0.0.0
port = 8080
[database]
host = 127.0.0.1
port = 5432
name = appdb
user = admin
[cache]
host = 127.0.0.1
port = 6379
EOF
)
echo "=== [database] section ==="
echo "$config" | awk '/\[database\]/,/^\[/' \
| awk 'NR > 1 && !/^\[/ && NF'Blok BEGIN
Blok BEGIN dijalankan sekali sebelum sebarang input dibaca. Blok ini sesuai untuk:
- Mencetak pengepala laporan
- Memulakan pemboleh ubah dan pembilang
- Menetapkan pemisah medan (
FS) atau pemboleh ubah terbina dalam yang lain - Menjalankan program
awkkendiri yang tidak memerlukan input
Sintaks:
awk 'BEGIN { setup } pattern { action }' fileMenetapkan FS dalam BEGIN ialah alternatif yang kemas kepada bendera -F — khususnya berguna apabila menulis program berbilang peraturan yang logik pemisahnya berada dalam skrip.
#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)
echo "$csv" | awk 'BEGIN {
FS = ","
printf "%-10s %-15s %10s\n", "Name", "Department", "Salary"
print "--------------------------------------------"
}'Blok END
Blok END dijalankan sekali selepas rekod terakhir diproses. Blok ini merupakan tempat semula jadi untuk:
- Mencetak jumlah, purata dan ringkasan yang dikumpulkan semasa pemprosesan
- Mengosongkan penimbal atau menutup fail output
- Mencetak baris pengaki untuk laporan berformat
Pemboleh ubah yang ditetapkan semasa peraturan utama masih berada dalam skop di dalam END — beginilah jumlah berjalan berfungsi. Contoh di bawah menjumlahkan nilai gaji daripada CSV dan mencetak jumlah itu pada pengaki:
#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)
echo "$csv" | awk -F',' '
{ total += $3; count++ }
END { printf "Employees: %d Total payroll: $%d\n", count, total }
'Menggabungkan BEGIN, Peraturan dan END
Kuasa sebenar terserlah apabila anda menggabungkan ketiga-tiga blok ke dalam satu program awk kendiri yang mencetak pengepala, memproses setiap rekod dan mencetak ringkasan. Corak ini menjadi asas kepada saluran paip pelaporan berasaskan shell.
Di bawah ialah penjana laporan lengkap yang membaca CSV permintaan web dan mencetak butiran setiap baris serta kiraan akhir permintaan yang melebihi 1 saat:
#!/usr/bin/env bash
data=$(cat <<'EOF'
/api/ping,0.03
/api/users,1.45
/api/login,0.88
/api/upload,2.10
/api/health,0.02
/api/report,1.73
EOF
)
echo "$data" | awk -F',' '
BEGIN {
printf "%-20s %10s %s\n", "Endpoint", "Latency(s)", "Status"
print "--------------------------------------"
}
{
status = ($2 > 1.0) ? "SLOW" : "OK"
if (status == "SLOW") slow++
printf "%-20s %10s %s\n", $1, $2, status
}
END {
print "--------------------------------------"
printf "Slow requests: %d / %d\n", slow, NR
}
'Menggunakan BEGIN untuk Menetapkan OFS dan ORS
Dua pemboleh ubah output yang sering terlepas pandang boleh ditetapkan dengan kemas dalam BEGIN:
- OFS (Pemisah Medan Output) — disisipkan antara medan apabila anda membina semula rekod dengan
$1=$1atau menggunakanprint $1, $2 - ORS (Pemisah Rekod Output) — ditambah selepas setiap panggilan
print(lalainya ialah\n)
Menetapkan OFS="," membolehkan anda memformatkan semula TSV kepada CSV dalam satu laluan tanpa penggabungan rentetan. Menukar ORS kepada "\n---\n" menambah pembahagi antara rekod secara automatik.
#!/usr/bin/env bash
# Convert whitespace-delimited data to CSV with a header
data=$(cat <<'EOF'
alice engineering 95000
bob marketing 72000
carol engineering 105000
EOF
)
echo "$data" | awk 'BEGIN { OFS=","; print "name,dept,salary" }
{ $1=$1; print }'Corak Julat Praktikal: Tetingkap Insiden Log
Corak julat amat berguna dalam analisis log operasi. Tugas yang biasa ialah mengekstrak semua baris log antara permulaan dan pengakhiran sesuatu insiden, yang dikenal pasti melalui mesej penanda seperti INCIDENT START dan INCIDENT END.
Dalam contoh di bawah, awk hanya mengekstrak baris dalam tetingkap insiden dan mengira peristiwa ERROR di dalamnya — dengan menggabungkan corak julat, pengumpul dan ringkasan END:
#!/usr/bin/env bash
log=$(cat <<'EOF'
08:00:01 INFO Normal operation
08:01:00 INFO INCIDENT START: disk pressure detected
08:01:05 ERROR write failed on /dev/sda1
08:01:09 ERROR inode table corruption
08:01:14 WARN remounting read-only
08:01:22 INFO INCIDENT END: disk replaced
08:02:00 INFO Normal operation resumed
EOF
)
echo "$log" | awk '
/INCIDENT START/,/INCIDENT END/ {
print
if (/ERROR/) errors++
}
END { print "Errors during incident:", errors+0 }
'Melangkau Baris Pembatas dalam Julat
Secara lalai, corak julat menyertakan baris yang sepadan dengan /start/ dan /end/ itu sendiri. Untuk melangkau baris pembatas tersebut dan mengekalkan hanya kandungan di antaranya, lindungi tindakan dengan penafian atau pemboleh ubah bendera:
- Pendekatan penafian:
/start/,/end/ { if (!/start/ && !/end/) print } - Pendekatan bendera: tetapkan pemboleh ubah secara manual kepada 1 pada
/start/dan 0 pada/end/
Pendekatan bendera lebih teguh apabila teks pembatas mungkin turut muncul dalam kandungan isi:
#!/usr/bin/env bash
doc=$(cat <<'EOF'
## preamble
some intro text
## BEGIN_REPORT
row1: alpha 100
row2: beta 200
row3: gamma 150
## END_REPORT
## appendix
EOF
)
echo "$doc" | awk '
/## BEGIN_REPORT/ { capture=1; next }
/## END_REPORT/ { capture=0 }
capture { print }
'Semakan Pengetahuan: Tingkah Laku Blok BEGIN
Uji pemahaman anda tentang cara blok BEGIN dan END berinteraksi dengan pemprosesan input dalam awk.
Imbas Kembali Pelajaran: Corak, Julat dan BEGIN/END
Dalam pelajaran ini, anda telah menguasai tiga ciri struktur program awk yang paling berkuasa:
- Corak — ungkapan nalar (
/ERROR/), hubungan ($3 > 1000), negasi (!/DEBUG/) dan gabungan (&&,||) — mengawal rekod yang mencetuskan tindakan tanpa memerlukan pernyataanifyang jelas. - Corak julat (
/start/,/end/) — memilih blok rekod berjujukan, sesuai untuk mengekstrak tetingkap insiden log, bahagian konfigurasi dan segmen laporan. Gunakan pemboleh ubah bendera (next+ boolean) apabila anda perlu mengecualikan baris pembatas itu sendiri. - Blok BEGIN — dijalankan sekali sebelum sebarang input; sesuai untuk menetapkan
FS,OFS,ORS, memulakan pembilang dan mencetak pengepala laporan. - Blok END — dijalankan sekali selepas semua input; tempat yang sesuai untuk mencetak jumlah, purata dan pengaki menggunakan pemboleh ubah yang dikumpulkan dalam peraturan utama.
Secara bersama, ciri-ciri ini membolehkan anda menulis program awk yang lengkap dan mendokumentasikan dirinya sendiri, yang menerima teks mentah dan menghasilkan laporan berstruktur yang mudah dibaca manusia — semuanya dalam satu peringkat saluran paip tanpa fail sementara atau alat luaran.
Pelajari Bash dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 22
- Pelajaran
- 88
Soalan Lazim
Adakah pelajaran “Corak, Julat dan Blok BEGIN/END” percuma?
Ya — teks penuh “Corak, Julat dan Blok BEGIN/END” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Penguasaan Baris Perintah Linux & Penskripan Bash, tingkat taraf kepada CoddyKit PRO. Kursus Penguasaan Baris Perintah Linux & Penskripan Bash merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Corak, Julat dan Blok BEGIN/END”?
Tapis rekod dengan corak bersyarat dan hasilkan pengepala serta jumlah menggunakan blok BEGIN dan END Anda berlatih Penguasaan Baris Perintah Linux & Penskripan Bash menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Penguasaan Baris Perintah Linux & Penskripan Bash?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Penguasaan Baris Perintah Linux & Penskripan Bash di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Corak, Julat dan Blok BEGIN/END” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash ini?
Ya. Setiap pelajaran Penguasaan Baris Perintah Linux & Penskripan Bash menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Rekod, Medan dan Pemisah Tersuai dalam awk
- Corak, Julat dan Blok BEGIN/END
- Pengagregatan dengan Tatasusunan dan Pengumpulan awk
- Fungsi awk, Pemformatan printf dan Penjanaan Laporan