[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/awk-advanced":3,"mdc--6828y-key":493,"mdc--viey0q-key":521,"mdc--o450as-key":546,"mdc-gwalob-key":570,"mdc--93ivma-key":609,"mdc-yb65wg-key":641,"mdc-c098sa-key":673,"mdc--jaosoq-key":697,"related-/guides/linux/awk-basics,/guides/linux/bash-advanced":744},{"id":4,"title":5,"appliesTo":6,"author":11,"body":12,"canonical":430,"code":430,"createdAt":431,"description":432,"difficulty":433,"draft":434,"estimatedTime":435,"extension":436,"faq":437,"howToSteps":447,"howToTotalTime":463,"image":430,"keywords":464,"locale":475,"meta":476,"navigation":117,"path":477,"platform":478,"related":479,"section":482,"seo":483,"severity":430,"stem":484,"summary":485,"tags":486,"twitterCreator":430,"twitterSite":430,"type":491,"updatedAt":431,"__hash__":492},"content_ru/guides/linux/awk-advanced.md","Продвинутый гайд по AWK в Linux — команды, скрипты и советы",[7,8,9,10],"Ubuntu 22.04","Debian 12","Fedora 38","openSUSE Leap 15.5","FixPedia Team",{"type":13,"value":14,"toc":417},"minimark",[15,20,24,28,46,49,71,74,160,163,167,172,176,180,184,188,192,195,364,368,413],[16,17,19],"h2",{"id":18},"введение-зачем-это-нужно","Введение / Зачем это нужно",[21,22,23],"p",{},"AWK — это мощный язык для обработки текста, встроенный в большинство дистрибутивов Linux. Хотя базовые команды позволяют быстро фильтровать и преобразовывать данные, продвинутые возможности раскрывают огромный потенциал для автоматизации и анализа логов. В этом гайде вы узнаете, как использовать сложные шаблоны, многомерные массивы, пользовательские функции и интегрировать AWK в пайплайны. После выполнения шагов вы сможете писать сложные скрипты и значительно ускорить свою работу с текстовыми данными.",[16,25,27],{"id":26},"требования-подготовка","Требования / Подготовка",[29,30,31,40,43],"ul",{},[32,33,34,35,39],"li",{},"Установленный ",[36,37,38],"strong",{},"gawk"," (GNU AWK) версии 4.0 или выше.",[32,41,42],{},"Базовые знания синтаксиса AWK (переменные, циклы, условные операторы).",[32,44,45],{},"Доступ к терминалу с правами чтения/записи в целевых файлах.",[21,47,48],{},"Вы можете проверить версию с помощью:",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-bash shiki shiki-themes github-light github-dark","gawk --version\n","bash","",[57,58,59],"code",{"__ignoreMap":55},[60,61,64,67],"span",{"class":62,"line":63},"line",1,[60,65,38],{"class":66},"sScJk",[60,68,70],{"class":69},"sj4cs"," --version\n",[21,72,73],{},"Если AWK отсутствует, установите его для вашей дистрибутивы:",[50,75,77],{"className":52,"code":76,"language":54,"meta":55,"style":55},"# Ubuntu/Debian\nsudo apt update && sudo apt install gawk\n\n# Fedora/RHEL\nsudo dnf install gawk\n\n# openSUSE\nsudo zypper install gawk\n",[57,78,79,85,112,119,125,137,142,148],{"__ignoreMap":55},[60,80,81],{"class":62,"line":63},[60,82,84],{"class":83},"sJ8bj","# Ubuntu/Debian\n",[60,86,88,91,95,98,102,104,106,109],{"class":62,"line":87},2,[60,89,90],{"class":66},"sudo",[60,92,94],{"class":93},"sZZnC"," apt",[60,96,97],{"class":93}," update",[60,99,101],{"class":100},"sVt8B"," && ",[60,103,90],{"class":66},[60,105,94],{"class":93},[60,107,108],{"class":93}," install",[60,110,111],{"class":93}," gawk\n",[60,113,115],{"class":62,"line":114},3,[60,116,118],{"emptyLinePlaceholder":117},true,"\n",[60,120,122],{"class":62,"line":121},4,[60,123,124],{"class":83},"# Fedora/RHEL\n",[60,126,128,130,133,135],{"class":62,"line":127},5,[60,129,90],{"class":66},[60,131,132],{"class":93}," dnf",[60,134,108],{"class":93},[60,136,111],{"class":93},[60,138,140],{"class":62,"line":139},6,[60,141,118],{"emptyLinePlaceholder":117},[60,143,145],{"class":62,"line":144},7,[60,146,147],{"class":83},"# openSUSE\n",[60,149,151,153,156,158],{"class":62,"line":150},8,[60,152,90],{"class":66},[60,154,155],{"class":93}," zypper",[60,157,108],{"class":93},[60,159,111],{"class":93},[161,162],"in-article-ad",{},[16,164,166],{"id":165},"пошаговая-инструкция","Пошаговая инструкция",[168,169,171],"h3",{"id":170},"шаг-1-установка-и-проверка-версии","Шаг 1: Установка и проверка версии",[168,173,175],{"id":174},"шаг-2-продвинутые-шаблоны-и-регулярные-выражения","Шаг 2: Продвинутые шаблоны и регулярные выражения",[168,177,179],{"id":178},"шаг-3-работа-с-многомерными-массивами","Шаг 3: Работа с многомерными массивами",[168,181,183],{"id":182},"шаг-4-определение-пользовательских-функций","Шаг 4: Определение пользовательских функций",[168,185,187],{"id":186},"шаг-5-интеграция-в-пайплайны-и-оптимизация","Шаг 5: Интеграция в пайплайны и оптимизация",[16,189,191],{"id":190},"проверка-результата","Проверка результата",[21,193,194],{},"После выполнения всех шагов проверьте работоспособность:",[196,197,198,223,277,306],"ol",{},[32,199,200,203,204,219,222],{},[36,201,202],{},"Продвинутые шаблоны"," — запустите простой скрипт:",[50,205,207],{"className":52,"code":206,"language":54,"meta":55,"style":55},"gawk '/error/ && $2 == \"critical\" {print NR, $0}' logfile.txt\n",[57,208,209],{"__ignoreMap":55},[60,210,211,213,216],{"class":62,"line":63},[60,212,38],{"class":66},[60,214,215],{"class":93}," '/error/ && $2 == \"critical\" {print NR, $0}'",[60,217,218],{"class":93}," logfile.txt\n",[220,221],"br",{},"Если записи с критическими ошибками выводятся, шаблоны работают.",[32,224,225,228,229,274,276],{},[36,226,227],{},"Многомерные массивы"," — используйте скрипт:",[50,230,232],{"className":52,"code":231,"language":54,"meta":55,"style":55},"gawk '{\n    key = $1\",\"$2;\n    arr[key] = $3;\n}\nEND {\n    for (k in arr) print k, arr[k];\n}' data.txt\n",[57,233,234,241,246,251,256,261,266],{"__ignoreMap":55},[60,235,236,238],{"class":62,"line":63},[60,237,38],{"class":66},[60,239,240],{"class":93}," '{\n",[60,242,243],{"class":62,"line":87},[60,244,245],{"class":93},"    key = $1\",\"$2;\n",[60,247,248],{"class":62,"line":114},[60,249,250],{"class":93},"    arr[key] = $3;\n",[60,252,253],{"class":62,"line":121},[60,254,255],{"class":93},"}\n",[60,257,258],{"class":62,"line":127},[60,259,260],{"class":93},"END {\n",[60,262,263],{"class":62,"line":139},[60,264,265],{"class":93},"    for (k in arr) print k, arr[k];\n",[60,267,268,271],{"class":62,"line":144},[60,269,270],{"class":93},"}'",[60,272,273],{"class":93}," data.txt\n",[220,275],{},"Проверьте вывод на корректные composite ключи.",[32,278,279,282,283,303,305],{},[36,280,281],{},"Пользовательские функции"," — выполните:",[50,284,286],{"className":52,"code":285,"language":54,"meta":55,"style":55},"gawk 'function trim(s) { sub(/^[ \\t]+/, \"\", s); sub(/[ \\t]+$/, \"\", s); return s }\n     { print \"[\" trim($0) \"]\" }' sample.txt\n",[57,287,288,295],{"__ignoreMap":55},[60,289,290,292],{"class":62,"line":63},[60,291,38],{"class":66},[60,293,294],{"class":93}," 'function trim(s) { sub(/^[ \\t]+/, \"\", s); sub(/[ \\t]+$/, \"\", s); return s }\n",[60,296,297,300],{"class":62,"line":87},[60,298,299],{"class":93},"     { print \"[\" trim($0) \"]\" }'",[60,301,302],{"class":93}," sample.txt\n",[220,304],{},"Каждая строка должна быть заключена в квадратные скобки без лишних пробелов.",[32,307,308,311,312,357,359,360,363],{},[36,309,310],{},"Пайплайны"," — объедините инструменты:",[50,313,315],{"className":52,"code":314,"language":54,"meta":55,"style":55},"cat data.txt | sed 's/; /;/g' | gawk 'BEGIN { FS=OFS=\";\" } { $3 = toupper($3); print }' | sort -u > result.txt\n",[57,316,317],{"__ignoreMap":55},[60,318,319,322,325,329,332,335,337,340,343,345,348,351,354],{"class":62,"line":63},[60,320,321],{"class":66},"cat",[60,323,324],{"class":93}," data.txt",[60,326,328],{"class":327},"szBVR"," |",[60,330,331],{"class":66}," sed",[60,333,334],{"class":93}," 's/; /;/g'",[60,336,328],{"class":327},[60,338,339],{"class":66}," gawk",[60,341,342],{"class":93}," 'BEGIN { FS=OFS=\";\" } { $3 = toupper($3); print }'",[60,344,328],{"class":327},[60,346,347],{"class":66}," sort",[60,349,350],{"class":69}," -u",[60,352,353],{"class":327}," >",[60,355,356],{"class":93}," result.txt\n",[220,358],{},"Файл ",[57,361,362],{},"result.txt"," должен содержать уникальные преобразованные строки.",[16,365,367],{"id":366},"возможные-проблемы","Возможные проблемы",[29,369,370,391,397,403],{},[32,371,372,375,376,379,380,379,383,386,387,390],{},[36,373,374],{},"Синтаксис регулярных выражений",": AWK использует регулярные выражения, похожие на grep. Если шаблон не срабатывает, проверьте экранирование специальных символов (например, ",[57,377,378],{},"*",", ",[57,381,382],{},"+",[57,384,385],{},"?","). Используйте ",[57,388,389],{},"awk --lint",", чтобы обнаружить ошибки.",[32,392,393,396],{},[36,394,395],{},"Пробелы в composite ключах",": при создании многомерного массива используйте одинаковый разделитель; несоответствие приводит к отсутствию элементов. Убедитесь, что разделитель не встречается в самих данных.",[32,398,399,402],{},[36,400,401],{},"Переполнение памяти",": большие ассоциативные массивы могут замедлить скрипт. Если скрипт стал медленным, рассмотрите возможность агрегации данных перед обработкой в AWK или используйте внешние сортировочные инструменты.",[32,404,405,408,409,412],{},[36,406,407],{},"Отладка пользовательских функций",": добавьте ",[57,410,411],{},"BEGIN { debug=1 }"," и выводите промежуточные значения для отладки. После проверки отключите отладку, чтобы избежать лишнего вывода.",[414,415,416],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":55,"searchDepth":87,"depth":87,"links":418},[419,420,421,428,429],{"id":18,"depth":87,"text":19},{"id":26,"depth":87,"text":27},{"id":165,"depth":87,"text":166,"children":422},[423,424,425,426,427],{"id":170,"depth":114,"text":171},{"id":174,"depth":114,"text":175},{"id":178,"depth":114,"text":179},{"id":182,"depth":114,"text":183},{"id":186,"depth":114,"text":187},{"id":190,"depth":87,"text":191},{"id":366,"depth":87,"text":367},null,"2026-07-13 08:48:41","Узнайте, как использовать продвинутые функции AWK: сложные шаблоны, массивы и интеграция в пайплайны. Пошаговая инструкция за 15 минут.","medium",false,"15-30 мин","md",[438,441,444],{"answer":439,"question":440},"Используйте `n = asorti(arr)` для индексированных массивов или `n = length(arr)` для ассоциативных массивов, чтобы получить количество элементов.","Как определить размер ассоциативного массива в AWK?",{"answer":442,"question":443},"Установите `RS=\"\"` (пустое разделительное выражение) для чтения всего файла как одной записи, затем разделите строки внутри скрипта по `\"\n\"`.","Как обработать многострочные записи в AWK?",{"answer":445,"question":446},"Добавьте `BEGIN { debug=1 } /pattern/ { if (debug) print \"DEBUG:\", NR, $0 }'` или используйте `awk --lint` для проверки синтаксиса.","Как отлаживать скрипты AWK?",[448,451,454,457,460],{"name":449,"text":450},"Установка и проверка версии","Убедитесь, что `gawk` (GNU AWK) установлен. На Debian/Ubuntu выполните `sudo apt install gawk`, на RHEL/Fedora — `sudo dnf install gawk`. Проверьте версию командой `gawk --version`.",{"name":452,"text":453},"Продвинутые шаблоны и регулярные выражения","Изучите работу с несколькими паттернами: `if ($0 ~ /error/ && $2 == \"critical\")`. Используйте `match($0, /error([0-9]+)/, m)` для захвата групп и доступа к ним через массив `m`.",{"name":455,"text":456},"Работа с многомерными массивами","Создайте массив массивов: `arr[key1,key2] = value`. Получите значение по composite key: `val = arr[key1\",\"key2]`. Для перебора используйте `for (i in arr)`.",{"name":458,"text":459},"Определение пользовательских функций","Объявите функцию в начале скрипта: `function trim(s) { sub(/^[ \t]+/, \"\", s); sub(/[ \t]+$/, \"\", s); return s }`. Вызывайте её в теле скрипта: `line = trim($0)`.",{"name":461,"text":462},"Интеграция в пайплайны и оптимизация","Комбинируйте AWK с `sed`, `grep` и `sort`. Пример: `sed 's/\\s\\+/ /g' | awk '{print toupper($1)}' | sort -u`. Используйте `awk 'BEGIN { FS=OFS=\",\" }'` для удобной работы с CSV.","PT20M",[465,466,467,468,469,470,471,472,473,474],"awk advanced","awk scripting linux","awk multiline patterns","awk associative arrays","awk user-defined functions","awk command line options","awk performance tips","awk debug script","как использовать awk продвинуто","скрипты awk примеры","ru_RU",{},"/guides/linux/awk-advanced","linux",[480,481],"/guides/linux/awk-basics","/guides/linux/bash-advanced","Гайды Linux",{"title":5,"description":432},"guides/linux/awk-advanced","В этом гайде вы освоите продвинутые возможности AWK в Linux, включая обработку многомерных массивов, пользовательские функции и оптимизацию производительности. После чтения вы сможете писать сложные скрипты и эффективно интегрировать AWK в пайплайны.",[487,488,489,490],"Linux","AWK","Programming","Shell scripting","guide","XMXhNrMCRffpe_g3fmuAswkdLK4lu9zkvSrcvvIzhww",{"data":494,"body":495},{},{"type":496,"children":497},"root",[498],{"type":499,"tag":21,"props":500,"children":501},"element",{},[502,505,511,513,519],{"type":503,"value":504},"text","Используйте ",{"type":499,"tag":57,"props":506,"children":508},{"className":507},[],[509],{"type":503,"value":510},"n = asorti(arr)",{"type":503,"value":512}," для индексированных массивов или ",{"type":499,"tag":57,"props":514,"children":516},{"className":515},[],[517],{"type":503,"value":518},"n = length(arr)",{"type":503,"value":520}," для ассоциативных массивов, чтобы получить количество элементов.",{"data":522,"body":523},{},{"type":496,"children":524},[525],{"type":499,"tag":21,"props":526,"children":527},{},[528,530,536,538,544],{"type":503,"value":529},"Установите ",{"type":499,"tag":57,"props":531,"children":533},{"className":532},[],[534],{"type":503,"value":535},"RS=\"\"",{"type":503,"value":537}," (пустое разделительное выражение) для чтения всего файла как одной записи, затем разделите строки внутри скрипта по ",{"type":499,"tag":57,"props":539,"children":541},{"className":540},[],[542],{"type":503,"value":543},"\" \"",{"type":503,"value":545},".",{"data":547,"body":548},{},{"type":496,"children":549},[550],{"type":499,"tag":21,"props":551,"children":552},{},[553,555,561,563,568],{"type":503,"value":554},"Добавьте ",{"type":499,"tag":57,"props":556,"children":558},{"className":557},[],[559],{"type":503,"value":560},"BEGIN { debug=1 } /pattern/ { if (debug) print \"DEBUG:\", NR, $0 }'",{"type":503,"value":562}," или используйте ",{"type":499,"tag":57,"props":564,"children":566},{"className":565},[],[567],{"type":503,"value":389},{"type":503,"value":569}," для проверки синтаксиса.",{"data":571,"body":572},{},{"type":496,"children":573},[574],{"type":499,"tag":21,"props":575,"children":576},{},[577,579,584,586,592,594,600,602,608],{"type":503,"value":578},"Убедитесь, что ",{"type":499,"tag":57,"props":580,"children":582},{"className":581},[],[583],{"type":503,"value":38},{"type":503,"value":585}," (GNU AWK) установлен. На Debian/Ubuntu выполните ",{"type":499,"tag":57,"props":587,"children":589},{"className":588},[],[590],{"type":503,"value":591},"sudo apt install gawk",{"type":503,"value":593},", на RHEL/Fedora — ",{"type":499,"tag":57,"props":595,"children":597},{"className":596},[],[598],{"type":503,"value":599},"sudo dnf install gawk",{"type":503,"value":601},". Проверьте версию командой ",{"type":499,"tag":57,"props":603,"children":605},{"className":604},[],[606],{"type":503,"value":607},"gawk --version",{"type":503,"value":545},{"data":610,"body":611},{},{"type":496,"children":612},[613],{"type":499,"tag":21,"props":614,"children":615},{},[616,618,624,626,632,634,640],{"type":503,"value":617},"Изучите работу с несколькими паттернами: ",{"type":499,"tag":57,"props":619,"children":621},{"className":620},[],[622],{"type":503,"value":623},"if ($0 ~ /error/ && $2 == \"critical\")",{"type":503,"value":625},". Используйте ",{"type":499,"tag":57,"props":627,"children":629},{"className":628},[],[630],{"type":503,"value":631},"match($0, /error([0-9]+)/, m)",{"type":503,"value":633}," для захвата групп и доступа к ним через массив ",{"type":499,"tag":57,"props":635,"children":637},{"className":636},[],[638],{"type":503,"value":639},"m",{"type":503,"value":545},{"data":642,"body":643},{},{"type":496,"children":644},[645],{"type":499,"tag":21,"props":646,"children":647},{},[648,650,656,658,664,666,672],{"type":503,"value":649},"Создайте массив массивов: ",{"type":499,"tag":57,"props":651,"children":653},{"className":652},[],[654],{"type":503,"value":655},"arr[key1,key2] = value",{"type":503,"value":657},". Получите значение по composite key: ",{"type":499,"tag":57,"props":659,"children":661},{"className":660},[],[662],{"type":503,"value":663},"val = arr[key1\",\"key2]",{"type":503,"value":665},". Для перебора используйте ",{"type":499,"tag":57,"props":667,"children":669},{"className":668},[],[670],{"type":503,"value":671},"for (i in arr)",{"type":503,"value":545},{"data":674,"body":675},{},{"type":496,"children":676},[677],{"type":499,"tag":21,"props":678,"children":679},{},[680,682,688,690,696],{"type":503,"value":681},"Объявите функцию в начале скрипта: ",{"type":499,"tag":57,"props":683,"children":685},{"className":684},[],[686],{"type":503,"value":687},"function trim(s) { sub(/^[ \t]+/, \"\", s); sub(/[ \t]+$/, \"\", s); return s }",{"type":503,"value":689},". Вызывайте её в теле скрипта: ",{"type":499,"tag":57,"props":691,"children":693},{"className":692},[],[694],{"type":503,"value":695},"line = trim($0)",{"type":503,"value":545},{"data":698,"body":699},{},{"type":496,"children":700},[701],{"type":499,"tag":21,"props":702,"children":703},{},[704,706,712,713,719,721,727,729,735,736,742],{"type":503,"value":705},"Комбинируйте AWK с ",{"type":499,"tag":57,"props":707,"children":709},{"className":708},[],[710],{"type":503,"value":711},"sed",{"type":503,"value":379},{"type":499,"tag":57,"props":714,"children":716},{"className":715},[],[717],{"type":503,"value":718},"grep",{"type":503,"value":720}," и ",{"type":499,"tag":57,"props":722,"children":724},{"className":723},[],[725],{"type":503,"value":726},"sort",{"type":503,"value":728},". Пример: ",{"type":499,"tag":57,"props":730,"children":732},{"className":731},[],[733],{"type":503,"value":734},"sed 's/\\s\\+/ /g' | awk '{print toupper($1)}' | sort -u",{"type":503,"value":625},{"type":499,"tag":57,"props":737,"children":739},{"className":738},[],[740],{"type":503,"value":741},"awk 'BEGIN { FS=OFS=\",\" }'",{"type":503,"value":743}," для удобной работы с CSV.",[]]