Bash for Oracle DBAs قسمت هفتم پردازش حرفه‌ای متن با awk و sed

در قسمت قبل با grep ، cut و tr آشنا شدیم.

آن ابزارها برای کارهای ساده عالی هستند.

اما وقتی بخواهیم:

  • شرط روی ستون خاص بگذاریم
  • محاسبه انجام دهیم
  • متن را ویرایش کنیم
  • خروجی را قالب‌بندی کنیم

به ابزارهای قدرتمندتری نیاز داریم:

  • awk
  • sed

این دو ابزار ستون فقرات پردازش متن در لینوکس هستند.


بخش اول — awk

awk برای کار با داده‌های ستونی (column-based data) عالی است.

ساختار پایه:

awk 'pattern { action }' file

مثال ساده

نمایش ستون اول فایل /etc/passwd:

awk -F: '{print $1}' /etc/passwd

  • -F: → جداکننده :
  • $1 → ستون اول

شرط در awk

نمایش کاربرانی که UID آن‌ها بزرگ‌تر از 1000 است:

awk -F: '$3 > 1000 {print $1, $3}' /etc/passwd

در اینجا:

  • $3 → UID
  • اگر بزرگ‌تر از 1000 باشد
  • نام کاربر و UID چاپ می‌شود

این کار با grep به‌تنهایی ممکن نیست.


مثال واقعی برای DBA

بررسی استفاده از دیسک و هشدار در صورت بالا بودن:

df -h | awk '$5+0 > 80 {print $1, $5}'

توضیح:

  • $5 ستون درصد استفاده است
  • +0 برای تبدیل به عدد
  • اگر بیشتر از 80% باشد چاپ می‌شود

این الگو دقیقاً در اسکریپت‌های Monitoring استفاده می‌شود.


محاسبه با awk

فرض کنید بخواهیم مجموع فضای استفاده‌شده را محاسبه کنیم:

df -h | awk 'NR>1 {sum += $3} END {print sum}'

  • NR>1 → رد کردن header
  • sum += $3 → جمع کردن ستون سوم
  • END → بعد از پایان فایل اجرا می‌شود

بخش دوم — sed

sed برای ویرایش و جایگزینی متن استفاده می‌شود.

ساختار پایه:

sed 's/old/new/' file

جایگزینی ساده

echo "oracle db" | sed 's/oracle/ORACLE/'

جایگزینی همه موارد در خط

sed 's/error/ERROR/g' file.log

g یعنی تمام matchها در خط.


حذف خطوط خاص

حذف خطوط شامل DEBUG:

sed '/DEBUG/d' file.log

ویرایش مستقیم فایل

⚠ با احتیاط استفاده شود:

sed -i 's/oldvalue/newvalue/' config.conf

-i فایل را مستقیم تغییر می‌دهد.

در اسکریپت‌های production همیشه قبلش backup بگیرید.


مثال واقعی: تمیز کردن log

فرض کنید می‌خواهیم:

  • خطوط DEBUG حذف شوند
  • کلمه error بزرگ شود

sed '/DEBUG/d' app.log | sed 's/error/ERROR/g'

ترکیب awk و sed

قدرت واقعی زمانی است که آن‌ها را ترکیب کنیم.

مثلاً:

df -h | awk '$5+0 > 80 {print $1, $5}' | sed 's/%//'

  1. فایل‌سیستم‌های بالای 80%
  2. حذف علامت %

چه زمانی awk و چه زمانی sed؟

ابزار کاربرد اصلی
awk پردازش ستونی و محاسبه
sed ویرایش و جایگزینی متن

اگر با ستون و شرط عددی کار می‌کنید → awk

اگر جایگزینی یا حذف خط می‌خواهید → sed


تمرین

  1. کاربرانی که shell آن‌ها /bin/bash است با awk استخراج کنید.
  2. در یک فایل log تمام IPهای 192.168 را با sed حذف کنید.
  3. فایل‌سیستم‌هایی که بیشتر از 70% استفاده دارند را چاپ کنید.