AWK

AWK یک زبان برنامه‌نویسی مفسری است که برای پردازش متن طراحی شده و عموما به عنوان ابزاری برای گزارش‌گیری و استخراج داده‌ها مورد استفاده قرار می‌گیرد. این زبان برنامه‌نویسی، تبدیل به یکی از ویژگی‌های استاندارد در سیستم‌عامل‌های خانواده یونیکس شده‌است.
زبان AWK در دهه ۱۹۷۰ در آزمایش‌گاه‌های بل طراحی شد. نام این زبان از نام خانوادگی طراحان آن Alfred Aho, Peter Weinberger, و Brian Kernighan گرفته شده‌است. سرواژه AWK در زبان انگلیسی، عمدتا مشابه نام پرنده auk تلفظ می‌شود، که تصویری از این پرنده بر روی جلد کتاب زبان برنامه‌نویسی AWK استفاده شده است، هرچند که AWK به صورت مجزا و حرف‌به‌حرف هم تلفظ می‌شود.
زبان برنامه‌نویسی AWK یک زبان اسکریپتی داده‌محور است؛ این زبان عموما از یکسری دوجفتی الگو (pattern) و عمل (action) تشکیل می‌شود که قرار است بر روی یکسری داده‌های متنی اجرا شود؛ که این داده‌های متنی یا از فایل‌های عادی خوانده می‌شوند، یا اینکه از طریق خط لوله بدست می‌آیند. به کمک AWK می‌توان اطلاعاتی را از این داده‌های متنی استخراج کرد یا اینکه گزارش‌هایی قالب‌بندی‌شده از آن‌ها تهیه کرد. این زبان به‌طور گسترده‌ای از نوع‌داده string (رشته)، آرایه‌های انجمنی (آرایه‌ای که با کلیدرشته اندیس‌گزاری می‌شود) و عبارات باقاعده استفاده می‌کند. در حالی که دامنه استفاده محدودی برای زبان AWK در نظر گرفته شده، و این زبان خصوصا برای نوشتن برنامه‌های یک‌خطی طراحی شده، AWK یک زبان Turing-complete است و حتی کاربران اولیه AWK در آزمایش‌گاه‌های بل نیز برنامه‌های بزرگ با ساختاربندی خوب به زبان AWK می‌نوشتند.
تاریخچه
زبان برنامه‌نویسی AWK در ابتدا در سال ۱۹۷۷ توسط Alfred Aho, Peter Weinberger, و Brian Kernighan ساخته شد. نام این زبان از حرف اول نام خانوادگی تولیدکنندگانش گرفته شده‌است. امروزه AWK یکی از ابزارهای الزامی در استاندارد Single UNIX Specification است و استاندارد Linux Standard Base هم آن را الزامی کرده‌است.
زبان AWK در طی سال‌های ۱۹۸۵–۱۹۸۸ به‌طور گسترده‌ای گسترش یافت و نتیجه این گسترش پیاده‌سازی GNU AWK بود که توسط Paul Rubin, Jay Fenlason, و Richard Stallman نوشته‌شده بود و در سال ۱۹۸۸ منتشر شد. کدهای منبع nawk که توسط برایان کرنیگان نوشته شده بود، در ابتدا در سال ۱۹۹۳ به صورت غیرعمومی و سپس در اواخر دهه ۱۹۹۰ به صورت عمومی منتشر شد. بسیاری از سیستم‌های BSD برای پرهیز از مجوز GPL از این پیاده‌سازی استفاده می‌کنند.
زبان AWK پس از دستور sed (سال ۱۹۷۴) درست شد. هر دو این ابزارها برای پردازش متن درست شده‌اند. هر دو آن‌ها پارادیم داده‌محور و خط‌گرا دارند و عموما برای نوشتن برنامه‌های یک‌خطی مناسب هستند. قدرت و ایجازی که برنامه‌های AWK داشتند، خصوصا قدرت آن در اداره‌کردن عبارات باقاعده و عدم نیاز به تعریف صریح متغیرها -- که نوشتن برنامه‌های یک‌خطی را تسهیل می‌کرد-- در کنار محدودیت‌هایی که AWK در آن زمان‌ها داشت، از جمله مهمترین دلایلی بودند که الهام‌دهنده لری وال برای ساخت زبان برنامه‌نویسی پرل (۱۹۸۷) شدند. در دهه ۱۹۹۰، پرل بسیار محبوب شد، و در زمره زبان‌های پردازش متن، از جمله رقیبان AWK بود.
ساختار برنامه‌های AWK
«زبان AWK زبانی برای پردازش فایل‌های متنی است. به یک فایل، همانند دنباله‌ای از رکوردها نگریسته می‌شود که به صورت پیشفرض هر خط یک رکورد را تشکیل می‌دهد. هر خط به دنباله‌ای از فیلدها شکسته می‌شود، پس بنابراین ما می‌توانیم با استفاده از اولین فیلد، به اولین کلمه از یک خط دسترسی داشته باشیم، دومین فیلد حاوی دومین کلمه از آن خط خواهد بود و به همین ترتیب. یک برنامه AWK دنباله‌ای از دوجفتی‌های الگو-عمل است. AWK در هر بار، یک خط را از ورودی می‌خواند. سپس AWK به ترتیب تمامی الگوهای موجود در برنامه را بر روی آن خط امتحان می‌کند تا ببیند که آیا آن الگوها در آن خط وجود دارند یا نه. هر وقت که الگویی پیدا شد که با آن خط تطابق داشت، عمل مربوط به آن الگو اجرا خواهد شد.»
یک برنامه AWK از یکسری دوجفتی الگو-عمل تشکیل می‌شود که به این صورت نوشته می‌شوند.
condition { action
که در کد بالا، بخش condition یک عبارت است و بخش action هم دنباله‌ای از دستورها است. فایل ورودی به یکسری رکورد شکسته می‌شود. به‌طور پیشفرض، رکوردها با استفاده از کاراکتر newline از هم مجزا می‌شوند، بنابراین، فایل ورودی بر اساس خطوط موجود در آن تقسیم‌بندی می‌شود. برنامه به نوبت هر عبارتی که در بخش condition نوشته شده را بر روی رکورد فعلی آزمایش می‌کند، در صورتی که هر کدام از آن عبارات با رکورد فعلی تطابق داشت، بخش action مربوط به آن عبارت اجرا می‌شود. یکی از بخش‌های condition یا action را می‌توان ننوشت، اما حداقل یکی از آن‌ها باید نوشته شود. رفتار پیشفرض برای conditionای که نوشته نشده این است که فرض می‌شود آن condition با تمام خطوط تطابق دارد. در صورتی که از نوشتن بخش action صرف نظر شود، به صورت پیشفرض این‌طور تصور می‌شود که قصد برنامه‌نویس چاپ کردن رکورد فعلی بوده‌است.
بخش condition علاوه بر اینکه می‌تواند شامل عبارت‌های ساده‌ای همچون foo == ۱ یا /^foo/ باشد، می‌تواند کلمات مخصوصی همچون BEGIN یا END هم باشد. در مورد BEGIN، بخش action متناظر پیش از خوانده‌شدن اولین رکورد اجرا می‌شود، و در مورد END، بخش action متناظر، پس از خوانده‌شدن آخرین رکورد اجرا می‌شود. بخش condition همچنین می‌تواند به صورت pattern1, pattern2 باشد که در این صورت، بخش action متناظر بر روی محدوده‌ای از خطوط اجرا می‌شود که شروع این محدوده اولین خطی است که حاوی pattern1 است و پایان این محدوده هم خطی است که حاوی pattern2 است.
عبارات AWK علاوه بر اینکه می‌توانند حاوی عملگرهای منطقی و محاسباتی عادی باشند، می‌توانند حاوی عملگر تیلد tilde هم باشند (~) که این عملگر، یک عبارت باقاعده را بر روی یک رشته آزمایش می‌کند. به جای استفاده از این عملگر همچنین می‌توان از سینتکس /regexp/ استفاده کرد. این سینتکس از sed گرفته شده‌است که sed هم آنرا از ویرایشگر ed گرفته‌است که در این ویرایشگر از کاراکتر / برای جستجو استفاده می‌شود.