|
- codeblock
+ ++"codeblock"++
|
@@ -161,4 +160,3 @@ local servers = { "html", "cssls", "tsserver", "clangd", "marksman" }
Його використання та, як наслідок, запам’ятовування первинних ключів для вставлення символів коду Markdown забезпечать ефективне пришвидшення запису, дозволяючи вам зосередити свою увагу на вмісті.
-
diff --git a/docs/books/nvchad/nvchad_ui/nvchad_ui.uk.md b/docs/books/nvchad/nvchad_ui/nvchad_ui.uk.md
index 31b64b9efb..012e564555 100644
--- a/docs/books/nvchad/nvchad_ui/nvchad_ui.uk.md
+++ b/docs/books/nvchad/nvchad_ui/nvchad_ui.uk.md
@@ -19,12 +19,12 @@ tags:
Щоб уникнути плутанини в документах, які ви зараз читаєте, ми припустимо, що ви використовуєте файл `mappings.lua` за замовчуванням, і замінимо фактичні команди, які вам потрібно використовувати для доступу до функції. Стандартні ключові посилання:
- * leader = ПРОБІЛ
- * A = ALT
- * C = CTRL
- * S = SHFT
+ * leader = ++пробіл++
+ * A = ++alt++
+ * C = ++ctrl++
+ * S = ++shift++
- Якщо команда вказуватиме `uu` як приклад, ми замінимо у справжній комбінації клавіш ПРОБІЛuu.
+ Якщо команда вказуватиме `uu` як приклад, ми замінимо у справжній комбінації клавіш ++пробіл++++"uu"++.
Це буде розглянуто знову в наступному розділі [Використання NvChad](./using_nvchad.md)
@@ -40,7 +40,7 @@ tags:
Інтерфейс користувача представляє верхню панель під назвою `Tabufline`, де можна керувати відкритими буферами. `Tabufline` відображається, лише якщо у вас відкрито більше одного файлу. Відкритий буфер відображає піктограму типу файлу, назву файлу та його статус. Статус позначається піктограмою.
-Якщо, як показано на скріншоті, ми маємо червоний `x`, це означає, що файл можна закрити, оскільки він уже збережений. Якщо натомість піктограмою є зелена крапка `.`, тоді файл потрібно зберегти, а команда закриття SHIFT + :q створить попередження: «Немає запису з часу останньої зміни».
+Якщо, як показано на скріншоті, ми маємо червоний `x`, це означає, що файл можна закрити, оскільки він уже збережений. Якщо натомість піктограмою є зелена крапка `.`, тоді файл потрібно зберегти, а команда закриття ++shift++ + ++":"++ + ++"q"++ створить попередження: «Немає запису з часу останньої зміни».
Праворуч є значок для встановлення _темної_ або _світлої_ теми. Клацнувши на ньому мишею, ми можемо вибрати потрібну тему.
@@ -52,7 +52,7 @@ tags:
Центральна частина редактора складається з буфера, активного в редакторі в цей момент (_index.en.md_). Щоб представити деякі додаткові функції, ми можемо працювати одночасно з двома файлами в розділеному буфері, відкривши ще один у прикладі (_index.it.md_).
-У редакторі ми матимемо перший буфер на передньому плані, а другий — у списку Tabufline. Тепер, якщо ми розділимо перший буфер за допомогою команди SHIFT + :vsplit і виберемо правий буфер, клацнувши назву другого файлу (*index.it.md*) у tabufline, це буде відкрито в правому буфері, і ми зможемо працювати з двома файлами поруч.
+У редакторі ми матимемо перший буфер на передньому плані, а другий — у списку Tabufline. Тепер, якщо ми розділимо перший буфер за допомогою команди++shift++ + ++":"++ + **vsplit** і виберемо правий буфер, клацнувши назву другого файлу (_index.it.md_) у tabufline, це буде відкрито в правому буфері, і ми зможемо працювати з двома файлами поруч.

@@ -67,9 +67,9 @@ tags:
- **COMMAND**
- **VISUAL**
-Редагування документа починається з режиму **NORMAL**, у якому ви відкриваєте файл, а потім ви можете перейти в режим **INSERT** для редагування, а після завершення вийдіть за допомогою ESC і поверніться до режиму **NORMAL**.
+Редагування документа починається з режиму **NORMAL**, у якому ви відкриваєте файл, а потім ви можете перейти в режим **INSERT** для редагування, а після завершення вийдіть за допомогою ++esc++ і поверніться до режиму **NORMAL**.
-Тепер, щоб зберегти файл, перейдіть у режим **COMMAND**, ввівши `:` у рядок стану, а потім `w` (_write_), щоб записати його, і за допомогою ESC ви повернетеся до **NORMAL** режиму. Індикатор статусу дуже корисний під час навчання, як ним користуватися, особливо якщо ви не дуже знайомі з робочим процесом Vim.
+Тепер, щоб зберегти файл, перейдіть у режим **COMMAND**, ввівши `:` у рядок стану, а потім `w` (_write_), щоб записати його, і за допомогою ++esc++ ви повернетеся до **NORMAL** режиму. Індикатор статусу дуже корисний під час навчання, як ним користуватися, особливо якщо ви не дуже знайомі з робочим процесом Vim.
Потім ми знаходимо ім’я відкритого файлу, і якщо ми працюємо над репозиторієм git, ми матимемо індикацію статусу репозиторію. Це завдяки плагіну _lewis6991/gitsigns.nvim_.
@@ -79,21 +79,21 @@ tags:
NvChad і Neovim надають деякі корисні команди для відображення попередньо встановлених комбінацій клавіш і доступних параметрів.
-Якщо натиснути одну клавішу ПРОБІЛ, відобразиться легенда пов’язаних команд, як показано на наступному скріншоті:
+Якщо натиснути одну клавішу ++пробіл++, відобразиться легенда пов’язаних команд, як показано на наступному скріншоті:

-Щоб переглянути всі команди, включені в редактор, ми можемо використати команду ПРОБІЛ + wK, яка дасть такий результат:
+Щоб переглянути всі команди, включені в редактор, ми можемо використати команду ++space++ + ++"wK"++, яка дасть такий результат:

-А натиснувши d, ми можемо відобразити решту команд:
+А натиснувши ++"d"++, ми можемо відобразити решту команд:

Як ми бачимо, майже всі команди стосуються навігації всередині документа або буфера. Немає команд для відкриття файлу. Вони надаються компанією Neovim.
-Щоб переглянути всі параметри Neovim, доступна команда SHIFT + :options, яка відобразить дерево параметрів, проіндексованих за категоріями.
+Щоб переглянути всі параметри Neovim, доступна команда ++shift++ + ++":"++ + **options**, яка відобразить дерево параметрів, проіндексованих за категоріями.

@@ -101,7 +101,7 @@ NvChad і Neovim надають деякі корисні команди для
## NvimTree
-Щоб працювати з нашими файлами, нам потрібен Провідник файлів, який надає плагін _kyazdani42/nvim-tree.lua_. За допомогою комбінації CTRL + n ми можемо відкрити NvimTree.
+Щоб працювати з нашими файлами, нам потрібен Провідник файлів, який надає плагін _kyazdani42/nvim-tree.lua_. За допомогою комбінації ++ctrl++ + ++"n"++ ми можемо відкрити NvimTree.

diff --git a/docs/books/nvchad/nvchad_ui/nvimtree.uk.md b/docs/books/nvchad/nvchad_ui/nvimtree.uk.md
index 51fc511d1b..35dad27d6a 100644
--- a/docs/books/nvchad/nvchad_ui/nvimtree.uk.md
+++ b/docs/books/nvchad/nvchad_ui/nvimtree.uk.md
@@ -12,53 +12,53 @@ tags:
{ align=right }
-Редактор, щоб бути функціональним, повинен забезпечувати підтримку відкриття та керування файлами, які ми хочемо записати або відредагувати. Neovim у своїй базовій інсталяції не надає функції керування файлами. Це реалізовано NvChad за допомогою плагіна _kyazdani42/nvim-tree.lua_. Плагін надає файловий провідник, за допомогою якого можна виконувати всі найпоширеніші операції з файлами за допомогою клавіш клавіатури. Щоб відкрити його, скористайтеся комбінацією Ctrl + n, яка доступна лише в режимі _NORMAL_ і за допомогою тієї ж комбінаціії клавіш, якою ви його закриваєте.
+Редактор, щоб бути функціональним, повинен забезпечувати підтримку відкриття та керування файлами, які ми хочемо записати або відредагувати. Neovim у своїй базовій інсталяції не надає функції керування файлами. Це реалізовано NvChad за допомогою плагіна _kyazdani42/nvim-tree.lua_. Плагін надає файловий провідник, за допомогою якого можна виконувати всі найпоширеніші операції з файлами за допомогою клавіш клавіатури. Щоб відкрити його, скористайтеся комбінацією ++ctrl++ + ++"n"++, яка доступна лише в режимі _NORMAL_ і за допомогою тієї ж комбінаціії клавіш, якою ви його закриваєте.
Якщо ми встановили [Nerd Fonts](../nerd_fonts.md), ми матимемо, як показано на знімку екрана, файловий провідник, який, хоча й текстовий, надасть нам графічне представлення нашого файлового дерева.
-Після відкриття ми можемо перемикатися з вікна провідника у вікно редактора та навпаки за допомогою комбінацій Ctrl + h для переміщення вліво та Ctrl + l, щоб рухатися праворуч.
+Після відкриття ми можемо перемикатися з вікна провідника у вікно редактора та навпаки за допомогою комбінацій ++ctrl++ + ++"h"++ для переміщення вліво та ++ctrl++ + ++"l"++, щоб рухатися праворуч.
## Робота з файловим провідником
Для роботи з деревом файлів вашого проекту _NvimTree_ надає ряд корисних ярликів для керування ним, а саме:
-- R (оновити), для виконання повторного читання файлів, які містяться в проекті
-- H (сховати), щоб приховати/показати приховані файли та папки (починаючи з крапки `.`)
-- E (expand_all), щоб розгорнути все дерево файлів, починаючи з кореневої теки (робоча область)
-- W (collapse_all), щоб закрити всі відкриті теки, починаючи з кореневої теки
-- - (dir_up) дозволяє повертатися до папок. Ця навігація також дозволяє вам вийти з кореневої папки (робочої області) у свій домашній каталог
-- s (система), щоб відкрити файл за допомогою системної програми, встановленої за замовчуванням для цього типу файлу
-- f (знайти), щоб відкрити інтерактивний пошук файлів, до яких можна застосувати пошукові фільтри
-- F, щоб закрити інтерактивний пошук
-- Ctrl + k, щоб показати інформацію про файл, наприклад розмір, дату створення тощо.
-- g + ?, щоб відкрити довідку з усіма попередньо визначеними комбінаціями клавіш для швидкого доступу
-- q, щоб закрити провідник файлів
+- ++"R"++ (оновити), для виконання повторного читання файлів, які містяться в проекті
+- ++"H"++ (сховати), щоб приховати/показати приховані файли та папки (починаючи з крапки `.`)
+- ++"E"++ (expand_all), щоб розгорнути все дерево файлів, починаючи з кореневої теки (робоча область)
+- ++"W"++ (collapse_all), щоб закрити всі відкриті теки, починаючи з кореневої теки
+- ++"-"++ (dir_up) дозволяє повертатися до папок. Ця навігація також дозволяє вам вийти з кореневої папки (робочої області) у свій домашній каталог
+- ++"s"++ (система), щоб відкрити файл за допомогою системної програми, встановленої за замовчуванням для цього типу файлу
+- ++"f"++ (знайти), щоб відкрити інтерактивний пошук файлів, до яких можна застосувати пошукові фільтри
+- ++"F"++, щоб закрити інтерактивний пошук
+- ++ctrl++ + ++"k"++, щоб показати інформацію про файл, наприклад розмір, дату створення тощо.
+- ++"g"++ + ++"?"++, щоб відкрити довідку з усіма попередньо визначеними комбінаціями клавіш для швидкого доступу
+- ++"q"++, щоб закрити провідник файлів
{ align=right }
-!!! note "Примітка:"
+!!! note "Примітка:"
- Інтерактивний пошук, який виконується за допомогою f, як і під час навігації за допомогою стрілок > <, залишається обмеженим текою, де зараз знаходиться _NvimTree_. Щоб здійснити глобальний пошук у всій робочій області, вам слід спочатку відкрити все дерево файлів за допомогою E, а потім почати пошук за допомогою f.
+ Інтерактивний пошук, який виконується за допомогою ++"f"++, як і під час навігації за допомогою стрілок ++">"++ ++"<"++, залишається обмеженим текою, де зараз знаходиться _NvimTree_. Щоб здійснити глобальний пошук у всій робочій області, вам слід спочатку відкрити все дерево файлів за допомогою ++"E"++, а потім почати пошук за допомогою ++"f"++.
-Пошук переводить буфер **NvimTree_1** у стан _INSERT_ для введення наших фільтрів. Якщо файл не вибрано, для виходу з нього потрібно повернути буфер до _NORMAL_ за допомогою ESC перед закриттям пошуку за допомогою F.
+Пошук переводить буфер **NvimTree_1** у стан _INSERT_ для введення наших фільтрів. Якщо файл не вибрано, для виходу з нього потрібно повернути буфер до _NORMAL_ за допомогою ++esc++ перед закриттям пошуку за допомогою ++"F"++.
### Обрати файл
-Щоб вибрати файл, ми повинні спочатку переконатися, що ми знаходимося в буфері _nvimtree_, виділеному в рядку стану за допомогою **NvimTree_1**. Для цього ми можемо скористатися клавішами вибору вікна, згаданими вище, або спеціальною командою Пробіл + e, наданою NvChad, яка розташує курсор у дереві файлів. Ця комбінація є частиною відображення NvChad за замовчуванням і відповідає команді плагіна `:NvimTreeFocus`.
+Щоб вибрати файл, ми повинні спочатку переконатися, що ми знаходимося в буфері _nvimtree_, виділеному в рядку стану за допомогою **NvimTree_1**. Для цього ми можемо скористатися клавішами вибору вікна, згаданими вище, або спеціальною командою ++space++ + ++"e"++, наданою NvChad, яка розташує курсор у дереві файлів. Ця комбінація є частиною відображення NvChad за замовчуванням і відповідає команді плагіна `:NvimTreeFocus`.
-Для переміщення по дереву файлів нам надано клавіші > і <, за допомогою яких можна рухатися вгору та вниз по дереву, доки ми не досягнемо потрібної теки. Після позиціонування ми можемо відкрити його за допомогою Enter і закрити за допомогою BS.
+Для переміщення по дереву файлів нам надано клавіші ++">"++ and ++"<"++, за допомогою яких можна рухатися вгору та вниз по дереву, доки ми не досягнемо потрібної теки. Після позиціонування ми можемо відкрити його за допомогою ++enter++ і закрити за допомогою ++"BS"++.
-Слід підкреслити, що навігація за допомогою клавіш > і < завжди посилається на поточну теку. Це означає, що коли папку відкрито та розміщено в ній, навігація залишатиметься обмеженою цією папкою. Щоб вийти з папки, ми використовуємо клавішу Ctrl + p (батьківський каталог), яка дозволяє нам перейти з поточної папки до папки, з якої ми відкрили редактор і яка відповідає нашій _робочій області_, визначеній у рядку стану праворуч.
+Слід підкреслити, що навігація за допомогою клавіш ++">"++ and ++"<"++ завжди посилається на поточну теку. Це означає, що коли папку відкрито та розміщено в ній, навігація залишатиметься обмеженою цією папкою. Щоб вийти з папки, ми використовуємо клавішу ++ctrl++ + ++"p"++ (батьківський каталог), яка дозволяє нам перейти з поточної папки до папки, з якої ми відкрили редактор і яка відповідає нашій _робочій області_, визначеній у рядку стану праворуч.
### Відкрити файл
Розташований у потрібній папці з файлом, вибраним для редагування, у нас є такі комбінації, щоб відкрити його:
-- Enter або o, щоб відкрити файл у новому буфері та встановити курсор на перший рядок файлу
-- Tab, щоб відкрити файл у новому буфері, утримуючи курсор у _nvimtree_, це, наприклад, корисно, якщо ви хочете відкрити кілька файлів одночасно
-- Ctrl + t, щоб відкрити файл у новій _вкладці_, якою можна керувати окремо від інших присутніх буферів
-- Ctrl + v, щоб відкрити файл у буфері, розділивши його вертикально на дві частини, якщо вже був відкритий файл, він буде показаний поряд із новим файлом
-- Ctrl + h, щоб відкрити файл, як описано вище, але розділивши буфер горизонтально
+- ++enter++ або ++"o"++, щоб відкрити файл у новому буфері та встановити курсор на перший рядок файлу
+- ++tab++, щоб відкрити файл у новому буфері, утримуючи курсор у _nvimtree_, це, наприклад, корисно, якщо ви хочете відкрити кілька файлів одночасно
+- ++ctrl++ + ++"t"++, щоб відкрити файл у новій _вкладці_, якою можна керувати окремо від інших присутніх буферів
+- ++ctrl++ + ++"v"++, щоб відкрити файл у буфері, розділивши його вертикально на дві частини, якщо вже був відкритий файл, він буде показаний поряд із новим файлом
+- ++ctrl++ + ++"h"++, щоб відкрити файл, як описано вище, але розділивши буфер горизонтально
### Керування файлами
@@ -66,14 +66,14 @@ tags:
Ключі для модифікації:
-- a (додати) дозволяє створювати файли або теки, створюючи теку, слідуючи назві скісної риски `/`. Наприклад, `/nvchad/nvimtree.md` створює відповідний файл розмітки, а `/nvchad/nvimtree/` створює _nvimtree_ папку. Створення за замовчуванням відбуватиметься в тому місці, де на той момент знаходиться курсор у провіднику файлів, тому вибір папки, де буде створено файл, потрібно буде зробити раніше або ви можете написати повний шлях у рядку стану, у записі шляху ви можете скористатися функцією автозаповнення
-- r (перейменувати), щоб змінити початкову назву вибраного файлу
-- Ctrl + r, щоб перейменувати файл незалежно від його оригінальної назви
-- d (видалити), щоб видалити вибраний файл або, якщо є папка, видалити папку з усім її вмістом
-- x (вирізати), щоб вирізати та скопіювати вибраний фрагмент до буфера обміну, це можуть бути файли або теки з усім вмістом, за допомогою цієї команди, пов’язаної з командою вставлення, ви змушуєте файл переміщатися в межах дерева
-- c (копіювати) подібно до попередньої команди, ця команда копіює файл до буфера обміну, але зберігає оригінальний файл у своєму розташуванні
-- p (вставити), щоб вставити вміст буфера обміну до поточного розташування
-- y, щоб скопіювати лише назву файлу до буфера обміну, є також два варіанти: Y, щоб скопіювати відносний шлях, і g + y, щоб скопіювати абсолютний шлях
+- ++"a"++ (додати) дозволяє створювати файли або теки, створюючи теку, слідуючи назві скісної риски `/`. Наприклад, `/nvchad/nvimtree.md` створює відповідний файл розмітки, а `/nvchad/nvimtree/` створює _nvimtree_ папку. Створення за замовчуванням відбуватиметься в тому місці, де на той момент знаходиться курсор у провіднику файлів, тому вибір папки, де буде створено файл, потрібно буде зробити раніше або ви можете написати повний шлях у рядку стану, у записі шляху ви можете скористатися функцією автозаповнення
+- ++"r"++ (перейменувати), щоб змінити початкову назву вибраного файлу
+- ++ctrl++ + ++"r"++, щоб перейменувати файл незалежно від його оригінальної назви
+- ++"d"++ (видалити), щоб видалити вибраний файл або, якщо є папка, видалити папку з усім її вмістом
+- ++"x"++ (вирізати), щоб вирізати та скопіювати вибраний фрагмент до буфера обміну, це можуть бути файли або теки з усім вмістом, за допомогою цієї команди, пов’язаної з командою вставлення, ви змушуєте файл переміщатися в межах дерева
+- ++"c"++ (копіювати) подібно до попередньої команди, ця команда копіює файл до буфера обміну, але зберігає оригінальний файл у своєму розташуванні
+- ++"p"++ (вставити), щоб вставити вміст буфера обміну до поточного розташування
+- ++"y"++, щоб скопіювати лише назву файлу до буфера обміну, є також два варіанти: ++"Y"++, щоб скопіювати відносний шлях, і ++"g"++ + ++"y"++, щоб скопіювати абсолютний шлях
## Додаткові функції
@@ -83,20 +83,20 @@ tags:
```lua
M.nvimtree = {
- git = {
- enable = true,
- },
- renderer = {
- highlight_git = true,
- icons = {
- show = {
- git = true,
- },
+ git = {
+ enable = true,
+ },
+ renderer = {
+ highlight_git = true,
+ icons = {
+ show = {
+ git = true,
+ },
+ },
+ },
+ view = {
+ side = "right",
},
- },
- view = {
- side = "right",
- },
}
```
diff --git a/docs/books/nvchad/nvchad_ui/plugins_manager.it.md b/docs/books/nvchad/nvchad_ui/plugins_manager.it.md
index 6075571a43..d97617d521 100644
--- a/docs/books/nvchad/nvchad_ui/plugins_manager.it.md
+++ b/docs/books/nvchad/nvchad_ui/plugins_manager.it.md
@@ -164,7 +164,7 @@ Nella scrittura del plugin si è prestata particolare attenzione alle prestazion

-Qui si possono vedere i tempi di caricamento dei vari plugin, che possono essere ordinati con la combinazione di tasti ++ctrl++ ++"s "++ per voce nella configurazione o per tempo di caricamento. Abbiamo anche la possibilità di effettuare ricerche sul tempo di caricamento dei plugin impostando una soglia minima in millisecondi con la combinazione ++ctrl++ ++"f "++.
+Qui si possono vedere i tempi di caricamento dei vari plugin, che possono essere ordinati con la combinazione di tasti ++ctrl++ ++"s "++ per voce nella configurazione o per tempo di caricamento. Possiamo anche eseguire ricerche sul tempo di caricamento dei plugin impostando una soglia minima in millisecondi con la combinazione ++ctrl++ ++"f "++.
Queste informazioni possono essere utili per la risoluzione dei problemi se l'editor rallenta in modo anomalo.
diff --git a/docs/books/nvchad/nvchad_ui/plugins_manager.uk.md b/docs/books/nvchad/nvchad_ui/plugins_manager.uk.md
index 8531239925..991132cd80 100644
--- a/docs/books/nvchad/nvchad_ui/plugins_manager.uk.md
+++ b/docs/books/nvchad/nvchad_ui/plugins_manager.uk.md
@@ -39,7 +39,7 @@ lazy: require("lazy.health").check()
Хоча це і не обов’язково, перевірка середовища збірки перед тим, як ми почнемо працювати над нашою спеціальною конфігурацією, дозволяє нам виключити цю змінну з будь-яких помилок або несправностей, які можуть виникнути в самих плагінах або під час написання їхніх конфігурацій.
-Також може бути цікаво переглянути вбудовану довідку, надану самим плагіном. Щоб відкрити його, ми можемо скористатися командою `:Lazy help` або викликати її з інтерфейсу плагіна, ввівши ?.
+Також може бути цікаво переглянути вбудовану довідку, надану самим плагіном. Щоб відкрити його, ми можемо скористатися командою `:Lazy help` або викликати її з інтерфейсу плагіна, ввівши ++"?"++.

@@ -90,7 +90,7 @@ nvim ~/.config/nvim/lua/custom/plugins.lua
Однозначно ми відповімо «так».
-Тепер, якщо ми відкриємо менеджер плагінів за допомогою команди `:Lazy`, ми побачимо, що наш плагін розпізнано та готовий до встановлення. Щоб встановити його, просто введіть I
+Тепер, якщо ми відкриємо менеджер плагінів за допомогою команди `:Lazy`, ми побачимо, що наш плагін розпізнано та готовий до встановлення. Щоб встановити його, просто введіть ++"I"++

@@ -125,6 +125,7 @@ cmd = { "WorkspacesList", "WorkspacesAdd", "WorkspacesOpen", "WorkspacesRemove"
```json
"workspaces.nvim": { "branch": "master", "commit": "dd9574c8a6fbd4910bf298fcd1175a0222e9a09d" },
```
+
## Видалення плагіна
Як і під час інсталяції, видалення плагіна з конфігурації також відбувається через ручне редагування файлу _custom/plugins.lua_. У цьому прикладі ми збираємося видалити плагін [TimUntersberger/neogit](https://github.com/TimUntersberger/neogit), цей плагін дозволяє керувати репозиторіями git безпосередньо з редактора.
@@ -133,11 +134,11 @@ cmd = { "WorkspacesList", "WorkspacesAdd", "WorkspacesOpen", "WorkspacesRemove"
Вибір плагіна є чисто випадковим. Плагін, використаний для прикладу, без проблем працює в NvChad.
-Відкриваємо наш редактор і видаляємо плагін з конфігурації. Це зручно зробити, вибравши мишею чотири рядки, які потрібно видалити, а потім натиснувши x, щоб видалити їх, і CTRL + s, щоб зберегти файл.
+Відкриваємо наш редактор і видаляємо плагін з конфігурації. Це зручно зробити, вибравши мишею чотири рядки, які потрібно видалити, а потім натиснувши ++"x"++, щоб видалити їх, і ++ctrl++ + ++"s"++, щоб зберегти файл.

-Ми знову отримаємо сповіщення про зміну файлу _plugins.lua_, на яке ми відповімо "так", і коли ми відкриємо _Lazy_ наш плагін буде позначено як видалений. Видалення виконується натисканням клавіші X.
+Ми знову отримаємо сповіщення про зміну файлу _plugins.lua_, на яке ми відповімо "так", і коли ми відкриємо _Lazy_ наш плагін буде позначено як видалений. Видалення виконується натисканням клавіші ++"X"++.

@@ -145,7 +146,7 @@ cmd = { "WorkspacesList", "WorkspacesAdd", "WorkspacesOpen", "WorkspacesRemove"
## Оновлення плагінів
-Після встановлення та налаштування плагінів ними незалежно керує _lazy.nvim_. Щоб перевірити наявність оновлень, просто відкрийте менеджер і введіть C. _Lazy_ перевірить сховища встановлених плагінів (_git fetch_), а потім надасть нам список оновлюваних додатків, які після позначення їх можна оновити одночасно за допомогою U або окремо, вибравши їх за допомогою u.
+Після встановлення та налаштування плагінів ними незалежно керує _lazy.nvim_. Щоб перевірити наявність оновлень, просто відкрийте менеджер і введіть ++"C"++. _Lazy_ перевірить сховища встановлених плагінів (_git fetch_), а потім надасть нам список оновлюваних додатків, які після позначення їх можна оновити одночасно за допомогою ++"U"++ або окремо, вибравши їх за допомогою ++"u"++.

@@ -153,25 +154,25 @@ cmd = { "WorkspacesList", "WorkspacesAdd", "WorkspacesOpen", "WorkspacesRemove"
Навіть якщо їх немає на знімку екрана вище, якщо є плагіни з комітами, включаючи «небезпечні зміни», вони відображатимуться першими.
-Існує також можливість запустити весь цикл оновлення лише за допомогою команди `Sync`. З інтерфейсу, ввівши S або команду `:Lazy sync`, ми викличемо функцію, яка складається з конкатенації `install` + `clean` + `update`.
+Існує також можливість запустити весь цикл оновлення лише за допомогою команди `Sync`. З інтерфейсу, ввівши ++"S"++ або команду `:Lazy sync`, ми викличемо функцію, яка складається з конкатенації `install` + `clean` + `update`.
Процес оновлення, окремо чи сукупно, також змінить файл _lazy-lock.json_. Зокрема, коміти будуть змінені для їх синхронізації зі станом репозиторію на GitHub.
## Додаткові можливості
-Під час написання плагіна особливу увагу було приділено продуктивності та ефективності коду, а також щоб дати нам можливість оцінити час запуску різних плагінів. Нам надається _profiler_, який можна викликати командою `:Lazy profile` або клавішею P з інтерфейсу.
+Під час написання плагіна особливу увагу було приділено продуктивності та ефективності коду, а також щоб дати нам можливість оцінити час запуску різних плагінів. Нам надається _profiler_, який можна викликати командою `:Lazy profile` або клавішею ++"P"++ з інтерфейсу.

-Тут ми можемо побачити час завантаження різних плагінів, які можна сортувати за допомогою комбінації клавіш CTRL + s за записом у конфігурації або за часом завантаження. У нас також є можливість здійснювати пошук за часом завантаження плагінів, встановлюючи мінімальний поріг у мілісекундах за допомогою комбінації CTRL + f.
+Тут ми можемо побачити час завантаження різних плагінів, які можна відсортувати за допомогою комбінації клавіш ++ctrl++ + ++"s"++ за записом конфігурації або часом завантаження. Ми також можемо шукати час завантаження плагінів, встановивши мінімальний поріг у мілісекундах за допомогою комбінації ++ctrl++ + ++"f"++.
Ця інформація може бути корисною для усунення несправностей, якщо редактор сповільнюється ненормально.
-Додаток також надає відображення останніх операцій, виконаних у додатках, відображення, яке можна викликати за допомогою клавіші L з інтерфейсу або за допомогою команди `:Lazy log` від самого редактора.
+Додаток також надає відображення останніх операцій, виконаних у додатках, відображення, яке можна викликати за допомогою клавіші ++"L"++ з інтерфейсу або за допомогою команди `:Lazy log` від самого редактора.

-Він також інтегрує функцію налагодження, яка дозволяє нам перевіряти активні обробники відкладеного завантаження та те, що знаходиться в кеші модуля. Щоб активувати його, ми можемо скористатися клавішею D в інтерфейсі або викликати його за допомогою команди `:Lazy debug`.
+Він також інтегрує функцію налагодження, яка дозволяє нам перевіряти активні обробники відкладеного завантаження та те, що знаходиться в кеші модуля. Щоб активувати його, ми можемо скористатися клавішею ++"D"++ в інтерфейсі або викликати його за допомогою команди `:Lazy debug`.

@@ -193,7 +194,7 @@ Lazy.nvim дозволяє синхронізувати всі встановл
...
```
-Завдяки сховищу фіксації ми можемо точно бачити стан плагіна в репозиторії на момент встановлення чи оновлення. Це дозволяє нам за допомогою функції `restore` повернути його або повернути його до того самого стану також у редакторі. Функція, яку можна викликати за допомогою клавіші R з інтерфейсу або за допомогою `:Lazy restore`, оновлює всі додатки в редакторі до стану, визначеного в *файл lazy-lock.json*.
+Завдяки сховищу фіксації ми можемо точно бачити стан плагіна в репозиторії на момент встановлення чи оновлення. Це дозволяє нам за допомогою функції `restore` повернути його або повернути його до того самого стану також у редакторі. Функція, яку можна викликати за допомогою клавіші ++"R"++ з інтерфейсу або за допомогою `:Lazy restore`, оновлює всі додатки в редакторі до стану, визначеного в _файл lazy-lock.json_.
Копіюючи файл _lazy-lock.json_ зі стабільної конфігурації десь у безпечному місці, ми маємо можливість відновити редактор до такого стану, якщо оновлення викличе проблеми. Експортувавши його на іншу робочу станцію, ми можемо використовувати його для налаштування редактора з тією самою функціональністю.
diff --git a/docs/books/nvchad/nvchad_ui/using_nvchad.uk.md b/docs/books/nvchad/nvchad_ui/using_nvchad.uk.md
index 494ef3b48d..3b47c58ce0 100644
--- a/docs/books/nvchad/nvchad_ui/using_nvchad.uk.md
+++ b/docs/books/nvchad/nvchad_ui/using_nvchad.uk.md
@@ -15,10 +15,10 @@ tags:
Усі послідовності починаються з первинного ключа, за яким слідує опція. Чотири основні ключі:
-* leader = ПРОБІЛ
-* A = ALT
-* C = CTRL
-* S = SHFT
+* leader = ++space++
+* A = ++alt++
+* C = ++ctrl++
+* S = ++shift++
Як і в документі "NvChad UI", ми будемо замінювати фактичну команду для введення, а не зіставлення.
@@ -32,13 +32,13 @@ nvim /path/to/the/file
Або відкрийте редактор за допомогою команди `nvim`.
-Якщо ми використовуємо останній метод, у нас є кілька можливостей. Ми можемо відкрити файл у буфері за допомогою команди SHIFT + :e + ПРОБІЛ (редагування), за якою слідує шлях, або слідуючи за за допомогою клавіші TAB.
+Якщо ми використовуємо останній метод, у нас є кілька можливостей. Ми можемо відкрити файл у буфері за допомогою команди ++shift++ + ++":"++ ++"e"++ + ++space++ (редагування), за якою слідує шлях, або слідуючи за за допомогою клавіші ++tab++.
-Це покаже нам усі доступні файли та папки, починаючи з кореня проекту. Варто пам’ятати, що коли ми використовуємо клавішу TAB у командах відкриття файлу, ми можемо вибрати файл зі зручного випадаючого меню. Коли це випадаюче меню відкрито, ми продовжуємо навігацію в ньому за допомогою повторного використання клавіші TAB.
+Це покаже нам усі доступні файли та папки, починаючи з кореня проекту. Варто пам’ятати, що коли ми використовуємо клавішу ++tab++ у командах відкриття файлу, ми можемо вибрати файл зі зручного випадаючого меню. Коли це випадаюче меню відкрито, ми продовжуємо навігацію в ньому за допомогою повторного використання клавіші ++tab++.
-
+
-Варто пам’ятати, що кожній із наведених команд передує SHIFT, а за нею йде ПРОБІЛ і або шлях, або клавіша TAB. Ось список інших дій:
+Варто пам’ятати, що кожній із наведених команд передує ++shift++, а за нею йде ++space++ і або шлях, або клавіша ++tab++. Ось список інших дій:
* `:view` – переглядає файл у режимі лише для читання без можливості його змінювати. Дуже добре підходить для захисту критичних файлів.
* `:split` - відкриває файл у горизонтальному розділеному екрані.
@@ -53,24 +53,24 @@ nvim /path/to/the/file
Цей плагін у поєднанні з *RipGrep* дозволяє нам шукати файл, який потрібно відкрити в інтерактивному режимі. Якщо ввести початкові символи файлу, який ми шукаємо, плагін ігноруватиме всі невідповідні файли та показуватиме лише ті, які відповідають нашому пошуку. Це забезпечує дуже плавний пошук і відкритий процес.
-Щоб отримати доступ до функції пошуку файлів телескопа, нам потрібно перейти в ЗВИЧАЙНИЙ режим у редакторі, а потім ввести: SHIFT + :Telescope fd
+Щоб отримати доступ до функції пошуку файлів телескопа, нам потрібно перейти в ЗВИЧАЙНИЙ режим у редакторі, а потім ввести: ++shift++ + ++":"++ **Telescope fd**
-
+
## Робота з редактором
-Коли файл відкрито, ми можемо почати його редагувати. Для цього нам потрібно перейти до режиму INSERT, який активується натисканням клавіші i (insert). Індикатор режиму в рядку стану має змінитися з NORMAL на INSERT, а курсор, розміщений у буфері, також має змінитися з кольорового прямокутника на `|`.
+Коли файл відкрито, ми можемо почати його редагувати. Для цього нам потрібно перейти до режиму INSERT, який активується натисканням клавіші ++"i"++ (insert). Індикатор режиму в рядку стану має змінитися з NORMAL на INSERT, а курсор, розміщений у буфері, також має змінитися з кольорового прямокутника на `|`.
Тепер усі символи, які ми вводимо, вставляються в документ, починаючи з позиції курсору. Для переміщення курсору в режимі INSERT розробники Nvchad створили кілька зручних комбінацій, які:
-- CTRL + b для переходу на початок рядка
-- CTRL + e, для переходу в кінець рядка
-- CTRL + h для переміщення на один символ ліворуч
-- CTRL + l для переміщення на один символ праворуч
-- CTRL + j для переходу до наступного рядка
-- CTRL + k, для переходу до попереднього рядка
+* ++ctrl++ + ++"b"++ для переходу на початок рядка
+* ++ctrl++ + ++"e"++, для переходу в кінець рядка
+* ++ctrl++ + ++"h"++ для переміщення на один символ ліворуч
+* ++ctrl++ + ++"l"++ для переміщення на один символ праворуч
+* ++ctrl++ + ++"j"++ для переходу до наступного рядка
+* ++ctrl++ + ++"k"++, для переходу до попереднього рядка
-Вивчення всіх комбінацій займає деякий час, але після того, як вони будуть отримані, навігація буде дуже швидкою. Наприклад, якщо ми хочемо відредагувати кінець наступного рядка до місця розташування курсора, ми можемо перейти до кінця поточного рядка за допомогою CTRL + e і потім перейти до наступного за допомогою CTRL + j і вже будемо готові додати зміни.
+Вивчення всіх комбінацій займає деякий час, але після того, як вони будуть отримані, навігація буде дуже швидкою. Наприклад, якщо ми хочемо відредагувати кінець наступного рядка до місця розташування курсора, ми можемо перейти до кінця поточного рядка за допомогою ++ctrl++ + ++"e"++ і потім перейти до наступного за допомогою ++ctrl++ + ++"j"++ і вже будемо готові додати зміни.
Переміщення в документі також можна здійснювати за допомогою клавіш зі стрілками на клавіатурі або миші.
@@ -78,33 +78,32 @@ nvim /path/to/the/file
Виділення тексту також можна зробити за допомогою миші, і це дуже зручно, але в цій главі ми будемо використовувати традиційний метод на основі клавіатури.
-Для виділення тексту потрібно увійти в ВІЗУАЛЬНИЙ режим. Щоб зробити це, ми маємо спочатку вийти з режиму вставки та перейти до звичайного режиму, що можна зробити за допомогою клавіші ESC.
+Для виділення тексту потрібно увійти в ВІЗУАЛЬНИЙ режим. Щоб зробити це, ми маємо спочатку вийти з режиму вставки та перейти до звичайного режиму, що можна зробити за допомогою клавіші ++esc++.
-Коли ми розмістимо курсор на початку частини, яку хочемо виділити, ми використаємо клавіші CTRL + v, щоб увійти до режиму V-BLOC (Visual Block). Тепер, рухаючись курсором, ми побачимо, що наш вибір буде виділено. На цьому етапі ми можемо працювати над виділеною частиною тексту.
+Коли ми розмістимо курсор на початку частини, яку хочемо виділити, ми використаємо клавіші ++ctrl++ + ++"v"++, щоб увійти до режиму V-BLOC (Visual Block). Тепер, рухаючись курсором, ми побачимо, що наш вибір буде виділено. На цьому етапі ми можемо працювати над виділеною частиною тексту.
-Якщо ми хочемо скопіювати виділення в буфер обміну, ми скористаємося клавішею y. Якщо ми хочемо видалити його, натисніть клавішу d. Після завершення операції текст більше не буде виділено. Щоб отримати огляд усіх операцій, які можна виконати у візуальному режимі, ви можете переглянути довідку безпосередньо з редактора за допомогою SHIFT + :help Visual-Mode.
+Якщо ми хочемо скопіювати виділення в буфер обміну, ми скористаємося клавішею ++"y"++. Якщо ми хочемо видалити його, натисніть клавішу ++"d"++. Після завершення операції текст більше не буде виділено. Щоб отримати огляд усіх операцій, які можна виконати у візуальному режимі, ви можете переглянути довідку безпосередньо з редактора за допомогою ++shift++ + ++":"++ **help Visual-Mode**.

### Текстовий пошук
-Для пошуку використовується скісна риска /, за якою слідує ключ пошуку `/search_key`, який виділяє всі знайдені випадки. Для переходу до наступного використовується комбінація / + Enter. Щоб перейти до попереднього ? + Enter.
+Для пошуку використовується скісна риска ++"/"++, за якою слідує ключ пошуку `/search_key`, який виділяє всі знайдені випадки. Для переходу до наступного використовується комбінація ++"/"++ + ++enter++. Щоб перейти до попереднього ++"?"++ + ++enter++.
-Після завершення пошуку виділення можна видалити за допомогою команди SHIFT + :noh (без виділення).
+Після завершення пошуку виділення можна видалити за допомогою команди ++shift++ + ++":"++ **noh** (без виділення).

-Пошуки можуть бути навіть складнішими, ніж описані вище; можна використовувати символи підстановки, лічильники та інші параметри. Щоб переглянути додаткові параметри, можна скористатися командою довідки (SHIFT + :help /).
+Пошуки можуть бути навіть складнішими, ніж описані вище; можна використовувати символи підстановки, лічильники та інші параметри. Щоб переглянути додаткові параметри, можна скористатися командою довідки (++shift++ + ++":"++ **help**).
## Збереження документа
-Коли файл створено або змінено, він зберігається шляхом виходу з режиму INSERT за допомогою ESC, а потім введенням команди SHIFT + :w (write), який збереже файл із поточною назвою в тому місці, де він знаходиться. Якщо ви хочете зберегти файл під іншим ім’ям або в іншому місці, просто виконайте команду за шляхом збереження:
+Коли файл створено або змінено, він зберігається шляхом виходу з режиму INSERT за допомогою ++esc++, а потім введенням команди ++shift++ + ++":"++ + ++"w"++ (write), який збереже файл із поточною назвою в тому місці, де він знаходиться. Якщо ви хочете зберегти файл під іншим ім’ям або в іншому місці, просто виконайте команду за шляхом збереження:
```text
:w /path/to/new/file_or_position
```
-Щоб зберегти і одночасно закрити редактор, використовується команда SHIFT + :wq (write - quit).
-
-У цьому розділі ми познайомили вас із редактором. Існує набагато більше розширених функцій, ніж описані тут. З цими функціями можна ознайомитися на сторінці [довідки Neovim](https://neovim.io/doc/user/) або ввівши наступну команду в редакторі SHIFT + :help.
+Щоб зберегти і одночасно закрити редактор, використовується команда ++shift++ + ++":"++ + ++"wq"++ (write - quit).
+У цьому розділі ми познайомили вас із редактором. Існує набагато більше розширених функцій, ніж описані тут. З цими функціями можна ознайомитися на сторінці [довідки Neovim](https://neovim.io/doc/user/) або ввівши наступну команду в редакторі ++shift++ + ++":"++ + **help**.
diff --git a/docs/books/nvchad/plugins/md_preview.uk.md b/docs/books/nvchad/plugins/md_preview.uk.md
index 7e1d72484e..fbcb4c3ee9 100644
--- a/docs/books/nvchad/plugins/md_preview.uk.md
+++ b/docs/books/nvchad/plugins/md_preview.uk.md
@@ -27,9 +27,9 @@ tags:
Якщо ви також встановили [шаблон Chadrc](../template_chadrc.md), цей компонент уже буде доступним, оскільки це один із мовних серверів, установлених за умовчанням. Якщо його ще немає в редакторі, ви можете встановити його за допомогою команди `:MasonInstall deno`.
-!!! Важливо
+!!! Warning "Увага"
- Мовний сервер **необхідно** встановити перед тим, як продовжити встановлення плагіна. Інакше інсталяція не вдасться, і потрібно буде видалити код із **/custom/plugins.lua**, виконати очищення конфігурації, відкривши `Lazy` і ввівши X щоб видалити плагін, а потім повторити процедуру встановлення.
+ Мовний сервер **необхідно** встановити перед тим, як продовжити встановлення плагіна. В іншому випадку інсталяція завершиться невдачею, і буде необхідно видалити код із **/custom/plugins.lua**, виконайте очищення конфігурації, відкривши `Lazy` і ввівши ++"X"++, щоб видалити плагін, а потім повторіть процедуру встановлення.
Щоб установити плагін, вам потрібно буде відредагувати файл **/custom/plugins.lua**, додавши наступний блок коду:
@@ -55,11 +55,11 @@ tags:
},
```
-Після збереження файлу ви можете виконати його інсталяцію, відкривши інтерфейс менеджера плагінів за допомогою команди `:Lazy`. Менеджер плагінів вже розпізнає його автоматично та дозволить вам встановити його, ввівши I.
+Після збереження файлу ви можете виконати його інсталяцію, відкривши інтерфейс менеджера плагінів за допомогою команди `:Lazy`. Менеджер плагінів вже розпізнає його автоматично та дозволить вам встановити його, ввівши ++"I"++.
Щоб отримати повну функціональність, ви повинні закрити NvChad (*nvim*) і знову відкрити його. Це дозволяє редактору завантажити файли **Peek** у конфігурацію.
-Його конфігурація вже містить команду для його активації `op`, що на клавіатурі перекладається як Пробіл + o, а потім p .
+Його конфігурація вже містить команду для його активації `op`, що на клавіатурі перекладається як ++space++ + ++"o"++, а потім ++"p"++.

@@ -98,7 +98,7 @@ opts = { theme = "dark", app = "browser" },
Однак параметри потрібно змінити, щоб відповідати конфігурації `lazy.nvim`, зокрема параметру, налаштованого в цьому прикладі:
```lua
-vim.g.mkdp_theme = 'dark'
+vim.g.mkdp_theme = "dark"
```
Це відповідає варіанту, описаному на сайті проекту як:
@@ -115,9 +115,8 @@ let g:mkdp_browser = '/usr/bin/chromium-browser'
Щоб правильно інтерпретувати це в NvChad, його потрібно буде змінити, замінивши `let g:` на `vim.g.`.
-
```lua
-vim.g.mkdp_browser = '/usr/bin/chromium-browser'
+vim.g.mkdp_browser = "/usr/bin/chromium-browser"
```
Таким чином, під час наступного відкриття NvChad `chromium-browser` використовуватиметься незалежно від браузера системи за замовчуванням.
@@ -127,16 +126,16 @@ vim.g.mkdp_browser = '/usr/bin/chromium-browser'
```lua
-- binding for Markdown Preview
M.mdpreview = {
- n = {
- ["mp"] = { " MarkdownPreview", "Open Preview"},
- ["mc"] = { " MarkdownPreviewStop", "Close Preview"},
+ n = {
+ ["mp"] = { " MarkdownPreview", "Open Preview" },
+ ["mc"] = { " MarkdownPreviewStop", "Close Preview" },
},
}
```
-Це дозволить вам відкрити попередній перегляд розмітки, ввівши Enter + m і p, і закрити його комбінацією Enter + m, а потім c.
+Це дозволить вам відкрити попередній перегляд розмітки, ввівши ++enter++ + ++"m"++, після чого ++"p"++, і закрити його комбінацією ++enter++ + ++"m"++, після чого ++"c"++.
-!!! Примітка
+!!! Note "Примітка"
Плагін також надає команду `:MarkdownPreviewToggle`, але на момент написання цього документа вона не працює належним чином. Якщо ви спробуєте його викликати, це не змінить тему попереднього перегляду, але відкриє нову вкладку веб-переглядача з тим самим попереднім переглядом.
diff --git a/docs/books/nvchad/plugins/projectmgr.uk.md b/docs/books/nvchad/plugins/projectmgr.uk.md
index 7a37069f87..2adc86b2ea 100644
--- a/docs/books/nvchad/plugins/projectmgr.uk.md
+++ b/docs/books/nvchad/plugins/projectmgr.uk.md
@@ -30,7 +30,7 @@ tags:
},
```
-Як тільки ви збережете файл, плагін буде доступний для встановлення. Щоб установити його, відкрийте *lazy.nvim* за допомогою команди `:Lazy` та введіть I. Після завершення встановлення вам доведеться вийти з редактора та знову відкрити його, щоб він прочитав нову конфігурацію, яку ви ввели.
+Як тільки ви збережете файл, плагін буде доступний для встановлення. Щоб установити його, відкрийте *lazy.nvim* за допомогою команди `:Lazy` та введіть ++"I"++. Після завершення встановлення вам доведеться вийти з редактора та знову відкрити його, щоб він прочитав нову конфігурацію, яку ви ввели.
Плагін надає одну команду `:ProjectMgr`, яка відкриває інтерактивний буфер, з якого можна виконувати всі операції за допомогою комбінацій клавіш. Після першого відкриття буфер буде порожнім, як показано на цьому скріншоті:
@@ -38,7 +38,7 @@ tags:
### Використання менеджера проекту
-Усі операції виконуються за допомогою клавіші Ctrl, за якою йде літера (наприклад, `` відповідає клавіша Enter.
+Усі операції виконуються за допомогою клавіші ++ctrl++, за якою йде літера (наприклад, `` відповідає клавіша ++enter++.
У наступній таблиці показано всі доступні операції
@@ -50,7 +50,7 @@ tags:
| `` | Змінює налаштування проекту |
| `` | Закриває буфер |
-Щоб додати свій перший проект, вам потрібно буде використати комбінацію Ctrl + a, яка відкриє інтерактивне меню в *рядку стану*. У цьому прикладі буде використано клон документації Rocky Linux, збереженої в **~/lab/rockydocs/documentation**.
+Щоб додати свій перший проект, вам потрібно буде використати комбінацію ++ctrl++ + ++"a"++, яка відкриє інтерактивне меню в *рядку стану*. У цьому прикладі буде використано клон документації Rocky Linux, збереженої в **~/lab/rockydocs/documentation**.
Перше запитання попросить вас назвати проект:
@@ -72,13 +72,13 @@ tags:
Команди слід вводити, пропускаючи двокрапку `:`, яка використовується для виконання тих самих команд у *рядку стану.*
-Після завершення налаштування ваш проект буде доступний у буфері. Щоб відкрити його, виберіть його та натисніть Enter.
+Після завершення налаштування ваш проект буде доступний у буфері. Щоб відкрити його, виберіть його та натисніть ++enter++.

Як ви можете бачити на знімку екрана в **Config & Info** плагін розпізнає папку як керовану *Git* і надає нам деяку інформацію про неї.
-Редагування проекту виконується за допомогою Ctrl + e і складається з нового інтерактивного циклу, тоді як будь-яке видалення виконується за допомогою комбінації Ctrl + d.
+Редагування проекту виконується за допомогою ++ctrl++ + ++"e"++ і складається з нового інтерактивного циклу, тоді як будь-яке видалення виконується за допомогою комбінації ++ctrl++ + ++"d"++.
### Додаткові функції
@@ -146,13 +146,13 @@ session = { enabled = true, file = "Session.vim" },
```lua
-- Projects
M.projects = {
- n = {
- ["fp"] = { " ProjectMgr", "Open Projects"}
+ n = {
+ ["fp"] = { " ProjectMgr", "Open Projects" },
},
}
```
-З редактором у стані **NORMAL** ви можете відкрити менеджер проектів за допомогою комбінації Пробіл + f і p.
+З редактором у стані **NORMAL** ви можете відкрити менеджер проектів за допомогою комбінації ++space++ + ++"f"++ і ++"p"++.
## Висновки та заключні думки
diff --git a/docs/books/nvchad/template_chadrc.uk.md b/docs/books/nvchad/template_chadrc.uk.md
index ebdfb1a3da..cf33667b44 100644
--- a/docs/books/nvchad/template_chadrc.uk.md
+++ b/docs/books/nvchad/template_chadrc.uk.md
@@ -54,20 +54,20 @@ custom/
local M = {}
-- Path to overriding theme and highlights files
-local highlights = require "custom.highlights"
+local highlights = require("custom.highlights")
M.ui = {
- theme = "onedark",
- theme_toggle = { "onedark", "one_light" },
+ theme = "onedark",
+ theme_toggle = { "onedark", "one_light" },
- hl_override = highlights.override,
- hl_add = highlights.add,
+ hl_override = highlights.override,
+ hl_add = highlights.add,
}
M.plugins = "custom.plugins"
-- check core.mappings for table structure
-M.mappings = require "custom.mappings"
+M.mappings = require("custom.mappings")
return M
```
@@ -84,7 +84,7 @@ M.load_config = function()
Його функція полягає в тому, щоб вставити файли з нашої папки _custom_ у конфігурацію NvChad, щоб потім використовувати їх разом із файлами за замовчуванням для запуску _ Neovim_екземпляра. Файли вставляються в дерево конфігурації за допомогою функцій `require`, таких як:
```lua
-require "custom.mappings"
+require("custom.mappings")
```
Рядок **custom.mappings** вказує відносний шлях до файлу без розширення на відміну від шляху за замовчуванням, який у цьому випадку становить **~/.config/nvim/lua/**. Крапка замінює косу риску, оскільки це конвенція в коді, написаному мовою Lua (у _мові lua_ немає поняття _каталогу _).
@@ -157,17 +157,17 @@ opt.smartindent = true
```lua
M.general = {
- n = {
- [";"] = { ":", "enter command mode", opts = { nowait = true } },
- },
+ n = {
+ [";"] = { ":", "enter command mode", opts = { nowait = true } },
+ },
}
```
-Це відображення вводиться для НОРМАЛЬНОГО стану `n =` символ ;, який при натисканні на клавіатурі відтворює символ :. Цей символ використовується для входу в режим COMMAND. Параметр `nowait = true` також встановлено для негайного входу в цей режим. Таким чином, на клавіатурі з американською розкладкою QWERTY нам не потрібно буде використовувати SHIFT для входу в режим COMMAND.
+Це відображення вводиться для стану NORMAL `n =` символ ++";"++, який при натисканні на клавіатурі відтворює символ ++":"++. Цей символ використовується для входу в режим COMMAND. Параметр `nowait = true` також встановлено для негайного входу в цей режим. Таким чином, на клавіатурі з американською розкладкою QWERTY нам не потрібно буде використовувати ++shift++ для входу в режим COMMAND.
!!! tip "Порада"
- Для користувачів європейських клавіатур (таких як італійська) рекомендується замінити символ ; з ,.
+ Користувачам європейських клавіатур (наприклад, італійської) рекомендується замінити символ ++";"++ на ++","++.
#### highlights.lua
@@ -211,14 +211,14 @@ local servers = { "html", "cssls", "tsserver", "clangd", "yamlls" }
```lua
local sources = {
- -- webdev stuff
- b.formatting.deno_fmt,
- b.formatting.prettier.with { filetypes = { "html", "markdown", "css" } },
- -- Lua
- b.formatting.stylua,
+ -- webdev stuff
+ b.formatting.deno_fmt,
+ b.formatting.prettier.with({ filetypes = { "html", "markdown", "css" } }),
+ -- Lua
+ b.formatting.stylua,
- -- cpp
- b.formatting.clang_format,
+ -- cpp
+ b.formatting.clang_format,
}
```
@@ -251,24 +251,24 @@ _treesitter_ — це аналізатор коду, який інтеракти
```lua
M.treesitter = {
- ensure_installed = {
- "vim",
- "lua",
- "html",
- "css",
- "javascript",
- "typescript",
- "tsx",
- "c",
- "markdown",
- "markdown_inline",
- },
- indent = {
- enable = true,
- -- disable = {
- -- "python"
- -- },
- },
+ ensure_installed = {
+ "vim",
+ "lua",
+ "html",
+ "css",
+ "javascript",
+ "typescript",
+ "tsx",
+ "c",
+ "markdown",
+ "markdown_inline",
+ },
+ indent = {
+ enable = true,
+ -- disable = {
+ -- "python"
+ -- },
+ },
}
```
@@ -296,18 +296,18 @@ M.treesitter = {
```lua
M.mason = {
- ensure_installed = {
- -- lua stuff
- "lua-language-server",
- "stylua",
-
- -- web dev stuff
- "css-lsp",
- "html-lsp",
- "typescript-language-server",
- "deno",
- "prettier"
- },
+ ensure_installed = {
+ -- lua stuff
+ "lua-language-server",
+ "stylua",
+
+ -- web dev stuff
+ "css-lsp",
+ "html-lsp",
+ "typescript-language-server",
+ "deno",
+ "prettier",
+ },
}
```
diff --git a/docs/books/nvchad/vale_nvchad.uk.md b/docs/books/nvchad/vale_nvchad.uk.md
index 457ad2b870..0a472d7730 100644
--- a/docs/books/nvchad/vale_nvchad.uk.md
+++ b/docs/books/nvchad/vale_nvchad.uk.md
@@ -20,11 +20,11 @@ tags:
## Встановлення `vale` за допомогою Mason
-Встановлення `vale` з NvChad за допомогою Mason дозволить підтримувати пакет в актуальному стані за допомогою кількох додаткових кроків. Періодичний запуск Mason з `nvim` покаже вам, чи є оновлення, які потрібно встановити, і дозволить вам оновлювати їх звідти. Це включає `vale` після встановлення. Давайте почнемо із запуску `nvim`, щоб отримати порожній файл, а потім перейдемо в командний режим за допомогою SHIFT+:+Mason, що має показати інтерфейс, подібний до цього:
+Встановлення `vale` з NvChad за допомогою Mason дозволить підтримувати пакет в актуальному стані за допомогою кількох додаткових кроків. Періодичний запуск Mason з `nvim` покаже вам, чи є оновлення, які потрібно встановити, і дозволить вам оновлювати їх звідти. Це включає `vale` після встановлення. Давайте почнемо із запуску `nvim`, щоб отримати порожній файл, а потім перейдемо в командний режим за допомогою ++shift++ + ++":"++ + Mason, який має показати інтерфейс, подібний до цього:

-Замість того, щоб переглядати весь список пакунків, скористаємося пунктом меню 4, щоб обмежити список лінтерами. Натисніть 4 і прокрутіть список униз, доки не знайдете `vale`, а потім, встановивши курсор у цьому рядку, натисніть i, щоб установити. Тепер у вашому списку має відображатися встановлений `vale`:
+Замість того, щоб переглядати весь список пакунків, скористаємося пунктом меню 4, щоб обмежити список лінтерами. Натисніть ++4++ і прокрутіть список униз, доки не знайдете `vale`, а потім, встановивши курсор у цьому рядку, натисніть ++"i"++, щоб установити. Тепер у вашому списку має відображатися встановлений `vale`:

@@ -52,7 +52,7 @@ tags:
Потрібно створити папку «styles». Зробіть це, запустивши двійковий файл `vale` за допомогою команди `sync`. Знову ж таки, якщо ви робите це з каталогу `~/.local/share/nvim/mason/packages/vale/`, просто виконайте:
-```
+```bash
./vale sync
```
@@ -62,7 +62,7 @@ tags:
Скопіюйте `.vale.ini` та папку `styles` до кореня домашньої папки:
-```
+```bash
cp .vale.ini ~/
cp -rf styles ~/
```
@@ -77,7 +77,7 @@ cp -rf styles ~/
Далі запустіть команду `vale sync`. Оскільки ви перебуваєте у своєму домашньому каталозі, вам знадобиться повний шлях до двійкового файлу:
-```
+```bash
~/.local/share/nvim/mason/packages/vale/vale sync
```
@@ -85,14 +85,13 @@ cp -rf styles ~/
У цьому випадку немає необхідності копіювати файли, оскільки вони будуть створені в кореневому каталозі.
-
## Змінити файл `null-ls.lua`
Потрібен ще один останній крок. Вам потрібно змінити файл `null-ls.lua`, знайдений у `~/.config/nvim/lua/custom/configs/`, і додати лінтер `vale`.
Якщо у вас не встановлено інших лінтерів, створіть розділ із двома тире (коментарями) під назвою «лінтери», а потім розмістіть туди цей код:
-```
+```lua
b.diagnostics.vale,
```
diff --git a/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md
new file mode 100644
index 0000000000..46daa9e830
--- /dev/null
+++ b/docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md
@@ -0,0 +1,157 @@
+---
+title: Регулярні вирази та символи підстановки
+author: tianci li
+contributors: null
+tags:
+ - Регулярні вирази
+ - Символи підстановки
+---
+
+# Регулярні вирази та символи підстановки
+
+В операційній системі GNU/Linux регулярні вирази та символи підстановки часто мають однаковий символ (або стиль), тому люди часто їх плутають.
+
+Яка різниця між регулярними виразами та символами підстановки?
+
+Подібності:
+
+- Вони мають однаковий символ, але представляють абсолютно різні значення.
+
+Відмінності:
+
+- Регулярні вирази відповідають вмісту файлу; Символи підстановки зазвичай використовуються для відповідності імен файлів або каталогів.
+- Регулярні вирази зазвичай використовуються в таких командах, як `grep`, `sed`, `awk` тощо.
+- Символи підстановки зазвичай використовуються з такими командами, як `cp`, `find`, `mv`, `touch`, `ls` тощо.
+
+## Символи підстановки в GNU/Linux
+
+ОС GNU/Linux підтримує такі символи підстановки:
+
+| стиль символів підстановки | роль |
+| :-----------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| ? | Відповідає одному символу імені файлу або каталогу. |
+| - | Відповідає 0 або більше довільним символам імені файлу чи каталогу. |
+| [ ] | Збігається з будь-яким символом у круглих дужках. Наприклад, [один] що означає відповідність o, n або e. |
+| [-] | Збігається з будь-яким символом у вказаному діапазоні в дужках. Наприклад, [0-9] відповідає будь-якому окремому числу від 0 до 9. |
+| [^] | «логічне невідповідність» одного символу. Наприклад, [^a-zA-Z] представляє відповідність одному нелітерному символу. |
+| {,} | Неперервний збіг кількох окремих символів. Виділяється комами. |
+| {..} | Те саме, що [-]. Наприклад, {0..9} і {a..z} |
+
+Різні команди мають різну підтримку стилів підстановки:
+
+- `find`: Підтримує \*, ?, [ ], [-], [^]
+- `ls`: усі підтримуються
+- `mkdir`: Підтримує {,} and {..}
+- `touch`: Підтримує {,} and {..}
+- `mv`: Всі підтримуються
+- `cp`: Всі підтримуються
+
+Наприклад:
+
+```bash
+Shell > mkdir -p /root/dir{1..3}
+Shell > cd /root/dir1/
+Shell > touch file{1,5,9}
+Shell > cd
+Shell > mv /root/dir1/file[1-9] /root/dir2/
+Shell > cp /root/dir2/file{1..9} /root/dir3/
+Shell > find / -iname "dir[1-9]" -a -type d
+```
+
+## Регулярні вирази в GNU/Linux
+
+Завдяки історичному розвитку існують дві основні школи регулярних виразів:
+
+- POSIX:
+ - BRE(basic regular express)
+ - ERE(extend regular express)
+ - Клас символів POSIX
+- PCRE (Regular Expressions, сумісні з Perl): найпоширеніша серед різних мов програмування.
+
+| | BRE | ERE | Клас символів POSIX | PCRE |
+| :----: | :-: | :------------------------------------------: | :-----------------: | :------------------------------------------: |
+| `grep` | √ | √ (Потрібна опція -E) | √ | √ (Потрібна опція -P) |
+| `sed` | √ | √ (Потрібна опція -r) | √ | × |
+| `awk` | √ | √ | √ | × |
+
+Щоб дізнатися більше про регулярні вирази, відвідайте [цей веб-сайт](https://www.regular-expressions.info/), щоб отримати більше корисної інформації.
+
+### BRE
+
+BRE (базовий регулярний вираз) — це найстаріший тип регулярного виразу, введений командою `grep` в системах UNIX і текстовому редакторі **ed**.
+
+| метасимвол | опис | приклад bash |
+| :-----------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------ |
+| - | Відповідає кількості повторень попереднього символу, яка може бути 0 або будь-якою кількістю разів. | |
+| . | Відповідає будь-якому окремому символу, за винятком розривів рядків. | |
+| ^ | Відповідає початку рядка. Наприклад, **^h** відповідатиме рядкам, які починаються з h. | |
+| $ | Збігається з кінцем рядка. Наприклад, **h$** відповідатиме рядкам, які закінчуються на h. | |
+| [] | Збігається з будь-яким символом, указаним у дужках. Наприклад - **[who]** відповідатиме w, h або o; **[0-9]** відповідатиме одній цифрі; **[0-9][a-z]** відповідатиме символам, які складаються з однієї цифри та однієї малої літери. | |
+| [^] | Відповідає будь-якому окремому символу, крім символів у дужках. Наприклад, **[^0-9]** відповідатиме будь-якому нечисловому символу. **[^a-z]** відповідатиме будь-якому символу, який не є малою літерою. | |
+| \\ | Екранний символ скасовує значення, представлене деякими спеціальними символами. | `echo -e "1.2\n122" \\| grep -E '1\.2'` **1.2** |
+| \\{n\\} | Збігається з кількістю входжень попереднього одного символу, а n представляє кількість збігів. | `echo -e "1994\n2000\n2222" \\| grep "[24]\{4\}"` **2222** |
+| \\{n,\\} | Збігається з попереднім єдиним символом принаймні n разів. | `echo -e "1994\n2000\n2222" \\| grep "[29]\{2,\}"` 1**99**4 **2222** |
+| \\{n,m\\} | Збігається з попереднім єдиним символом принаймні n і не більше m разів. | `echo -e "abcd\n20\n300\n4444" \\| grep "[0-9]\{2,4\}"` **20** **300** **4444** |
+
+### ERE
+
+| метасимвол | опис | приклад bash |
+| :-------------------: | :----------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------- |
+| - | Відповідає кількості входжень попереднього одного символу, який може бути один або кілька разів. | `echo -e "abcd\nab\nabb\ncdd" \\| grep -E "ab+"` **ab**cd **ab** **abb** |
+| ? | Збігається з кількістю входжень попереднього одного символу, який може бути 0 або 1. | `echo -e "ac\nabc\nadd" \\| grep -E 'a?c'` **ac** ab**c** |
+| \\< | Граничний символ, який відповідає початку рядка. | `echo -e "1\n12\n123\n1234" \\| grep -E "\<123"` **123** **123**4 |
+| \\> | Граничний символ, що відповідає кінцю рядка. | `echo -e "export\nimport\nout" \\| grep -E "port\>"` ex**port** im**port** |
+| () | Комбінаторне зіставлення, тобто рядок у дужках як комбінація, а потім зіставлення. | `echo -e "123abc\nabc123\na1b2c3" \\| grep -E "([a-z][0-9])+"` ab**c1**23 **a1b2c3** |
+| \| | Символ крнвеєру представляє значення "або". | `echo -e "port\nimport\nexport\none123" \\| grep -E "port\>\\|123"` **port** im**port** ex**port** one**123** |
+
+ERE також підтримує символи зі спеціальними значеннями:
+
+| спеціальні символи | опис |
+| :----------------: | :-------------------------------------------------------------------------------------------------------------- |
+| \w | Еквівалент **[a-zA-Z0-9]** |
+| \W | Еквівалент **[^a-zA-Z0-9]** |
+| \d | Еквівалент **[0-9]** |
+| \D | Еквівалент **[^0-9]** |
+| \b | Еквівалент **\\<** або **\\>** |
+| \B | Відповідає символу без меж. |
+| \s | Відповідає будь-якому пробілу. Еквівалент **[ \f\n\r\t\v]** |
+| \S | Еквівалент **[^ \f\n\r\t\v]** |
+
+| порожній символ | опис |
+| :-------------: | :-------------------------------------------------------------------- |
+| \f | Відповідає одному символу каналу. Еквівалент **\x0c** і **\cL** |
+| \n | Збігається з окремими розривами рядків. Еквівалент **\x0a** і **\cJ** |
+| \r | Збігається з одним поверненням каретки. Еквівалент **\x0d** і **\cM** |
+| \t | Відповідає одній вкладці. Еквівалент **\x09** і **\cI** |
+| \v | Відповідає одній вертикальній вкладці. Еквівалент **\x0b** і **\cK** |
+
+### POSIX символ
+
+Іноді ви можете побачити «символ POSIX» (також відомий як «клас символів POSIX»).
+Однак автор рідко використовує «символ POSIX», тому цей розділ лише для базового розуміння.
+
+| POSIX символ | дорівнює |
+| :------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| [:alnum:] | [a-zA-Z0-9] |
+| [:alpha:] | [a-zA-Z] |
+| [:lower:] | [a-z] |
+| [:upper:] | [A-Z] |
+| [:digit:] | [0-9] |
+| [:space:] | [ \f\n\r\t\v] |
+| [:graph:] | [^ \f\n\r\t\v] |
+| [:blank:] | [ \t] |
+| [:cntrl:] | [\x00-\x1F\x7F] |
+| [:print:] | [\x20-\x7E] |
+| [:punct:] | [][!"#$%&'()\*+,./:;<=>?@^_\`{\|}\~-] |
+| [:xdigit:] | [A-Fa-f0-9] |
+
+### Знайомство з регулярними виразами
+
+Існує багато веб-сайтів для відпрацювання навичок регулярних виразів онлайн, наприклад:
+
+- [regex101](https://regex101.com/)
+- [oschina](https://tool.oschina.net/regex/)
+- [oktools](https://oktools.net/regex)
+- [regexr](https://regexr.com/)
+- [regelearn](https://regexlearn.com/)
+- [coding](https://coding.tools/regex-tester)
diff --git a/docs/books/sed_awk_grep/2_grep_command.uk.md b/docs/books/sed_awk_grep/2_grep_command.uk.md
new file mode 100644
index 0000000000..abfa21164c
--- /dev/null
+++ b/docs/books/sed_awk_grep/2_grep_command.uk.md
@@ -0,0 +1,280 @@
+---
+title: Команда Grep
+author: tianci li
+contributors: null
+tags:
+ - grep
+---
+
+# Команда `grep`
+
+Команда `grep` фільтрує вміст одного або кількох файлів. Існують деякі варіанти цього командного інструменту, наприклад `egrep (grep -E)` і `fgrep (grep -f)`. Для інформації, яка не охоплюється, перегляньте [посібник `grep`](https://www.gnu.org/software/grep/manual/ "посібник grep").
+
+Використання команди `grep` наступне:
+
+```text
+grep [OPTIONS] PATTERN [FILE...]
+grep [OPTIONS] -e PATTERN ... [FILE...]
+grep [OPTIONS] -f FILE ... [FILE...]
+```
+
+Варіанти в основному поділяються на чотири частини:
+
+- match control
+- output control
+- content line control
+- directory or file control
+
+match control:
+
+| опції | опис |
+| :----------------------- | :--------------------------------------------------------- |
+| -E --extended-regexp | Вмикає ERE |
+| -P --perl-regexp | Вмикає PCRE |
+| -G --basic-regexp | Вмикає BRE за замовченням |
+| -e --regexp=PATTERN | Відповідність шаблону, можна вказати кілька параметрів -e. |
+| -i | Ігнорує регістр |
+| -w | Точна відповідність всьому слову |
+| -f FILE | Отримує шаблони з ФАЙЛУ, по одному на рядок |
+| -x | Візерункове збігання по всій лінії |
+| -v | Вибирає рядки вмісту, які не збігаються |
+
+output control:
+
+| опції | опис |
+| :----- | :----------------------------------------------------------------------------------------------------------------- |
+| -m NUM | Виводить кілька перших відповідних результатів |
+| -n | Друкує номери рядків на виході |
+| -H | У разі зіставлення вмісту кількох файлів відображає назву файлу на початку рядка. Це налаштування за замовчуванням |
+| -h | Під час зіставлення вмісту кількох файлів ім’я файлу не відображається на початку рядка |
+| -o | Друкує лише відповідний вміст без виведення всього рядка |
+| -q | Не виводить нормальну інформацію |
+| -s | Не виводить повідомлення про помилки |
+| -r | Рекурсивне зіставлення для каталогів |
+| -c | Друкує кількість рядків, які відповідають кожному файлу на основі вмісту користувача |
+
+content line control:
+
+| опції | опис |
+| :----- | :----------------------------------------------------------------- |
+| -B NUM | Друкує NUM рядків початкового контексту перед відповідними рядками |
+| -A NUM | Друкує NUM рядків кінцевого контексту після відповідних рядків |
+| -C NUM | Друкує NUM рядків вихідного контексту |
+
+directory or file control:
+
+| опції | опис |
+| :------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| --include=FILE_PATTERN | Шукає лише файли, які відповідають FILE_PATTERN. Підтримуються символи підстановки для імен файлів \*, ?, [], [^], [-], {..}, {,} |
+| --exclude=FILE_PATTERN | Пропускає файли та каталоги, що відповідають FILE_PATTERN. Підтримуються символи підстановки для імен файлів \*, ?, [], [^], [-], {..}, {,} |
+| --exclude-dir=PATTERN | Виключає вказану назву каталогу. Підтримка назв каталогу \*, ?, [], [^], [-], {..}, {,} |
+| --exclude-from=FILE | Виключає вказаний каталог із вмісту файлу. |
+
+## Приклади використання
+
+1. опція -f і опція -o
+
+ ```bash
+ Shell > cat /root/a
+ abcdef
+ 123456
+ 338922549
+ 24680
+ hello world
+
+ Shell > cat /root/b
+ 12345
+ test
+ world
+ aaaaa
+
+ # Treat each line of file b as a matching pattern and output the lines that match file a.
+ Shell > grep -f /root/b /root/a
+ 123456
+ hello world
+
+ Shell > grep -f /root/b /root/a -o
+ 12345
+ world
+ ```
+
+2. Зіставлення кількох шаблонів (за допомогою параметра -e)
+
+ ```bash
+ Shell > echo -e "a\nab\nbc\nbcde" | grep -e 'a' -e 'cd'
+ a
+ ab
+ bcde
+ ```
+
+ або:
+
+ ```bash
+ Shell > echo -e "a\nab\nbc\nbcde" | grep -E "a|cd"
+ a
+ ab
+ bcde
+ ```
+
+3. Видалення порожніх рядків та рядків коментарів із файлу конфігурації
+
+ ```bash
+ Shell > grep -v -E "^$|^#" /etc/chrony.conf
+ server ntp1.tencent.com iburst
+ server ntp2.tencent.com iburst
+ server ntp3.tencent.com iburst
+ server ntp4.tencent.com iburst
+ driftfile /var/lib/chrony/drift
+ makestep 1.0 3
+ rtcsync
+ keyfile /etc/chrony.keys
+ leapsectz right/UTC
+ logdir /var/log/chrony
+ ```
+
+4. Друк 5 найкращих результатів, які збігаються
+
+ ```bash
+ Shell > seq 1 20 | grep -m 5 -E "[0-9]{2}"
+ 10
+ 11
+ 12
+ 13
+ 14
+ ```
+
+ або:
+
+ ```bash
+ Shell > seq 1 20 | grep -m 5 "[0-9]\{2\}"
+ 10
+ 11
+ 12
+ 13
+ 14
+ ```
+
+5. Опція -B та опція -A
+
+ ```bash
+ Shell > seq 1 20 | grep -B 2 -A 3 -m 5 -E "[0-9]{2}"
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ ```
+
+6. Опція -C
+
+ ```bash
+ Shell > seq 1 20 | grep -C 3 -m 5 -E "[0-9]{2}"
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ ```
+
+7. опція -c
+
+ ```bash
+ Shell > cat /etc/ssh/sshd_config | grep -n -i -E "port"
+ 13:# If you want to change the port on a SELinux system, you have to tell
+ 15:# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
+ 17:#Port 22
+ 99:# WARNING: 'UsePAM no' is not supported in RHEL and may cause several
+ 105:#GatewayPorts no
+
+ Shell > cat /etc/ssh/sshd_config | grep -E -i "port" -c
+ 5
+ ```
+
+8. опція -v
+
+ ```bash
+ Shell > cat /etc/ssh/sshd_config | grep -i -v -E "port" -c
+ 140
+ ```
+
+9. Фільтрувати файли в каталозі, які містять рядки, які відповідають рядку (виключити файли в підкаталогах)
+
+ ```bash
+ Shell > grep -i -E "port" /etc/n*.conf -n
+ /etc/named.conf:11: listen-on port 53 { 127.0.0.1; };
+ /etc/named.conf:12: listen-on-v6 port 53 { ::1; };
+ /etc/nsswitch.conf:32:# winbind Use Samba winbind support
+ /etc/nsswitch.conf:33:# wins Use Samba wins support
+ ```
+
+10. Фільтрувати файли в каталозі, які містять рядки, що відповідають рядку (включити або виключити файли або каталоги в підкаталогах)
+
+ Включити синтаксис для кількох файлів:
+
+ ```bash
+ Shell > grep -n -i -r -E "port" /etc/ --include={0..20}_*
+ /etc/grub.d/20_ppc_terminfo:26:export TEXTDOMAIN=grub
+ /etc/grub.d/20_ppc_terminfo:27:export TEXTDOMAINDIR=/usr/share/locale
+ /etc/grub.d/20_linux_xen:26:export TEXTDOMAIN=grub
+ /etc/grub.d/20_linux_xen:27:export TEXTDOMAINDIR="${datarootdir}/locale"
+ /etc/grub.d/20_linux_xen:46:# Default to disabling partition uuid support to maintian compatibility with
+ /etc/grub.d/10_linux:26:export TEXTDOMAIN=grub
+ /etc/grub.d/10_linux:27:export TEXTDOMAINDIR="${datarootdir}/locale"
+ /etc/grub.d/10_linux:47:# Default to disabling partition uuid support to maintian compatibility with
+
+ Shell > grep -n -i -r -E "port" /etc/ --include={{0..20}_*,sshd_config} -c
+ /etc/ssh/sshd_config:5
+ /etc/grub.d/20_ppc_terminfo:2
+ /etc/grub.d/10_reset_boot_success:0
+ /etc/grub.d/12_menu_auto_hide:0
+ /etc/grub.d/20_linux_xen:3
+ /etc/grub.d/10_linux:3
+ ```
+
+ Якщо вам потрібно виключити один каталог, використовуйте такий синтаксис:
+
+ ```bash
+ Shell > grep -n -i -r -E "port" /etc/ --exclude-dir=selin[u]x
+ ```
+
+ Якщо вам потрібно виключити кілька каталогів, використовуйте такий синтаксис:
+
+ ```bash
+ Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it}
+ ```
+
+ Якщо вам потрібно виключити один файл, використовуйте такий синтаксис:
+
+ ```bash
+ Shell > grep -n -i -r -E "port" /etc/ --exclude=sshd_config
+ ```
+
+ Якщо вам потрібно виключити кілька файлів, використовуйте такий синтаксис:
+
+ ```bash
+ Shell > grep -n -i -r -E "port" /etc/ --exclude={ssh[a-z]_config,*.conf,services}
+ ```
+
+ Якщо вам потрібно виключити кілька файлів і каталогів одночасно, використовуйте такий синтаксис:
+
+ ```bash
+ Shell > grep -n -i -r -E "port" /etc/ --exclude-dir={selin[u]x,"profile.d",{a..z}ki,au[a-z]it} --exclude={ssh[a-z]_config,*.conf,services,[0-9][0-9]*}
+ ```
+
+11. Підрахувати всі IPv4-адреси поточної машини
+
+ ```bash
+ Shell > ip a | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | grep -v -E "127|255"
+ 192.168.100.3
+ ```
diff --git a/docs/books/sed_awk_grep/3_sed_command.uk.md b/docs/books/sed_awk_grep/3_sed_command.uk.md
new file mode 100644
index 0000000000..b530129879
--- /dev/null
+++ b/docs/books/sed_awk_grep/3_sed_command.uk.md
@@ -0,0 +1,836 @@
+---
+title: Команда Sed
+author: tianci li
+contributors: null
+tags:
+ - sed
+---
+
+# Команда `sed`
+
+`sed`: Stream Editor
+
+**Принцип роботи**: команда `sed` прочитає поточний оброблений рядок і помістить його в "простір шаблону" для обробки. Після обробки буде виведений результат, а «простір шаблону» очищено. Далі прочитайте наступний рядок і помістіть його в «простір шаблону» для обробки і так далі до останнього рядка. Деякі документи також згадують термін під назвою «простір для зберігання» (також відомий як «простір для тимчасового зберігання»), який може тимчасово зберігати деякі оброблені дані та виводити їх через «простір шаблону».
+
+**"простір шаблону" та "простір утримання"**: область пам’яті, де обробляються та зберігаються дані.
+
+Для отримання додаткової інформації перегляньте [посібник `sed`](https://www.gnu.org/software/sed/manual/ "посібник sed").
+
+Використання команди:
+
+```bash
+sed [OPTION]... {script-only-if-no-other-script} [input-file]...
+```
+
+| опції | опис |
+| :---: | :--------------------------------------------------------------------------- |
+| -n | Виводить на екран рядки тексту, які будуть оброблені лише командою `sed` |
+| -e | Застосовує кілька операційних команд `sed` до вхідних даних текстового рядка |
+| -f | Викликає та виконує командний файл сценарію `sed` |
+| -i | Змінює вихідний файл |
+| -r | Регулярний вираз |
+
+| Операційна команда (іноді називається операційною інструкцією) | опис |
+| :-----------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| s/regexp/replacement/ | Рядок заміни |
+| p | Друкує поточний "простір шаблону". Часто використовується з параметром -n, наприклад: `cat -n /etc/services \\| sed -n '3,5p'` |
+| d | Видаляє «простір шаблону». Починає наступний цикл |
+| D | Видаляє перший рядок «шаблону» та починає наступний цикл |
+| = | Друкує номер рядка |
+| a \text | Додає один або кілька рядків вмісту після відповідного рядка. Під час додавання кількох рядків у всіх рядках, крім останнього, потрібно використовувати "", щоб вказати, що вміст не закінчився |
+| | |
+| i \text | Додає один або кілька рядків вмісту перед відповідним рядком. Під час додавання кількох рядків у всіх рядках, крім останнього, потрібно використовувати "", щоб вказати, що вміст не закінчено |
+| c \text | Замінює відповідні рядки новим текстом |
+| q | Негайний вихід зі сценарію `sed` |
+| r | Додає текст, прочитаний із файлу |
+| : label | Мітка для команд b і t |
+| b label | Гілка до етикетки; якщо мітку опущено, розгалужується до кінця сценарію |
+| t label | Якщо "s///" є успішною заміною, відбувається перехід до мітки |
+| h H | Копіює/додає "простір шаблону" до "простір утримання" |
+| g G | Копіює/додає "пробіл для утримання" до "простір шаблону" |
+| x | Обмінюється вмістом просторів утримання та шаблонів |
+| l | Виводить поточний рядок у «візуально однозначній» формі |
+| n N | Читає/додає наступний рядок введення в "простір шаблону" |
+| w FILENAME | Записує поточний простір шаблону до FILENAME |
+| ! | заперечення |
+| & | Посилання на рядок, який уже збігається |
+
+| Адреси | опис |
+| :---------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| first\~step | Використовуйте «first», щоб указати перший рядок, і «step», щоб вказати розмір кроку. Наприклад, виведення непарних рядків тексту за допомогою `sed -n "1~2p" /etc/services` |
+| $ | Відповідає останньому рядку тексту |
+| /regexp/ | Використання регулярних виразів для зіставлення рядків тексту |
+| number | Визначає номер рядка |
+| addr1,addr2 | Використовує позиціонування номерів рядків, щоб відповідати всім рядкам від "addr1" до "addr2" |
+| addr1,+N | Використовує позиціонування номерів рядків для відповідності addr1 і N рядків після addr1 |
+
+## Приклади використання
+
+1. Зіставлення та друк (`p`)
+
+ - Надрукуйте рядок, який починається з рядка NetBIOS
+
+ ```bash
+ Shell > cat /etc/services | sed -n '/^netbios/p'
+ netbios-ns 137/tcp # NETBIOS Name Service
+ netbios-ns 137/udp
+ netbios-dgm 138/tcp # NETBIOS Datagram Service
+ netbios-dgm 138/udp
+ netbios-ssn 139/tcp # NETBIOS session service
+ netbios-ssn 139/udp
+ ```
+
+ !!! tip "Підказка"
+
+ ```
+ Як ми всі знаємо, подвійні та одинарні лапки в оболонці відіграють різну роль. **$**, **\`** і **\\** у подвійних лапках мають особливе значення. Рекомендовано використовувати одинарні лапки частіше під час використання команди `sed`.
+ ```
+
+ - Вивести текст з 23 по 26 рядки
+
+ ```bash
+ Shell > cat -n /etc/services | sed -n '23,26p'
+ 23 tcpmux 1/tcp # TCP port service multiplexer
+ 24 tcpmux 1/udp # TCP port service multiplexer
+ 25 rje 5/tcp # Remote Job Entry
+ 26 rje 5/udp # Remote Job Entry
+ ```
+
+ - Друкувати непарні рядки
+
+ ```bash
+ Shell > cat -n /etc/services | sed -n '1~2p'
+ 1 # /etc/services:
+ 3 #
+ 5 # IANA services version: last updated 2016-07-08
+ 7 # Note that it is presently the policy of IANA to assign a single well-known
+ 9 # even if the protocol doesn't support UDP operations.
+ 11 # are included, only the more common ones.
+ 13 # The latest IANA port assignments can be gotten from
+ 15 # The Well Known Ports are those from 0 through 1023.
+ 17 # The Dynamic and/or Private Ports are those from 49152 through 65535
+ 19 # Each line describes one service, and is of the form:
+ ...
+ ```
+
+ - Вивести рядок 10 до останнього рядка
+
+ ```bash
+ Shell > cat -n /etc/services | sed -n '10,$p'
+ 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
+ 11 # are included, only the more common ones.
+ 12 #
+ 13 # The latest IANA port assignments can be gotten from
+ 14 # http://www.iana.org/assignments/port-numbers
+ 15 # The Well Known Ports are those from 0 through 1023.
+ 16 # The Registered Ports are those from 1024 through 49151
+ 17 # The Dynamic and/or Private Ports are those from 49152 through 65535
+ ...
+ ```
+
+ - Рядки з 10 до останнього не друкувати
+
+ ```bash
+ Shell > cat -n /etc/services | sed -n '10,$!p'
+ 1 # /etc/services:
+ 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $
+ 3 #
+ 4 # Network services, Internet style
+ 5 # IANA services version: last updated 2016-07-08
+ 6 #
+ 7 # Note that it is presently the policy of IANA to assign a single well-known
+ 8 # port number for both TCP and UDP; hence, most entries here have two entries
+ 9 # even if the protocol doesn't support UDP operations.
+ ```
+
+ - Надрукуйте номер рядка та вміст відповідного рядка
+
+ ```bash
+ Shell > sed -n -e '/netbios/=' -e '/netbios/p' /etc/services
+ 123
+ netbios-ns 137/tcp # NETBIOS Name Service
+ 124
+ netbios-ns 137/udp
+ 125
+ netbios-dgm 138/tcp # NETBIOS Datagram Service
+ 126
+ netbios-dgm 138/udp
+ 127
+ netbios-ssn 139/tcp # NETBIOS session service
+ 128
+ netbios-ssn 139/udp
+ ```
+
+ - Зіставте діапазон рядків і надрукуйте його
+
+ Використовуйте коми для розділення діапазонів рядків
+
+ ```bash
+ Shell > cat /etc/services | sed -n '/^netbios/,/^imap/p'
+ netbios-ns 137/tcp # NETBIOS Name Service
+ netbios-ns 137/udp
+ netbios-dgm 138/tcp # NETBIOS Datagram Service
+ netbios-dgm 138/udp
+ netbios-ssn 139/tcp # NETBIOS session service
+ netbios-ssn 139/udp
+ imap 143/tcp imap2 # Interim Mail Access Proto v2
+ ```
+
+ !!! info
+
+ ```
+ **Початок діапазону**: відповідність рядку, де розташований рядок, лише збігання з першим рядком, який з’являється.
+ **Кінець діапазону**: збігається з рядком, у якому розташований рядок, лише з першим рядком, який з’являється.
+ ```
+
+ ```bash
+ Shell > grep -n ^netbios /etc/services
+ 123:netbios-ns 137/tcp # NETBIOS Name Service
+ 124:netbios-ns 137/udp
+ 125:netbios-dgm 138/tcp # NETBIOS Datagram Service
+ 126:netbios-dgm 138/udp
+ 127:netbios-ssn 139/tcp # NETBIOS session service
+ 128:netbios-ssn 139/udp
+
+ Shell > grep -n ^imap /etc/services
+ 129:imap 143/tcp imap2 # Interim Mail Access Proto v2
+ 130:imap 143/udp imap2
+ 168:imap3 220/tcp # Interactive Mail Access
+ 169:imap3 220/udp # Protocol v3
+ 260:imaps 993/tcp # IMAP over SSL
+ 261:imaps 993/udp # IMAP over SSL
+ ```
+
+ Іншими словами, вміст, надрукований вище, це рядки з 123 по 129
+
+ - Надрукуйте рядок, де знаходиться рядок, і до останнього рядка
+
+ ```bash
+ Shell > cat /etc/services | sed -n '/^netbios/,$p'
+ ```
+
+ - Використання змінних у сценаріях bash
+
+ ```bash
+ Shell > vim test1.sh
+ #!/bin/bash
+ a=10
+
+ sed -n ''${a}',$!p' /etc/services
+ # or
+ sed -n "${a},\$!p" /etc/services
+ ```
+
+ - Регулярний вираз
+
+ Відповідає лише "Три цифри" + "/udp".
+
+ ```bash
+ Shell > cat /etc/services | sed -r -n '/[^0-9]([1-9]{3}\/udp)/p'
+ sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP
+ auth 113/udp authentication tap ident
+ sftp 115/udp
+ uucp-path 117/udp
+ nntp 119/udp readnews untp # USENET News Transfer Protocol
+ ntp 123/udp # Network Time Protocol
+ netbios-ns 137/udp
+ netbios-dgm 138/udp
+ netbios-ssn 139/udp
+ ...
+ ```
+
+2. Зіставити та видалити (`d`)
+
+ Це схоже на друк, за винятком того, що команду операції замінено на `d`, а параметр -n не потрібен.
+
+ - Видалити всі рядки, які відповідають рядку udp, видалити всі рядки коментарів і видалити всі порожні рядки
+
+ ```bash
+ Shell > sed -e '/udp/d' -e '/^#/d' -e '/^$/d' /etc/services
+ tcpmux 1/tcp # TCP port service multiplexer
+ rje 5/tcp # Remote Job Entry
+ echo 7/tcp
+ discard 9/tcp sink null
+ systat 11/tcp users
+ daytime 13/tcp
+ qotd 17/tcp quote
+ chargen 19/tcp ttytst source
+ ftp-data 20/tcp
+ ftp 21/tcp
+ ssh 22/tcp # The Secure Shell (SSH) Protocol
+ telnet 23/tcp
+ ...
+ ```
+
+ - Видалити послідовні рядки тексту
+
+ ```bash
+ Shell > cat -n /etc/services | sed '10,$d'
+ 1 # /etc/services:
+ 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $
+ 3 #
+ 4 # Network services, Internet style
+ 5 # IANA services version: last updated 2016-07-08
+ 6 #
+ 7 # Note that it is presently the policy of IANA to assign a single well-known
+ 8 # port number for both TCP and UDP; hence, most entries here have two entries
+ 9 # even if the protocol doesn't support UDP operations.
+ ```
+
+ - Регулярний вираз
+
+ ```bash
+ Shell > cat /etc/services | sed -r '/(tcp)|(udp)|(^#)|(^$)/d'
+ http 80/sctp # HyperText Transfer Protocol
+ bgp 179/sctp
+ https 443/sctp # http protocol over TLS/SSL
+ h323hostcall 1720/sctp # H.323 Call Control
+ nfs 2049/sctp nfsd shilp # Network File System
+ rtmp 1/ddp # Routing Table Maintenance Protocol
+ nbp 2/ddp # Name Binding Protocol
+ echo 4/ddp # AppleTalk Echo Protocol
+ zip 6/ddp # Zone Information Protocol
+ discard 9/sctp # Discard
+ discard 9/dccp # Discard SC:DISC
+ ...
+ ```
+
+3. Замінити рядки (`s///g`)
+
+ | Синтаксис | Опис синтаксису |
+ | :---------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | `sed 's/string/replace/g' FILENAME` | **s**: усі рядки, що представляють вміст файлу. Ви також можете вказати діапазон рядків, наприклад: `sed '20,200s/netbios/TMP/g' /etc/services` **g** (Глобальний): якщо g немає, це означає що коли кілька відповідних рядків з’являються в одному рядку, буде замінено лише перший відповідний рядок. **/**: стиль розділювача. Ви також можете вказати інші стилі, наприклад: `sed '20,200s?netbios?TMP?g' /etc/services` |
+
+ !!! tip "Підказка"
+
+ ````
+ Example in the bash script:
+
+ ```bash
+ Shell > vim /root/sedReplace.sh
+ #!/bin/bash
+ a="SELINUX=enforcing"
+ b="SELINUX=disabled"
+
+ sed -i 's/'${a}'/'${b}'/g' /etc/selinux/config
+ # or
+ sed -i "s/${a}/${b}/g" /etc/selinux/config
+ ```
+ ````
+
+ - Замініть і роздрукуйте
+
+ ```bash
+ Shell > sed -n '44,45s/ssh/SSH/gp' /etc/services
+ SSH 22/tcp
+ SSH 22/udp
+ ```
+
+ - Використовуйте символ "&", щоб посилатися на рядок
+
+ ```bash
+ Shell > sed -n '44,45s/ssh/&-SSH/gp' /etc/services
+ ssh-SSH 22/tcp
+ ssh-SSH 22/udp
+ ```
+
+ - Використовуйте рядок, щоб знайти один або кілька рядків і замінити вказаний рядок у діапазоні рядків
+
+ ```bash
+ Shell > grep ssh /etc/services -n
+ 44:ssh 22/tcp # The Secure Shell (SSH) Protocol
+ 45:ssh 22/udp # The Secure Shell (SSH) Protocol
+ 551:x11-ssh-offset 6010/tcp # SSH X11 forwarding offset
+ 593:ssh 22/sctp # SSH
+ 1351:sshell 614/tcp # SSLshell
+ 1352:sshell 614/udp # SSLshell
+ 1607:netconf-ssh 830/tcp # NETCONF over SSH
+ 1608:netconf-ssh 830/udp # NETCONF over SSH
+ 7178:sdo-ssh 3897/tcp # Simple Distributed Objects over SSH
+ 7179:sdo-ssh 3897/udp # Simple Distributed Objects over SSH
+ 7791:netconf-ch-ssh 4334/tcp # NETCONF Call Home (SSH)
+ 8473:snmpssh 5161/tcp # SNMP over SSH Transport Model
+ 8474:snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model
+ 9126:tl1-ssh 6252/tcp # TL1 over SSH
+ 9127:tl1-ssh 6252/udp # TL1 over SSH
+ 10796:ssh-mgmt 17235/tcp # SSH Tectia Manager
+ 10797:ssh-mgmt 17235/udp # SSH Tectia Manager
+
+ Shell > sed '/ssh/s/tcp/TCP/gp' -n /etc/services
+ ssh 22/TCP # The Secure Shell (SSH) Protocol
+ x11-ssh-offset 6010/TCP # SSH X11 forwarding offset
+ sshell 614/TCP # SSLshell
+ netconf-ssh 830/TCP # NETCONF over SSH
+ sdo-ssh 3897/TCP # Simple Distributed Objects over SSH
+ netconf-ch-ssh 4334/TCP # NETCONF Call Home (SSH)
+ snmpssh 5161/TCP # SNMP over SSH Transport Model
+ snmpssh-trap 5162/TCP # SNMP Notification over SSH Transport Model
+ tl1-ssh 6252/TCP # TL1 over SSH
+ ssh-mgmt 17235/TCP # SSH Tectia Manager
+ ```
+
+ - Заміна рядка для послідовних рядків
+
+ ```bash
+ Shell > sed '10,30s/tcp/TCP/g' /etc/services
+ ```
+
+ - Кілька збігів і замін
+
+ ```bash
+ Shell > cat /etc/services | sed 's/netbios/test1/g ; s/^#//d ; s/dhcp/&t2/g'
+ ```
+
+ - Групова заміна регулярних виразів
+
+ У регулярних виразах "()" є групуванням. \1 представляє референтну групу 1, \2 представляє референтну групу 2 і так далі.
+
+ ```bash
+ Shell > cat /etc/services
+ ...
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > cat /etc/services | sed -r 's/([0-9]*\/tcp)/\1\tCONTENT1/g ; s/([0-9]*\/udp)/\1\tADD2/g'
+ ...
+ axio-disc 35100/tcp CONTENT1 # Axiomatic discovery protocol
+ axio-disc 35100/udp ADD2 # Axiomatic discovery protocol
+ pmwebapi 44323/tcp CONTENT1 # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp ADD2 # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp CONTENT1 # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp CONTENT1 # Capture handwritten signatures
+ ```
+
+ **\t**: тобто вкладка
+
+ - Замініть усі рядки коментарів порожніми
+
+ ```bash
+ Shell > cat /etc/services | sed -r 's/(^#.*)//g'
+ ...
+ chargen 19/udp ttytst source
+ ftp-data 20/tcp
+ ftp-data 20/udp
+
+ ftp 21/tcp
+ ftp 21/udp fsp fspd
+ ssh 22/tcp # The Secure Shell (SSH) Protocol
+ ssh 22/udp # The Secure Shell (SSH) Protocol
+ ...
+ ```
+
+ - Замініть одну з малих літер слова великою
+
+ ```bash
+ Shell > echo -e "hello,world\nPOSIX" | sed -r 's/(.*)w/\1W/g'
+ hello,World
+ POSIX
+ ```
+
+ - Зміна позиції рядка
+
+ ```bash
+ Shell > cat /etc/services
+ ...
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+ Ми можемо розділити цей файл на п'ять частин:
+
+ ```txt
+ cloudcheck-ping 45514 / udp # ASSIA CloudCheck WiFi Management keepalive
+ ↓ ↓ ↓ ↓ ↓
+ (.*) (\<[0-9]+\>) \/ (tcp|udp) (.*)
+ ↓ ↓ ↓ ↓
+ \1 \2 \3 \4
+ ```
+
+ ```bash
+ Shell > cat /etc/services | sed -r 's/(.*)(\<[0-9]+\>)\/(tcp|udp)(.*)/\1\3\/\2\4/g'
+ ...
+ edi_service udp/34567 # dhanalakshmi.org EDI Service
+ axio-disc tcp/35100 # Axiomatic discovery protocol
+ axio-disc udp/35100 # Axiomatic discovery protocol
+ pmwebapi tcp/44323 # Performance Co-Pilot client HTTP API
+ cloudcheck-ping udp/45514 # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck tcp/45514 # ASSIA CloudCheck WiFi Management System
+ spremotetablet tcp/46998 # Capture handwritten signatures
+ ```
+
+ - Видаліть усі пробіли
+
+ ```bash
+ Shell > echo -e "abcd\t1 2 3 4\tWorld"
+ abcd 1 2 3 4 World
+ Shell > echo -e "abcd\t1 2 3 4\tWorld" | sed -r 's/(\s)*//g'
+ abcd1234World
+ ```
+
+4. Виконайте кілька разів за допомогою параметра -e
+
+ Наступний приклад:
+
+ ```bash
+ Shell > tail -n 10 /etc/services
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > tail -n 10 /etc/services | sed -e '1,3d' -e '/cloud/s/ping/PING/g'
+ # or
+ Shell > tail -n 10 /etc/services | sed '1,3d ; /cloud/s/ping/PING/g'
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-PING 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+5. Додайте вміст над або під певним рядком («i» і «a»)
+
+ - Додайте два рядки вмісту над вказаним номером рядка
+
+ ```bash
+ Shell > tail -n 10 /etc/services > /root/test.txt
+ Shell > cat /root/test.txt
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > cat /root/test.txt | sed '3i 123\
+ abc'
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ 123
+ abc
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+ - Додайте три рядки під вказаним номером рядка
+
+ ```bash
+ Shell > cat /root/test.txt | sed '5a 123\
+ comment yes\
+ tcp or udp'
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ 123
+ comment yes
+ tcp or udp
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+ - Зіставте певний рядок на основі рядка та додайте 2 рядки вмісту над ним
+
+ ```bash
+ Shell > cat /root/test.txt | sed '/tcp/iTCP\
+ UDP'
+ TCP
+ UDP
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ TCP
+ UDP
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ TCP
+ UDP
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ TCP
+ UDP
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ TCP
+ UDP
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ TCP
+ UDP
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+6. Замінити рядки (`c`)
+
+ - Знайдіть один або кілька рядків на основі рядка та замініть ці рядки тексту
+
+ ```bash
+ Shell > cat /root/test.txt | sed '/ser/c\TMP1 \
+ TMP2'
+ TMP1
+ TMP2
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ TMP1
+ TMP2
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+ - Заміна однієї лінії
+
+ ```bash
+ Shell > cat /root/test.txt | sed '7c REPLACE'
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ REPLACE
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+ - Замінити послідовні рядки тексту
+
+ ```bash
+ Shell > cat /root/test.txt | sed '2,$c REPLACE1 \
+ replace2'
+ aigairserver 21221/tcp # Services for Air Server
+ REPLACE1
+ replace2
+ ```
+
+ - Замініть парні рядки
+
+ ```bash
+ Shell > cat /root/test.txt | sed '2~2c replace'
+ aigairserver 21221/tcp # Services for Air Server
+ replace
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ replace
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ replace
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ replace
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ replace
+ ```
+
+7. Прочитайте вміст файлу та додайте його вміст під відповідним рядком (`r`)
+
+ ```bash
+ Shell > cat /root/app.txt
+ append1
+ POSIX
+ UNIX
+
+ Shell > cat /root/test.txt | sed '/ping/r /root/app.txt'
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ append1
+ POSIX
+ UNIX
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+8. Записати відповідні рядки в інші файли (`w`)
+
+ ```bash
+ Shell > cat /root/test.txt | sed '/axio/w /root/storage.txt'
+
+ Shell > cat /root/storage.txt
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ ```
+
+9. Читання/додавання наступного рядка введення в "простір шаблону" (`n` і `N`)
+
+ - Надрукуйте наступний рядок відповідного рядка
+
+ ```bash
+ Shell > cat /root/test.txt
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > cat /root/test.txt | sed '/ping/{n;p}' -n
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ ```
+
+ !!! tip "Підказка"
+
+ ```
+ Кілька команд операції `sed` можуть впливати одна на одну, і ви можете використовувати "**{ }**", щоб зменшити цей вплив.
+ ```
+
+ - Друк рівних рядків тексту
+
+ Спочатку прочитайте перший рядок, оскільки присутня команда `n`; буде роздруковано другий рядок і так далі.
+
+ ```bash
+ Shell > cat -n /root/test.txt | sed -n '{n;p}'
+ # or
+ Shell > cat -n /root/test.txt | sed -n '2~2p'
+ 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ 4 edi_service 34567/udp # dhanalakshmi.org EDI Service
+ 6 axio-disc 35100/udp # Axiomatic discovery protocol
+ 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ 10 spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+ - Друк непарних рядків тексту
+
+ ```bash
+ Shell > cat -n /root/test.txt | sed -n '{p;n}'
+ # or
+ Shell > cat -n /root/test.txt | sed -n '1~2p'
+ # or
+ Shell > cat -n /root/test.txt | sed 'n;d'
+ 1 aigairserver 21221/tcp # Services for Air Server
+ 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ 5 axio-disc 35100/tcp # Axiomatic discovery protocol
+ 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ ```
+
+ - Вивести 3n рядків
+
+ ```bash
+ Shell > cat -n /root/test.txt | sed -n '{n;n;p}'
+ # or
+ Shell > cat -n /root/test.txt | sed -n '3~3p'
+ 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ 6 axio-disc 35100/udp # Axiomatic discovery protocol
+ 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ ```
+
+ - `N`
+
+ Прочитайте перший рядок і додайте один рядок після зустрічі з командою `N`. У цьому прикладі «простір шаблону» — «1\n2». Нарешті, виконайте команду `q`, щоб вийти.
+
+ ```bash
+ Shell > seq 1 10 | sed 'N;q'
+ 1
+ 2
+ ```
+
+ Оскільки після рядка 9 немає додаткового рядка, результат буде таким:
+
+ ```bash
+ Shell > seq 1 9 | sed -n 'N;p'
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ ```
+
+ Коли зчитується останній рядок, команда `N` не виконується, і виводиться наступне:
+
+ ```bash
+ Shell > seq 1 9 | sed -n '$!N;p'
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ ```
+
+ Об’єднати два рядки в один. Замініть "\n" у "шаблоні" пробілом.
+
+ ```bash
+ Shell > seq 1 6 | sed 'N;{s/\n//g}'
+ 12
+ 34
+ 56
+ ```
+
+10. Ігнорувати регістр ('I')
+
+ Здається, немає інформації про ігнорування регістру в `man 1 sed`.
+
+ ```bash
+ Shell > echo -e "abc\nAbc" | sed -n 's/a/X/Igp'
+ Xbc
+ XBC
+ ```
+
+ ```bash
+ Shell > cat /etc/services | sed '/OEM/Ip' -n
+ oem-agent 3872/tcp # OEM Agent
+ oem-agent 3872/udp # OEM Agent
+ oemcacao-jmxmp 11172/tcp # OEM cacao JMX-remoting access point
+ oemcacao-rmi 11174/tcp # OEM cacao rmi registry access point
+ oemcacao-websvc 11175/tcp # OEM cacao web service access point
+ ```
+
+ ```bash
+ Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Id'
+ ```
+
+ ```bash
+ Shell > cat /etc/services | sed -r '/(TCP)|(UDP)/Ic TMP'
+ ```
+
+11. Отримує загальну кількість рядків у файлі
+
+ ```bash
+ Shell > cat /etc/services | sed -n '$='
+ # or
+ Shell > cat /etc/services | wc -l
+
+ 11473
+ ```
diff --git a/docs/books/sed_awk_grep/4_awk_command.uk.md b/docs/books/sed_awk_grep/4_awk_command.uk.md
new file mode 100644
index 0000000000..588e4eadea
--- /dev/null
+++ b/docs/books/sed_awk_grep/4_awk_command.uk.md
@@ -0,0 +1,2034 @@
+---
+title: Команда Awk
+author: tianci li
+contributors: null
+tags:
+ - awk
+---
+
+# Команда `awk`
+
+У 1977 році в Bell Labs народився інструмент на рівні мови програмування для обробки тексту під назвою «awk».
+Назва походить від перших літер прізвищ трьох відомих людей:
+
+- Alfred **A**ho
+- Peter **W**einberger
+- Brian **K**ernighan
+
+Подібно до оболонки (bash, csh, zsh і ksh), awk має похідні з розвитком історії:
+
+- `awk`: Народився в 1977 році Bell Labs.
+- `nawk` (новий awk): він народився в 1985 році та є оновленою та вдосконаленою версією `awk`. Він широко використовувався з Unix System V Release 3.1 (1987). Стара версія `awk` називається `oawk` (старий awk).
+- `gawk` (GNU awk): це було написано Полом Рубіном у 1986 році. Проект GNU народився в 1984 році.
+- `mawk` був написаний у 1996 році Майком Бреннаном, інтерпретатором мови програмування `awk`.
+- `jawk`: Реалізація `awk` в JAVA
+
+В операційній системі GNU/Linux звичайний `awk` відноситься до `gawk`. Однак деякі дистрибутиви, такі як Ubuntu або Debian, використовують `mawk` як типовий `awk`.
+
+У Rocky Linux 8.8 `awk` відноситься до `gawk`.
+
+```bash
+Shell > whereis awk
+awk: /usr/bin/awk /usr/libexec/awk /usr/share/awk /usr/share/man/man1/awk.1.gz
+
+Shell > ls -l /usr/bin/awk
+lrwxrwxrwx. 1 root root 4 4月 16 2022 /usr/bin/awk -> gawk
+
+Shell > rpm -qf /usr/bin/awk
+gawk-4.2.1-4.el8.x86_64
+```
+
+Для інформації, яка не охоплюється, див. [посібник gawk](https://www.gnu.org/software/gawk/manual/ "посібник gawk").
+
+Хоча `awk` є інструментом для обробки тексту, він має деякі особливості мови програмування:
+
+- variable
+- process control (loop)
+- data type
+- logical operation
+- function
+- array
+- ...
+
+**Принцип роботи `awk`**: подібно до реляційних баз даних, він підтримує обробку полів (стовпців) і записів (рядків). За замовчуванням awk розглядає кожен рядок файлу як запис і розміщує ці записи в пам’яті для построкової обробки, при цьому частина кожного рядка розглядається як поле в записі. За замовчуванням розділювачі для розділення різних полів використовують пробіли та табуляції, тоді як числа представляють різні поля в записі рядка. Щоб посилатися на кілька полів, розділіть їх комами або символами табуляції.
+
+Простий приклад, який легко зрозуміти:
+
+```bash
+Shell > df -hT
+| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
+|Filesystem | Type | Size | Used | Avail | Use% | Mounted | on |←← 1 (first line)
+|devtmpfs | devtmpfs | 1.8G | 0 | 1.8G | 0% | /dev | |←← 2
+|tmpfs | tmpfs | 1.8G | 0 | 1.8G | 0% | /dev/shm | |←← 3
+|tmpfs | tmpfs | 1.8G | 8.9M | 1.8G | 1% | /run | |←← 4
+|tmpfs | tmpfs | 1.8G | 0 | 1.8G | 0% | /sys/fs/cgroup | |←← 5
+|/dev/nvme0n1p2 | ext4 | 47G | 2.6G | 42G | 6% | / | |←← 6
+|/dev/nvme0n1p1 | xfs | 1014M | 182M | 833M | 18% | /boot | |←← 7
+|tmpfs | tmpfs | 364M | 0 | 364M | 0% | /run/user/0 | |←← 8 (end line)
+
+Shell > df -hT | awk '{print $1,$2}'
+Filesystem Type
+devtmpfs devtmpfs
+tmpfs tmpfs
+tmpfs tmpfs
+tmpfs tmpfs
+/dev/nvme0n1p2 ext4
+/dev/nvme0n1p1 xfs
+tmpfs tmpfs
+
+# $0: Reference the entire text content.
+Shell > df -hT | awk '{print $0}'
+Filesystem Type Size Used Avail Use% Mounted on
+devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev
+tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm
+tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run
+tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
+/dev/nvme0n1p2 ext4 47G 2.6G 42G 6% /
+/dev/nvme0n1p1 xfs 1014M 182M 833M 18% /boot
+tmpfs tmpfs 364M 0 364M 0% /run/user/0
+```
+
+## Інструкції з використання `awk`
+
+Використання `awk`: `awk option 'pattern {action}' FileName`
+
+**pattern**: Знаходить у тексті певний зміст
+**action**: Інструкція щодо дій
+**{ }**: Групує деякі інструкції відповідно до певних шаблонів
+
+| опція | опис |
+| :-------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------ |
+| -f program-file --file program-file | Читання вихідних файлів програми `awk` з файлів |
+| -F FS | Визначає роздільник для розділення полів. «FS» тут є вбудованою змінною в «awk» зі значеннями за замовчуванням пробілів або табуляції |
+| -v var=value | призначення змінної |
+| --posix | Вмикає режим сумісності |
+| --dump-variables=[file] | Записує глобальні змінні в `awk` у файл. Якщо файл не вказано, типовим є файл awkvars.out |
+| --profile=[file] | Запис даних аналізу продуктивності в певний файл. Якщо файл не вказано, типовим є файл awkprof.out |
+
+| pattern | опис |
+| :-------------------- | :--------------------------------------------------------------------------------- |
+| BEGIN{ } | Дія, яка виконується перед читанням усіх записів рядка |
+| END{ } | Дія, яка виконується після прочитання всіх записів рядка |
+| /regular expression/ | Збігається з регулярним виразом для кожного запису рядка введення |
+| pattern && pattern | Логіка та функціонування |
+| pattern \|\| pattern | Логіка або операція |
+| !pattern | Операція логічного заперечення |
+| pattern1,pattern2 | Визначає діапазон шаблонів для відповідності всім записам рядків у цьому діапазоні |
+
+`awk` є потужним і вимагає багато знань, тому деякий вміст буде пояснено пізніше.
+
+### Команди `printf`
+
+Перш ніж офіційно вивчити `awk`, новачки повинні зрозуміти команду `printf`.
+
+printf`:формат і друк даних. Його використання -`printf FORMAT [ARGUMENT]...\`
+
+**FORMAT**:Використовується для керування вмістом виведення. Підтримуються такі загальні послідовності інтерпретації:
+
+- **\a** - alert (BEL)
+- **\b** - backspace
+- **\f** - form feed
+- **\n** - нова лінія
+- **\r** - повернення каретки
+- **\t** - горизонтальна вкладка
+- **\v** - вертикальна вкладка
+- **%Ns** - Вихідний рядок. N означає кількість рядків, наприклад: `%s %s %s`
+- **%Ni** - Виводить цілі числа. N представляє кількість цілих чисел виведення, наприклад: `%i %i`
+- **%m.nf** - вихідне число з плаваючою комою. M представляє загальну кількість виведених цифр, а n представляє кількість цифр після коми. Наприклад: `%8.5f`
+
+**ARGUMENT**: Якщо це файл, ви повинні виконати деяку попередню обробку для правильного виведення.
+
+```bash
+Shell > cat /tmp/printf.txt
+ID Name Age Class
+1 Frank 20 3
+2 Jack 25 5
+3 Django 16 6
+4 Tom 19 7
+
+# Example of incorrect syntax:
+Shell > printf '%s %s $s\n' /tmp/printf.txt
+/tmp/printf.txt
+
+# Change the format of the text
+Shell > printf '%s' $(cat /tmp/printf.txt)
+IDNameAgeClass1Frank2032Jack2553Django1664Tom197
+# Change the format of the text
+Shell > printf '%s\t%s\t%s\n' $(cat /tmp/printf.txt)
+ID Name Age
+Class 1 Frank
+20 3 2
+Jack 25 5
+3 Django 16
+6 4 Tom
+19 7
+
+Shell > printf "%s\t%s\t%s\t%s\n" a b c d 1 2 3 4
+a b c d
+1 2 3 4
+```
+
+В ОС RockyLinux не існує команди `print`. Ви можете використовувати лише `print` в `awk`; його відмінність від `printf` полягає в тому, що він автоматично додає новий рядок у кінці кожного рядка. Наприклад:
+
+```bash
+Shell > awk '{printf $1 "\t" $2"\n"}' /tmp/printf.txt
+ID Name
+1 Frank
+2 Jack
+3 Django
+4 Tom
+
+Shell > awk '{print $1 "\t" $2}' /tmp/printf.txt
+ID Name
+1 Frank
+2 Jack
+3 Django
+4 Tom
+```
+
+## Базовий приклад використання
+
+1. Читання вихідних файлів програми `awk` з файлів
+
+ ```bash
+ Shell > vim /tmp/read-print.awk
+ #!/bin/awk
+ {print $6}
+
+ Shell > df -hT | awk -f /tmp/read-print.awk
+ Use%
+ 0%
+ 0%
+ 1%
+ 0%
+ 6%
+ 18%
+ 0%
+ ```
+
+2. Вкажіть роздільник
+
+ ```bash
+ Shell > awk -F ":" '{print $1}' /etc/passwd
+ root
+ bin
+ daemon
+ adm
+ lp
+ sync
+ ...
+
+ Shell > tail -n 5 /etc/services | awk -F "\/" '{print $2}'
+ awk: warning: escape sequence `\/' treated as plain `/'
+ axio-disc 35100
+ pmwebapi 44323
+ cloudcheck-ping 45514
+ cloudcheck 45514
+ spremotetablet 46998
+ ```
+
+ Ви також можете використовувати слова як роздільники. Дужки вказують, що це загальний роздільник, а "|" означає або.
+
+ ```bash
+ Shell > tail -n 5 /etc/services | awk -F "(tcp)|(udp)" '{print $1}'
+ axio-disc 35100/
+ pmwebapi 44323/
+ cloudcheck-ping 45514/
+ cloudcheck 45514/
+ spremotetablet 46998/
+ ```
+
+3. Присвоєння змінної
+
+ ```bash
+ Shell > tail -n 5 /etc/services | awk -v a=123 'BEGIN{print a}{print $1}'
+ 123
+ axio-disc
+ pmwebapi
+ cloudcheck-ping
+ cloudcheck
+ spremotetablet
+ ```
+
+ Призначте значення визначених користувачем змінних у bash змінним awk.
+
+ ```bash
+ Shell > ab=123
+ Shell > echo ${ab}
+ 123
+ Shell > tail -n 5 /etc/services | awk -v a=${ab} 'BEGIN{print a}{print $1}'
+ 123
+ axio-disc
+ pmwebapi
+ cloudcheck-ping
+ cloudcheck
+ spremotetablet
+ ```
+
+4. Записати глобальні змінні awk у файл
+
+ ```bash
+ Shell > seq 1 6 | awk --dump-variables '{print $0}'
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+
+ Shell > cat /root/awkvars.out
+ ARGC: 1
+ ARGIND: 0
+ ARGV: array, 1 elements
+ BINMODE: 0
+ CONVFMT: "%.6g"
+ ENVIRON: array, 27 elements
+ ERRNO: ""
+ FIELDWIDTHS: ""
+ FILENAME: "-"
+ FNR: 6
+ FPAT: "[^[:space:]]+"
+ FS: " "
+ FUNCTAB: array, 41 elements
+ IGNORECASE: 0
+ LINT: 0
+ NF: 1
+ NR: 6
+ OFMT: "%.6g"
+ OFS: " "
+ ORS: "\n"
+ PREC: 53
+ PROCINFO: array, 20 elements
+ RLENGTH: 0
+ ROUNDMODE: "N"
+ RS: "\n"
+ RSTART: 0
+ RT: "\n"
+ SUBSEP: "\034"
+ SYMTAB: array, 28 elements
+ TEXTDOMAIN: "messages"
+ ```
+
+ Пізніше ми розповімо, що означають ці змінні. Щоб переглянути їх зараз, [перейдіть до змінних](#VARIABLES).
+
+5. BEGIN{ } та END{ }
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk 'BEGIN{print "UserName:PasswordIdentification:UID:InitGID"}{print $0}END{print "one\ntwo"}'
+ UserName:PasswordIdentification:UID:InitGID
+ root:x:0:0:root:/root:/bin/bash
+ bin:x:1:1:bin:/bin:/sbin/nologin
+ daemon:x:2:2:daemon:/sbin:/sbin/nologin
+ adm:x:3:4:adm:/var/adm:/sbin/nologin
+ lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+ one
+ two
+ ```
+
+6. Опція --profile
+
+ ```bash
+ Shell > df -hT | awk --profile 'BEGIN{print "start line"}{print $0}END{print "end line"}'
+ start line
+ Filesystem Type Size Used Avail Use% Mounted on
+ devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev
+ tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm
+ tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run
+ tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
+ /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% /
+ /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot
+ tmpfs tmpfs 363M 0 363M 0% /run/user/0
+ end line
+
+ Shell > cat /root/awkprof.out
+ # gawk profile, created Fri Dec 8 15:12:56 2023
+
+ # BEGIN rule(s)
+
+ BEGIN {
+ 1 print "start line"
+ }
+
+ # Rule(s)
+
+ 8 {
+ 8 print $0
+ }
+
+ # END rule(s)
+
+ END {
+ 1 print "end line"
+ }
+ ```
+
+ Змініть файл awkprof.out.
+
+ ```bash
+ Shell > vim /root/awkprof.out
+ BEGIN {
+ print "start line"
+ }
+
+ {
+ print $0
+ }
+
+ END {
+ print "end line"
+ }
+
+ Shell > df -hT | awk -f /root/awkprof.out
+ start line
+ Filesystem Type Size Used Avail Use% Mounted on
+ devtmpfs devtmpfs 1.8G 0 1.8G 0% /dev
+ tmpfs tmpfs 1.8G 0 1.8G 0% /dev/shm
+ tmpfs tmpfs 1.8G 8.9M 1.8G 1% /run
+ tmpfs tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup
+ /dev/nvme0n1p2 ext4 47G 2.7G 42G 6% /
+ /dev/nvme0n1p1 xfs 1014M 181M 834M 18% /boot
+ tmpfs tmpfs 363M 0 363M 0% /run/user/0
+ end line
+ ```
+
+7. Зіставте рядки (записи) за допомогою регулярних виразів
+
+ ```bash
+ Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}'
+ sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP
+ auth 113/tcp authentication tap ident
+ sftp 115/tcp
+ uucp-path 117/tcp
+ nntp 119/tcp readnews untp # USENET News Transfer Protocol
+ ntp 123/tcp
+ netbios-ns 137/tcp # NETBIOS Name Service
+ netbios-dgm 138/tcp # NETBIOS Datagram Service
+ netbios-ssn 139/tcp # NETBIOS session service
+ ...
+ ```
+
+8. Логічні операції (логічне та, логічне АБО, зворотне)
+
+ logical and: &&
+ logical OR: ||
+ reverse: !
+
+ ```bash
+ Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ && /175/ {print $0}'
+ vmnet 175/tcp # VMNET
+ ```
+
+ ```bash
+ Shell > cat /etc/services | awk '/[^0-9a-zA-Z]9[1-9]{2}\/tcp/ || /91{2}\/tcp/ {print $0}'
+ telnets 992/tcp
+ imaps 993/tcp # IMAP over SSL
+ pop3s 995/tcp # POP-3 over SSL
+ mtp 1911/tcp #
+ rndc 953/tcp # rndc control sockets (BIND 9)
+ xact-backup 911/tcp # xact-backup
+ apex-mesh 912/tcp # APEX relay-relay service
+ apex-edge 913/tcp # APEX endpoint-relay service
+ ftps-data 989/tcp # ftp protocol, data, over TLS/SSL
+ nas 991/tcp # Netnews Administration System
+ vsinet 996/tcp # vsinet
+ maitrd 997/tcp #
+ busboy 998/tcp #
+ garcon 999/tcp #
+ #puprouter 999/tcp #
+ blockade 2911/tcp # Blockade
+ prnstatus 3911/tcp # Printer Status Port
+ cpdlc 5911/tcp # Controller Pilot Data Link Communication
+ manyone-xml 8911/tcp # manyone-xml
+ sype-transport 9911/tcp # SYPECom Transport Protocol
+ ```
+
+ ```bash
+ Shell > cat /etc/services | awk '!/(tcp)|(udp)/ {print $0}'
+ discard 9/sctp # Discard
+ discard 9/dccp # Discard SC:DISC
+ ftp-data 20/sctp # FTP
+ ftp 21/sctp # FTP
+ ssh 22/sctp # SSH
+ exp1 1021/sctp # RFC3692-style Experiment 1 (*) [RFC4727]
+ exp1 1021/dccp # RFC3692-style Experiment 1 (*) [RFC4727]
+ exp2 1022/sctp # RFC3692-style Experiment 2 (*) [RFC4727]
+ exp2 1022/dccp # RFC3692-style Experiment 2 (*) [RFC4727]
+ ltp-deepspace 1113/dccp # Licklider Transmission Protocol
+ cisco-ipsla 1167/sctp # Cisco IP SLAs Control Protocol
+ rcip-itu 2225/sctp # Resource Connection Initiation Protocol
+ m2ua 2904/sctp # M2UA
+ m3ua 2905/sctp # M3UA
+ megaco-h248 2944/sctp # Megaco-H.248 text
+ ...
+ ```
+
+9. Знаходить послідовні рядки за рядком і друкує їх
+
+ ```bash
+ Shell > cat /etc/services | awk '/^ntp/,/^netbios/ {print $0}'
+ ntp 123/tcp
+ ntp 123/udp # Network Time Protocol
+ netbios-ns 137/tcp # NETBIOS Name Service
+ ```
+
+ !!! info
+
+ ```
+ Початковий діапазон: припинення збігу, коли знайдено перший збіг.
+ Кінцевий діапазон: припинення збігу, коли знайдено перший збіг.
+ ```
+
+## Вбудована змінна {#VARIABLES}
+
+| Ім'я змінної | Опис |
+| :----------: | :-------------------------------------------------------------------------------------------------------------------------------------------------- |
+| FS | Роздільник поля введення. За замовчуванням пробіл або табуляція |
+| OFS | Роздільник поля виведення. Типовим є пробіл |
+| RS | Роздільник запису вхідного рядка. Типовим є символ нового рядка (\n) |
+| ORS | Роздільник запису вихідного рядка. Типовим є символ нового рядка (\n) |
+| NF | Підрахувати кількість полів у поточному записі рядка |
+| NR | Підраховує кількість записів рядків. Після обробки кожного рядка тексту значення цієї змінної буде +1 |
+| FNR | Підраховує кількість записів рядків. Коли обробляється другий файл, змінна NR продовжує складатися, але змінна FNR перераховується |
+| ARGC | Кількість аргументів командного рядка |
+| ARGV | Масив аргументів командного рядка з індексом, що починається з 0, і ARGV[0], що представляє awk |
+| ARGIND | Значення індексу файлу, який зараз обробляється. Перший файл — 1, другий — 2 і так далі |
+| ENVIRON | Змінні середовища поточної системи |
+| FILENAME | Виведіть назву поточного обробленого файлу |
+| IGNORECASE | Ігнорує регістр |
+| SUBSEP | Роздільник нижнього індексу в масиві, який за умовчанням має значення "\034" |
+
+1. FS та OFS
+
+ ```bash
+ Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1}'
+ root
+ bin
+ daemon
+ adm
+ lp
+ sync
+ ```
+
+ Ви також можете використовувати опцію -v, щоб призначити значення змінним.
+
+ ```bash
+ Shell > cat /etc/passwd | awk -v FS=":" '{print $1}'
+ root
+ bin
+ daemon
+ adm
+ lp
+ sync
+ ```
+
+ Роздільником виводу за замовчуванням є пробіл у разі використання ком для посилань на кілька полів. Однак ви можете вказати роздільник виведення окремо.
+
+ ```bash
+ Shell > cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$2}'
+ root x
+ bin x
+ daemon x
+ adm x
+ lp x
+ ```
+
+ ```bash
+ Shell > cat /etc/passwd | awk 'BEGIN{FS=":";OFS="\t"}{print $1,$2}'
+ # or
+ Shell > cat /etc/passwd | awk -v FS=":" -v OFS="\t" '{print $1,$2}'
+ root x
+ bin x
+ daemon x
+ adm x
+ lp x
+ ```
+
+2. RS та ORS
+
+ За замовчуванням `awk` використовує символи нового рядка, щоб розрізняти кожен запис рядка
+
+ ```bash
+ Shell > echo -e "https://example.com/books/index.html\ntitle//tcp"
+ https://example.com/books/index.html
+ title//tcp
+
+ Shell > echo -e "https://example.com/books/index.html\ntitle//tcp" | awk 'BEGIN{RS="\/\/";ORS="%%"}{print $0}'
+ awk: cmd. line:1: warning: escape sequence `\/' treated as plain `/'
+ https:%%example.com/books/index.html
+ title%%tcp
+ %% ← Why? Because "print"
+ ```
+
+3. NF
+
+ Підрахувати кількість полів на рядок поточного тексту
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print NF}'
+ 7
+ 7
+ 7
+ 7
+ 7
+ ```
+
+ Виведіть п'яте поле
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $(NF-2)}'
+ root
+ bin
+ daemon
+ adm
+ lp
+ ```
+
+ Роздрукуйте останнє поле
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {print $NF}'
+ /bin/bash
+ /sbin/nologin
+ /sbin/nologin
+ /sbin/nologin
+ /sbin/nologin
+ ```
+
+ Виключіть останні два поля
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$NF=" ";$(NF-1)=" ";print $0}'
+ root x 0 0 root
+ bin x 1 1 bin
+ daemon x 2 2 daemon
+ adm x 3 4 adm
+ lp x 4 7 lp
+ ```
+
+ Виключити перше поле
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{RS="\n";ORS="\n"} {$1=" ";print $0}' | sed -r 's/(^ )//g'
+ x 0 0 root /root /bin/bash
+ x 1 1 bin /bin /sbin/nologin
+ x 2 2 daemon /sbin /sbin/nologin
+ x 3 4 adm /var/adm /sbin/nologin
+ x 4 7 lp /var/spool/lpd /sbin/nologin
+ ```
+
+4. NR та FNR
+
+ ```bash
+ Shell > tail -n 5 /etc/services | awk '{print NR,$0}'
+ 1 axio-disc 35100/udp # Axiomatic discovery protocol
+ 2 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ 3 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ 4 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ 5 spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+ Вивести загальну кількість рядків у вмісті файлу
+
+ ```bash
+ Shell > cat /etc/services | awk 'END{print NR}'
+ 11473
+ ```
+
+ Вивести вміст рядка 200
+
+ ```bash
+ Shell > cat /etc/services | awk 'NR==200'
+ microsoft-ds 445/tcp
+ ```
+
+ Виведіть друге поле в рядку 200
+
+ ```bash
+ Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR==200 {print $2}'
+ 445/tcp
+ ```
+
+ Друк вмісту в певному діапазоні
+
+ ```bash
+ Shell > cat /etc/services | awk 'BEGIN{RS="\n";ORS="\n"} NR<=10 {print NR,$0}'
+ 1 # /etc/services:
+ 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $
+ 3 #
+ 4 # Network services, Internet style
+ 5 # IANA services version: last updated 2016-07-08
+ 6 #
+ 7 # Note that it is presently the policy of IANA to assign a single well-known
+ 8 # port number for both TCP and UDP; hence, most entries here have two entries
+ 9 # even if the protocol doesn't support UDP operations.
+ 10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
+ ```
+
+ Порівняння між NR і FNR
+
+ ```bash
+ Shell > head -n 3 /etc/services > /tmp/a.txt
+
+ Shell > cat /tmp/a.txt
+ # /etc/services:
+ # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $
+ #
+
+ Shell > cat /etc/resolv.conf
+ # Generated by NetworkManager
+ nameserver 8.8.8.8
+ nameserver 114.114.114.114
+
+ Shell > awk '{print NR,$0}' /tmp/a.txt /etc/resolv.conf
+ 1 # /etc/services:
+ 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $
+ 3 #
+ 4 # Generated by NetworkManager
+ 5 nameserver 8.8.8.8
+ 6 nameserver 114.114.114.114
+
+ Shell > awk '{print FNR,$0}' /tmp/a.txt /etc/resolv.conf
+ 1 # /etc/services:
+ 2 # $Id: services,v 1.49 2017/08/18 12:43:23 ovasik Exp $
+ 3 #
+ 1 # Generated by NetworkManager
+ 2 nameserver 8.8.8.8
+ 3 nameserver 114.114.114.114
+ ```
+
+5. ARGC та ARGV
+
+ ```bash
+ Shell > awk 'BEGIN{print ARGC}' log dump long
+ 4
+ Shell > awk 'BEGIN{print ARGV[0]}' log dump long
+ awk
+ Shell > awk 'BEGIN{print ARGV[1]}' log dump long
+ log
+ Shell > awk 'BEGIN{print ARGV[2]}' log dump long
+ dump
+ ```
+
+6. ARGIND
+
+ Ця змінна в основному використовується для визначення файлу, з яким працює програма `awk`.
+
+ ```bash
+ Shell > awk '{print ARGIND,$0}' /etc/hostname /etc/resolv.conf
+ 1 Master
+ 2 # Generated by NetworkManager
+ 2 nameserver 8.8.8.8
+ 2 nameserver 114.114.114.114
+ ```
+
+7. ENVIRON
+
+ Ви можете посилатися на операційні системи або визначені користувачем змінні в програмах `awk`.
+
+ ```bash
+ Shell > echo ${SSH_CLIENT}
+ 192.168.100.2 6969 22
+
+ Shell > awk 'BEGIN{print ENVIRON["SSH_CLIENT"]}'
+ 192.168.100.2 6969 22
+
+ Shell > export a=123
+ Shell > env | grep -w a
+ a=123
+ Shell > awk 'BEGIN{print ENVIRON["a"]}'
+ 123
+ Shell > unset a
+ ```
+
+8. FILENAME
+
+ ```bash
+ Shell > awk 'BEGIN{RS="\n";ORS="\n"} NR=FNR {print ARGIND,FILENAME"---"$0}' /etc/hostname /etc/resolv.conf /etc/rocky-release
+ 1 /etc/hostname---Master
+ 2 /etc/resolv.conf---# Generated by NetworkManager
+ 2 /etc/resolv.conf---nameserver 8.8.8.8
+ 2 /etc/resolv.conf---nameserver 114.114.114.114
+ 3 /etc/rocky-release---Rocky Linux release 8.9 (Green Obsidian)
+ ```
+
+9. IGNORECASE
+
+ Ця змінна корисна, якщо ви хочете використовувати регулярні вирази в `awk` і ігнорувати регістр.
+
+ ```bash
+ Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SSH)|^(ftp)/ {print $0}' /etc/services
+ ftp-data 20/tcp
+ ftp-data 20/udp
+ ftp 21/tcp
+ ftp 21/udp fsp fspd
+ ssh 22/tcp # The Secure Shell (SSH) Protocol
+ ssh 22/udp # The Secure Shell (SSH) Protocol
+ ftp-data 20/sctp # FTP
+ ftp 21/sctp # FTP
+ ssh 22/sctp # SSH
+ ftp-agent 574/tcp # FTP Software Agent System
+ ftp-agent 574/udp # FTP Software Agent System
+ sshell 614/tcp # SSLshell
+ sshell 614/udp # SSLshell
+ ftps-data 989/tcp # ftp protocol, data, over TLS/SSL
+ ftps-data 989/udp # ftp protocol, data, over TLS/SSL
+ ftps 990/tcp # ftp protocol, control, over TLS/SSL
+ ftps 990/udp # ftp protocol, control, over TLS/SSL
+ ssh-mgmt 17235/tcp # SSH Tectia Manager
+ ssh-mgmt 17235/udp # SSH Tectia Manager
+ ```
+
+ ```bash
+ Shell > awk 'BEGIN{IGNORECASE=1;RS="\n";ORS="\n"} /^(SMTP)\s/,/^(TFTP)\s/ {print $0}' /etc/services
+ smtp 25/tcp mail
+ smtp 25/udp mail
+ time 37/tcp timserver
+ time 37/udp timserver
+ rlp 39/tcp resource # resource location
+ rlp 39/udp resource # resource location
+ nameserver 42/tcp name # IEN 116
+ nameserver 42/udp name # IEN 116
+ nicname 43/tcp whois
+ nicname 43/udp whois
+ tacacs 49/tcp # Login Host Protocol (TACACS)
+ tacacs 49/udp # Login Host Protocol (TACACS)
+ re-mail-ck 50/tcp # Remote Mail Checking Protocol
+ re-mail-ck 50/udp # Remote Mail Checking Protocol
+ domain 53/tcp # name-domain server
+ domain 53/udp
+ whois++ 63/tcp whoispp
+ whois++ 63/udp whoispp
+ bootps 67/tcp # BOOTP server
+ bootps 67/udp
+ bootpc 68/tcp dhcpc # BOOTP client
+ bootpc 68/udp dhcpc
+ tftp 69/tcp
+ ```
+
+## Оператор
+
+| Оператор | Опис |
+| :----------------------: | :-------------------------------------------------------------------------- |
+| (...) | Групування |
+| $n | Польова довідка |
+| ++ -- | Інкрементний Зменшення |
+| + - ! | Математичний знак плюс Математичний знак мінус Заперечення |
+| \* / % | Математичний знак множення Математичний знак ділення Дія за модулем |
+| in | Елементи в масиві |
+| && \|\| | Логіка та операції Логічна операція АБО |
+| ?: | Скорочення умовних виразів |
+| \~ | Інше представлення регулярних виразів |
+| !\~ | Зворотний регулярний вираз |
+
+!!! note "Примітка"
+
+````
+У програмі `awk` наступні вирази будуть оцінені як **false**:
+
+* Число дорівнює 0;
+* Порожній рядок;
+* Невизначене значення.
+
+```bash
+Shell > awk 'BEGIN{n=0;if(n) print "Ture";else print "False"}'
+False
+Shell > awk 'BEGIN{s="";if(s) print "True";else print "False"}'
+False
+Shell > awk 'BEGIN{if(t) print "True";else print "Flase"}'
+False
+```
+````
+
+1. Знак оклику
+
+ Вивести непарні рядки:
+
+ ```bash
+ Shell > seq 1 10 | awk 'i=!i {print $0}'
+ 1
+ 3
+ 5
+ 7
+ 9
+ ```
+
+ !!! question "Питання"
+
+ ```
+ **Чому?**
+ **Прочитайте перший рядок**: оскільки «i» не присвоєно значення, тому «i=!i» означає TRUE.
+ **Прочитайте другий рядок**: у цьому місці "i=!i" вказує на FALSE.
+ І так далі, останній надрукований рядок є непарним числом.
+ ```
+
+ Вивести парні рядки:
+
+ ```bash
+ Shell > seq 1 10 | awk '!(i=!i)'
+ # or
+ Shell > seq 1 10 | awk '!(i=!i) {print $0}'
+ 2
+ 4
+ 6
+ 8
+ 10
+ ```
+
+ !!! note "Примітка"
+
+ ```
+ Як бачите, іноді ви можете ігнорувати синтаксис для частини "action", яка за умовчанням еквівалентна "{print $0}".
+ ```
+
+2. Розворот
+
+ ```bash
+ Shell > cat /etc/services | awk '!/(tcp)|(udp)|(^#)|(^$)/ {print $0}'
+ http 80/sctp # HyperText Transfer Protocol
+ bgp 179/sctp
+ https 443/sctp # http protocol over TLS/SSL
+ h323hostcall 1720/sctp # H.323 Call Control
+ nfs 2049/sctp nfsd shilp # Network File System
+ rtmp 1/ddp # Routing Table Maintenance Protocol
+ nbp 2/ddp # Name Binding Protocol
+ echo 4/ddp # AppleTalk Echo Protocol
+ zip 6/ddp # Zone Information Protocol
+ discard 9/sctp # Discard
+ discard 9/dccp # Discard SC:DISC
+ ...
+ ```
+
+3. Основні операції в математиці
+
+ ```bash
+ Shell > echo -e "36\n40\n50" | awk '{print $0+1}'
+ 37
+ 41
+
+ Shell > echo -e "30\t5\t8\n11\t20\t34"
+ 30 5 8
+ 11 20 34
+ Shell > echo -e "30\t5\t8\n11\t20\t34" | awk '{print $2*2+1}'
+ 11
+ 41
+ ```
+
+ Його також можна використовувати в "шаблоні":
+
+ ```bash
+ Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2==0 {print $0}'
+ ...
+ 24 tcpmux 1/udp # TCP port service multiplexer
+ 26 rje 5/udp # Remote Job Entry
+ 28 echo 7/udp
+ 30 discard 9/udp sink null
+ 32 systat 11/udp users
+ 34 daytime 13/udp
+ 36 qotd 17/udp quote
+ ...
+
+ Shell > cat -n /etc/services | awk '/^[1-9]*/ && $1%2!=0 {print $0}'
+ ...
+ 23 tcpmux 1/tcp # TCP port service multiplexer
+ 25 rje 5/tcp # Remote Job Entry
+ 27 echo 7/tcp
+ 29 discard 9/tcp sink null
+ 31 systat 11/tcp users
+ ...
+ ```
+
+4. Символ pipe
+
+ Ви можете використовувати команду bash у програмі awk, наприклад:
+
+ ```bash
+ Shell > echo -e "6\n3\n9\n8" | awk '{print $0 | "sort"}'
+ 3
+ 6
+ 8
+ 9
+ ```
+
+ !!! info
+
+ ```
+ Будь ласка, зверніть увагу! Ви повинні взяти подвійні лапки, щоб включити команду.
+ ```
+
+5. Регулярний вираз
+
+ [Тут](#RE) ми розглядаємо основні приклади регулярних виразів. Ви можете використовувати регулярні вирази для записів рядків.
+
+ ```bash
+ Shell > cat /etc/services | awk '/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}'
+
+ # Be equivalent to:
+
+ Shell > cat /etc/services | awk '$0~/[^0-9a-zA-Z]1[1-9]{2}\/tcp/ {print $0}'
+ ```
+
+ Якщо файл містить великий обсяг тексту, регулярні вирази також можна використовувати для полів, що допоможе підвищити ефективність обробки. Приклад використання такий:
+
+ ```bash
+ Shell > cat /etc/services | awk '$0~/^(ssh)/ && $2~/tcp/ {print $0}'
+ ssh 22/tcp # The Secure Shell (SSH) Protocol
+ sshell 614/tcp # SSLshell
+ ssh-mgmt 17235/tcp # SSH Tectia Manager
+
+ Shell > cat /etc/services | grep -v -E "(^#)|(^$)" | awk '$2!~/(tcp)|(udp)/ {print $0}'
+ http 80/sctp # HyperText Transfer Protocol
+ bgp 179/sctp
+ https 443/sctp # http protocol over TLS/SSL
+ h323hostcall 1720/sctp # H.323 Call Control
+ nfs 2049/sctp nfsd shilp # Network File System
+ rtmp 1/ddp # Routing Table Maintenance Protocol
+ nbp 2/ddp # Name Binding Protocol
+ ...
+ ```
+
+## Управління потоком
+
+1. оператор **if**
+
+ Основний формат синтаксису - `if (condition) statement [ else statement ]`
+
+ Приклад використання однієї гілки оператора if:
+
+ ```bash
+ Shell > cat /etc/services | awk '{if(NR==110) print $0}'
+ pop3 110/udp pop-3
+ ```
+
+ Умова визначається як регулярний вираз:
+
+ ```bash
+ Shell > cat /etc/services | awk '{if(/^(ftp)\s|^(ssh)\s/) print $0}'
+ ftp 21/tcp
+ ftp 21/udp fsp fspd
+ ssh 22/tcp # The Secure Shell (SSH) Protocol
+ ssh 22/udp # The Secure Shell (SSH) Protocol
+ ftp 21/sctp # FTP
+ ssh 22/sctp # SSH
+ ```
+
+ Подвійна гілка:
+
+ ```bash
+ Shell > seq 1 10 | awk '{if($0==10) print $0 ; else print "False"}'
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ False
+ 10
+ ```
+
+ Кілька гілок:
+
+ ```bash
+ Shell > cat /etc/services | awk '{ \
+ if($1~/netbios/)
+ {print $0}
+ else if($2~/175/)
+ {print "175"}
+ else if($2~/137/)
+ {print "137"}
+ else {print "no"}
+ }'
+ ```
+
+2. оператор **while**
+
+ Основний формат синтаксису - `while (condition) statement`
+
+ Перегляньте та роздрукуйте поля всіх записів рядків.
+
+ ```bash
+ Shell > tail -n 2 /etc/services
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > tail -n 2 /etc/services | awk '{ \
+ i=1;
+ while(i<=NF){print $i;i++}
+ }'
+
+ cloudcheck
+ 45514/tcp
+ #
+ ASSIA
+ CloudCheck
+ WiFi
+ Management
+ System
+ spremotetablet
+ 46998/tcp
+ #
+ Capture
+ handwritten
+ signatures
+ ```
+
+3. оператор **for**
+
+ Основний формат синтаксису - `for (expr1; expr2; expr3) statement`
+
+ Перегляньте та роздрукуйте поля всіх записів рядків.
+
+ ```bash
+ Shell > tail -n 2 /etc/services | awk '{ \
+ for(i=1;i<=NF;i++) print $i
+ }'
+ ```
+
+ Виведіть поля для кожного рядка записів у зворотному порядку.
+
+ ```bash
+ Shell > tail -n 2 /etc/services | awk '{ \
+ for(i=NF;i>=1;i--) print $i
+ }'
+
+ System
+ Management
+ WiFi
+ CloudCheck
+ ASSIA
+ #
+ 45514/tcp
+ cloudcheck
+ signatures
+ handwritten
+ Capture
+ #
+ 46998/tcp
+ spremotetablet
+ ```
+
+ Друкуйте кожен рядок записів у зворотному напрямку.
+
+ ```bash
+ Shell > tail -n 2 /etc/services | awk '{ \
+ for(i=NF;i>=1;i--) {printf $i" "};
+ print ""
+ }'
+
+ System Management WiFi CloudCheck ASSIA # 45514/tcp cloudcheck
+ signatures handwritten Capture # 46998/tcp spremotetablet
+ ```
+
+4. оператор **break** і оператор **continue**
+
+ Порівняння між ними виглядає наступним чином:
+
+ ```bash
+ Shell > awk 'BEGIN{ \
+ for(i=1;i<=10;i++)
+ {
+ if(i==3) {break};
+ print i
+ }
+ }'
+
+ 1
+ 2
+ ```
+
+ ```bash
+ Shell > awk 'BEGIN{ \
+ for(i=1;i<=10;i++)
+ {
+ if(i==3) {continue};
+ print i
+ }
+ }'
+
+ 1
+ 2
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ ```
+
+5. оператор **exit**
+
+ Ви можете вказати значення, що повертається, у діапазоні [0,255]
+
+ Основний формат синтаксису - `exit [expression]`
+
+ ```bash
+ Shell > seq 1 10 | awk '{
+ if($0~/5/) exit "135"
+ }'
+
+ Shell > echo $?
+ 135
+ ```
+
+## Масив
+
+**масив**: сукупність даних одного типу, розташованих у певному порядку. Кожні дані в масиві називають елементом.
+
+Як і більшість мов програмування, `awk` також підтримує масиви, які поділяються на **індексовані масиви (з числами як нижні індекси)** та **асоціативні масиви (з рядками як нижні індекси)**.
+
+`awk` має багато функцій, і функції, пов’язані з масивами:
+
+- **length(Array_Name)** - Отримує довжину масиву.
+
+1. Спеціальний масив
+
+ Формат - `Array_Name[Index]=Value`
+
+ ```bash
+ Shell > awk 'BEGIN{a1[0]="test0" ; a1[1]="s1"; print a1[0]}'
+ test0
+ ```
+
+ Отримати довжину масиву:
+
+ ```bash
+ Shell > awk 'BEGIN{name[-1]="jimcat8" ; name[3]="jack" ; print length(name)}'
+ 2
+ ```
+
+ Зберігти всіх користувачів GNU/Linux у масиві:
+
+ ```bash
+ Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[2]}'
+ bin
+ Shell > cat /etc/passwd | awk -F ":" '{username[NR]=$1}END{print username[1]}'
+ root
+ ```
+
+ !!! info
+
+ ````
+ Числовий нижній індекс масиву `awk` може бути додатним цілим, від’ємним цілим числом, рядком або 0, тому числовий індекс масиву `awk` не має поняття початкового значення. Це не те саме, що масиви в bash.
+
+ ```bash
+ Shell > arr1=(2 10 30 string1)
+ Shell > echo "${arr1[0]}"
+ 2
+ Shell > unset arr1
+ ```
+ ````
+
+2. Видалити масив
+
+ Формат - `delete Array_Name`
+
+3. Видалення елемента з масиву
+
+ Формат - `delete Array_Name[Index]`
+
+4. Обхідний масив
+
+ Ви можете використовувати оператор **for**, який підходить для випадків, коли індекс масиву невідомий:
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk -F ":" ' \
+ {
+ username[NR]=$1
+ }
+ END {
+ for(i in username)
+ print username[i],i
+ }
+ '
+
+ root 1
+ bin 2
+ daemon 3
+ adm 4
+ lp 5
+ ```
+
+ Якщо нижній індекс масиву звичайний, ви можете використовувати цю форму оператора **for**:
+
+ ```bash
+ Shell > cat /etc/passwd | awk -F ":" ' \
+ {
+ username[NR]=$1
+ }
+ END{
+ for(i=1;i<=NR;i++)
+ print username[i],i
+ }
+ '
+
+ root 1
+ bin 2
+ daemon 3
+ adm 4
+ lp 5
+ sync 6
+ shutdown 7
+ halt 8
+ ...
+ ```
+
+5. Використовуйте "++" як нижній індекс масиву
+
+ ```bash
+ Shell > tail -n 5 /etc/group | awk -F ":" '\
+ {
+ a[x++]=$1
+ }
+ END{
+ for(i in a)
+ print a[i],i
+ }
+ '
+
+ slocate 0
+ unbound 1
+ docker 2
+ cgred 3
+ redis 4
+ ```
+
+6. Використовуйте поле як нижній індекс масиву
+
+ ```bash
+ Shell > tail -n 5 /etc/group | awk -F ":" '\
+ {
+ a[$1]=$3
+ }
+ END{
+ for(i in a)
+ print a[i],i
+ }
+ '
+
+ 991 docker
+ 21 slocate
+ 989 redis
+ 992 unbound
+ 990 cgred
+ ```
+
+7. Підрахуйте кількість входжень одного поля
+
+ Підрахуйте кількість випадків однакової адреси IPv4. Основна ідея:
+
+ - Спочатку скористайтеся командою `grep`, щоб відфільтрувати всі адреси IPv4
+ - Потім передайте його програмі `awk` для обробки
+
+ ```bash
+ Shell > cat /var/log/secure | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | awk ' \
+ {
+ a[$1]++
+ }
+ END{
+ for(v in a) print a[v],v
+ }
+ '
+
+ 4 0.0.0.0
+ 4 192.168.100.2
+ ```
+
+ !!! info
+
+ ```
+ `a[$1]++` еквівалентно до `a[$1]+=1`
+ ```
+
+ Підрахуйте кількість входжень слів незалежно від регістру. Основна ідея:
+
+ - Розділити всі поля на кілька рядків записів
+ - Потім передайте його програмі `awk` для обробки
+
+ ```bash
+ Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}'
+
+ Shell > cat /etc/services | awk -F " " '{for(i=1;i<=NF;i++) print $i}' | awk '\
+ BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) print a[v],v}
+ '
+
+ 3 NETBIOS
+ 18 FTP
+ 7 ftp
+
+ Shell > cat /etc/services | awk -F " " '{ for(i=1;i<=NF;i++) print $i }' | awk '\
+ BEGIN{IGNORECASE=1;OFS="\t"} /^netbios$/ || /^ftp$/ {a[$1]++} END{for(v in a) \
+ if(a[v]>=5) print a[v],v}
+ '
+
+ 18 FTP
+ 7 ftp
+ ```
+
+ Ви можете спочатку відфільтрувати певні записи рядків, а потім виконати статистику, наприклад:
+
+ ```bash
+ Shell > ss -tulnp | awk -F " " '/tcp/ {a[$2]++} END{for(i in a) print a[i],i}'
+ 2 LISTEN
+ ```
+
+8. Вивести рядки на основі кількості входжень певного поля
+
+ ```bash
+ Shell > tail /etc/services
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > tail /etc/services | awk 'a[$1]++ {print $0}'
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ ```
+
+ Зворотний:
+
+ ```bash
+ Shell > tail /etc/services | awk '!a[$1]++ {print $0}'
+ aigairserver 21221/tcp # Services for Air Server
+ ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ edi_service 34567/udp # dhanalakshmi.org EDI Service
+ axio-disc 35100/tcp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+ ```
+
+9. Багатовимірний масив
+
+ Програма `awk` не підтримує багатовимірні масиви, але підтримку багатовимірних масивів можна досягти за допомогою моделювання. За замовчуванням "\034" є роздільником для нижнього індексу багатовимірного масиву.
+
+ Зверніть увагу на наступні відмінності під час використання багатовимірних масивів:
+
+ ```bash
+ Shell > awk 'BEGIN{ a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }'
+ 200 20
+ 300 30
+ 100 1,0
+ ```
+
+ Перевизначте роздільник:
+
+ ```bash
+ Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i }'
+ 300 3----0
+ 200 2----0
+ 100 1,0
+ ```
+
+ Перезамовлення:
+
+ ```bash
+ Shell > awk 'BEGIN{ SUBSEP="----" ; a["1,0"]=100 ; a[2,0]=200 ; a["3","0"]=300 ; for(i in a) print a[i],i | "sort" }'
+ 100 1,0
+ 200 2----0
+ 300 3----0
+ ```
+
+ Підрахуйте, скільки разів з’являється поле:
+
+ ```bash
+ Shell > cat c.txt
+ A 192.168.1.1 HTTP
+ B 192.168.1.2 HTTP
+ B 192.168.1.2 MYSQL
+ C 192.168.1.1 MYSQL
+ C 192.168.1.1 MQ
+ D 192.168.1.4 NGINX
+
+ Shell > cat c.txt | awk 'BEGIN{SUBSEP="----"} {a[$1,$2]++} END{for(i in a) print a[i],i}'
+ 1 A----192.168.1.1
+ 2 B----192.168.1.2
+ 2 C----192.168.1.1
+ 1 D----192.168.1.4
+ ```
+
+## Вбудована функція
+
+| Ім'я функції | Опис |
+| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| int(expr) | Обрізається як ціле число |
+| sqrt(expr) | Квадратний корінь |
+| rand() | Повертає випадкове число N із діапазоном (0,1). Результат не те, що кожен запуск є випадковим числом, але він залишається незмінним. |
+| srand([expr]) | Використовує "expr" для генерації випадкових чисел. Якщо «expr» не вказано, поточний час використовується як початкове значення за замовчуванням, а якщо початкове число є, використовується згенероване випадкове число. |
+| asort(a,b) | Елементи масиву "a" змінено (лексикографічно) і збережено в новому масиві "b", причому нижній індекс у масиві "b" починається з 1. Ця функція повертає кількість елементів у масиві. |
+| asorti(a,b) | Змінює порядок нижнього індексу масиву «a» та зберігає відсортований індекс у новому масиві «b» як елемент, причому нижній індекс масиву «b» починається з 1. |
+| sub(r,s[,t]) | Регулярний вираз «r» відповідає вхідним записам і замінює відповідний результат на «s». "t" є необов'язковим, вказуючи на заміну для певного поля. Функція повертає кількість замін - 0 або 1. Подібно до `sed s//` |
+| gsub(r,s[,t]) | Глобальна заміна. "t" є необов'язковим, вказуючи на заміну певного поля. Якщо "t" ігнорується, це означає глобальну заміну. Подібно до `sed s///g` |
+| gensub(r,s,h[,t]) | Регулярний вираз «r» відповідає вхідним записам і замінює відповідний результат на «s». "t" є необов'язковим, вказуючи на заміну для певного поля. "h" означає заміну зазначеної позиції індексу |
+| index(s,t) | Повертає позицію індексу рядка "t" у рядку "s" (індекс рядка починається з 1). Якщо функція повертає 0, це означає, що її не існує |
+| length([s]) | Повертає довжину "s" |
+| match(s,r[,a]) | Перевіряє, чи містить рядок "s" рядок "r". Якщо включено, повертає позицію індексу " r " у ньому (рядковий індекс починається з 1). Якщо ні, повертає 0 |
+| split(s,a[,r[,seps]]) | Розділити рядок "s" на масив "a" на основі роздільника "seps". Індекс масиву починається з 1. |
+| substr(s,i[,n]) | Перехоплює рядок. "s" представляє рядок для обробки; "i" вказує позицію індексу рядка; "n" - довжина. Якщо ви не вказуєте «n», це означає перехоплення всіх частин, що залишилися |
+| tolower(str) | Перетворює всі рядки на нижній регістр |
+| toupper(str) | Перетворює всі рядки у верхній регістр |
+| systime() | Поточна позначка часу |
+| strftime([format[,timestamp[,utc-flag]]]) | Форматує час виведення. Перетворює мітку часу на рядок |
+
+1. Функція **int**
+
+ ```bash
+ Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27"
+ qwer123
+ 123
+ abc
+ 123abc123
+ 100.55
+ -155.27
+
+ Shell > echo -e "qwer123\n123\nabc\n123abc123\n100.55\n-155.27" | awk '{print int($1)}'
+ 0
+ 123
+ 0
+ 123
+ 100
+ -155
+ ```
+
+ Як бачите, функція int працює лише для чисел, а коли зустрічається рядок, вона перетворює його на 0. Зустрівши рядок, що починається з числа, скоротіть його.
+
+2. Функція **sqrt**
+
+ ```bash
+ Shell > awk 'BEGIN{print sqrt(9)}'
+ 3
+ ```
+
+3. Функції **rand** та **srand**
+
+ Приклад використання функції rand такий:
+
+ ```bash
+ Shell > awk 'BEGIN{print rand()}'
+ 0.924046
+ Shell > awk 'BEGIN{print rand()}'
+ 0.924046
+ Shell > awk 'BEGIN{print rand()}'
+ 0.924046
+ ```
+
+ Приклад використання функції srand такий:
+
+ ```bash
+ Shell > awk 'BEGIN{srand() ; print rand()}'
+ 0.975495
+ Shell > awk 'BEGIN{srand() ; print rand()}'
+ 0.99187
+ Shell > awk 'BEGIN{srand() ; print rand()}'
+ 0.069002
+ ```
+
+ Згенеруйте ціле число в діапазоні (0,100):
+
+ ```bash
+ Shell > awk 'BEGIN{srand() ; print int(rand()*100)}'
+ 56
+ Shell > awk 'BEGIN{srand() ; print int(rand()*100)}'
+ 33
+ Shell > awk 'BEGIN{srand() ; print int(rand()*100)}'
+ 42
+ ```
+
+4. Функції **asort** та **asorti**
+
+ ```bash
+ Shell > cat /etc/passwd | awk -F ":" '{a[NR]=$1} END{anu=asort(a,b) ; for(i=1;i<=anu;i++) print i,b[i]}'
+ 1 adm
+ 2 bin
+ 3 chrony
+ 4 daemon
+ 5 dbus
+ 6 ftp
+ 7 games
+ 8 halt
+ 9 lp
+ 10 mail
+ 11 nobody
+ 12 operator
+ 13 polkitd
+ 14 redis
+ 15 root
+ 16 shutdown
+ 17 sshd
+ 18 sssd
+ 19 sync
+ 20 systemd-coredump
+ 21 systemd-resolve
+ 22 tss
+ 23 unbound
+
+ Shell > awk 'BEGIN{a[1]=1000 ; a[2]=200 ; a[3]=30 ; a[4]="admin" ; a[5]="Admin" ; \
+ a[6]="12string" ; a[7]=-1 ; a[8]=-10 ; a[9]=-20 ; a[10]=-21 ;nu=asort(a,b) ; for(i=1;i<=nu;i++) print i,b[i]}'
+ 1 -21
+ 2 -20
+ 3 -10
+ 4 -1
+ 5 30
+ 6 200
+ 7 1000
+ 8 12string
+ 9 Admin
+ 10 admin
+ ```
+
+ !!! info
+
+ ```
+ Правила сортування:
+
+ * Числа мають вищий пріоритет, ніж рядки, і розташовані в порядку зростання.
+ * Розташуйте рядки в порядку зростання словника
+ ```
+
+ Якщо ви використовуєте функцію **asorti**, приклад такий:
+
+ ```bash
+ Shell > awk 'BEGIN{ a[-11]=1000 ; a[-2]=200 ; a[-10]=30 ; a[-21]="admin" ; a[41]="Admin" ; \
+ a[30]="12string" ; a["root"]="rootstr" ; a["Root"]="r1" ; nu=asorti(a,b) ; for(i in b) print i,b[i] }'
+ 1 -10
+ 2 -11
+ 3 -2
+ 4 -21
+ 5 30
+ 6 41
+ 7 Root
+ 8 root
+ ```
+
+ !!! info
+
+ ```
+ Правила сортування:
+
+ * Числа мають пріоритет над рядками
+ * Якщо зустрічається від’ємне число, порівнюється перша цифра зліва. Якщо воно однакове, буде порівнюватися друга цифра і так далі
+ * Якщо зустрінеться додатне число, воно буде розташовано в порядку зростання
+ * Розташуйте рядки в порядку зростання словника
+ ```
+
+5. Функції **sub** та **gsub**
+
+ ```bash
+ Shell > cat /etc/services | awk '/netbios/ {sub(/tcp/,"test") ; print $0 }'
+ netbios-ns 137/test # NETBIOS Name Service
+ netbios-ns 137/udp
+ netbios-dgm 138/test # NETBIOS Datagram Service
+ netbios-dgm 138/udp
+ netbios-ssn 139/test # NETBIOS session service
+ netbios-ssn 139/udp
+
+ Shell > cat /etc/services | awk '/^ftp/ && /21\/tcp/ {print $0}'
+ ftp 21/tcp
+ ↑ ↑
+ Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P",$2) ; print $0}'
+ ftp 21/tcP
+ ↑
+ Shell > cat /etc/services | awk 'BEGIN{OFS="\t"} /^ftp/ && /21\/tcp/ {gsub(/p/,"P") ; print $0}'
+ ftP 21/tcP
+ ↑ ↑
+ ```
+
+ Подібно до команди `sed`, ви також можете використовувати символ "&" для посилання на вже збігені рядки.
+
+ [Перегляньте це тут](#symbol).
+
+ ```bash
+ Shell > vim /tmp/tmp-file1.txt
+ A 192.168.1.1 HTTP
+ B 192.168.1.2 HTTP
+ B 192.168.1.2 MYSQL
+ C 192.168.1.1 MYSQL
+ C 192.168.1.1 MQ
+ D 192.168.1.4 NGINX
+
+ # Add a line of text before the second line
+ Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/.*/,"add a line\n&")} {print $0}'
+ A 192.168.1.1 HTTP
+ add a line
+ B 192.168.1.2 HTTP
+ B 192.168.1.2 MYSQL
+ C 192.168.1.1 MYSQL
+ C 192.168.1.1 MQ
+ D 192.168.1.4 NGINX
+
+ # Add a string after the IP address in the second line
+ Shell > cat /tmp/tmp-file1.txt | awk 'NR==2 {gsub(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/,"&\tSTRING")} {print $0}'
+ A 192.168.1.1 HTTP
+ B 192.168.1.2 STRING HTTP
+ B 192.168.1.2 MYSQL
+ C 192.168.1.1 MYSQL
+ C 192.168.1.1 MQ
+ D 192.168.1.4 NGINX
+ ```
+
+6. Функція **index**
+
+ ```bash
+ Shell > tail -n 5 /etc/services
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > tail -n 5 /etc/services | awk '{print index($2,"tcp")}'
+ 0
+ 7
+ 0
+ 7
+ 7
+ ```
+
+7. Функція **length**
+
+ ```bash
+ # The length of the output field
+ Shell > tail -n 5 /etc/services | awk '{print length($1)}'
+ 9
+ 8
+ 15
+ 10
+ 14
+
+ # The length of the output array
+ Shell > cat /etc/passwd | awk -F ":" 'a[NR]=$1 END{print length(a)}'
+ 22
+ ```
+
+8. Функція **match**
+
+ ```bash
+ Shell > echo -e "1592abc144qszd\n144bc\nbn"
+ 1592abc144qszd
+ 144bc
+ bn
+
+ Shell > echo -e "1592abc144qszd\n144bc\nbn" | awk '{print match($1,144)}'
+ 8
+ 1
+ 0
+ ```
+
+9. Функція **split**
+
+ ```bash
+ Shell > echo "365%tmp%dir%number" | awk '{split($1,a1,"%") ; for(i in a1) print i,a1[i]}'
+ 1 365
+ 2 tmp
+ 3 dir
+ 4 number
+ ```
+
+10. Функція **substr**
+
+ ```bash
+ Shell > head -n 5 /etc/passwd
+ root:x:0:0:root:/root:/bin/bash
+ bin:x:1:1:bin:/bin:/sbin/nologin
+ daemon:x:2:2:daemon:/sbin:/sbin/nologin
+ adm:x:3:4:adm:/var/adm:/sbin/nologin
+ lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+
+ # I need this part of the content - "emon:/sbin:/sbin/nologin"
+ Shell > head -n 5 /etc/passwd | awk '/daemon/ {print substr($0,16)}'
+ emon:/sbin:/sbin/nologin
+
+ Shell > tail -n 5 /etc/services
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures
+
+ # I need this part of the content - "tablet"
+ Shell > tail -n 5 /etc/services | awk '/^sp/ {print substr($1,9)}'
+ tablet
+ ```
+
+11. Функції **tolower** та **toupper**
+
+ ```bash
+ Shell > echo -e "AbcD123\nqweR" | awk '{print tolower($0)}'
+ abcd123
+ qwer
+
+ Shell > tail -n 5 /etc/services | awk '{print toupper($0)}'
+ AXIO-DISC 35100/UDP # AXIOMATIC DISCOVERY PROTOCOL
+ PMWEBAPI 44323/TCP # PERFORMANCE CO-PILOT CLIENT HTTP API
+ CLOUDCHECK-PING 45514/UDP # ASSIA CLOUDCHECK WIFI MANAGEMENT KEEPALIVE
+ CLOUDCHECK 45514/TCP # ASSIA CLOUDCHECK WIFI MANAGEMENT SYSTEM
+ SPREMOTETABLET 46998/TCP # CAPTURE HANDWRITTEN SIGNATURES
+ ```
+
+12. Функції, що працюють з часом і датою
+
+ **Що таке мітка часу UNIX?**
+ Згідно з історією розвитку GNU/Linux, UNIX V1 народилася в 1971 році, а книга «Посібник програміста UNIX» була опублікована 3 листопада того ж року, в якій 1970-01-01 є датою початку початку UNIX.
+
+ Перетворення між міткою часу та природною датою та часом у днях:
+
+ ```bash
+ Shell > echo "$(( $(date --date="2024/01/06" +%s)/86400 + 1 ))"
+ 19728
+
+ Shell > date -d "1970-01-01 19728days"
+ Sat Jan 6 00:00:00 CST 2024
+ ```
+
+ Перетворення між міткою часу та природною датою та часом у секундах:
+
+ ```bash
+ Shell > echo "$(date --date="2024/01/06 17:12:00" +%s)"
+ 1704532320
+
+ Shell > echo "$(date --date='@1704532320')"
+ Sat Jan 6 17:12:00 CST 2024
+ ```
+
+ Перетворення між природною датою та часом UNIX у програмі `awk`:
+
+ ```bash
+ Shell > awk 'BEGIN{print systime()}'
+ 1704532597
+
+ Shell > echo "1704532597" | awk '{print strftime("%Y-%m-%d %H:%M:%S",$0)}'
+ 2024-01-06 17:16:37
+ ```
+
+## Оператор введення/виведення
+
+| Оператор | Опис |
+| :--------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| getline | Читає наступний відповідний запис рядка та призначає його "$0". Повернене значення дорівнює 1: вказує на те, що відповідні записи рядків було прочитано. Повернене значення дорівнює 0: вказує на те, що останній рядок було прочитано Повернене значення є від’ємним: вказує на наявність помилки |
+| getline var | Читає наступний відповідний запис рядка та призначає його змінній "var" |
+| command \| getline [var] | Призначає результат "$0" або змінній "var" |
+| next | Зупиняє поточний вхідний запис і виконує наступні дії |
+| print | Друкує результат |
+| printf | Дивись [тут](#printf-commands) |
+| system(cmd-line) | Виконує команду та повертає код стану. 0 означає, що команда була виконана успішно; не-0 означає, що виконання не вдалося |
+| print ... >> file | Перенаправлення виводу |
+| print ... \| command | Друкує вихідні дані та використовує їх як вхідні дані для команди |
+
+1. getline
+
+ ```bash
+ Shell > seq 1 10 | awk '/3/ || /6/ {getline ; print $0}'
+ 4
+ 7
+
+ Shell > seq 1 10 | awk '/3/ || /6/ {print $0 ; getline ; print $0}'
+ 3
+ 4
+ 6
+ 7
+ ```
+
+ Використовуючи вивчені раніше функції та символ «&», ми можемо:
+
+ ```bash
+ Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {getline ; gsub(/.*/ , "&\tSTRING1") ; print $0}'
+ spremotetablet 46998/tcp # Capture handwritten signatures STRING1
+
+ Shell > tail -n 5 /etc/services | awk '/45514\/tcp/ {print $0 ; getline; gsub(/.*/,"&\tSTRING2") } {print $0}'
+ axio-disc 35100/udp # Axiomatic discovery protocol
+ pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ spremotetablet 46998/tcp # Capture handwritten signatures STRING2
+ ```
+
+ Вивести парні та непарні рядки:
+
+ ```bash
+ Shell > tail -n 10 /etc/services | cat -n | awk '{ if( (getline) <= 1) print $0}'
+ 2 ka-kdp 31016/udp # Kollective Agent Kollective Delivery
+ 4 edi_service 34567/udp # dhanalakshmi.org EDI Service
+ 6 axio-disc 35100/udp # Axiomatic discovery protocol
+ 8 cloudcheck-ping 45514/udp # ASSIA CloudCheck WiFi Management keepalive
+ 10 spremotetablet 46998/tcp # Capture handwritten signatures
+
+ Shell > tail -n 10 /etc/services | cat -n | awk '{if(NR==1) print $0} { if(NR%2==0) {if(getline > 0) print $0} }'
+ 1 aigairserver 21221/tcp # Services for Air Server
+ 3 ka-sddp 31016/tcp # Kollective Agent Secure Distributed Delivery
+ 5 axio-disc 35100/tcp # Axiomatic discovery protocol
+ 7 pmwebapi 44323/tcp # Performance Co-Pilot client HTTP API
+ 9 cloudcheck 45514/tcp # ASSIA CloudCheck WiFi Management System
+ ```
+
+2. getline var
+
+ Додайте кожен рядок b-файлу в кінець кожного рядка C-файлу:
+
+ ```bash
+ Shell > cat /tmp/b.txt
+ b1
+ b2
+ b3
+ b4
+ b5
+ b6
+
+ Shell > cat /tmp/c.txt
+ A 192.168.1.1 HTTP
+ B 192.168.1.2 HTTP
+ B 192.168.1.2 MYSQL
+ C 192.168.1.1 MYSQL
+ C 192.168.1.1 MQ
+ D 192.168.1.4 NGINX
+
+ Shell > awk '{getline var1 <"/tmp/b.txt" ; print $0 , var1}' /tmp/c.txt
+ A 192.168.1.1 HTTP b1
+ B 192.168.1.2 HTTP b2
+ B 192.168.1.2 MYSQL b3
+ C 192.168.1.1 MYSQL b4
+ C 192.168.1.1 MQ b5
+ D 192.168.1.4 NGINX b6
+ ```
+
+ Замініть вказане поле файлу c на рядок вмісту файлу b:
+
+ ```bash
+ Shell > awk '{ getline var2 < "/tmp/b.txt" ; gsub($2 , var2 , $2) ; print $0 }' /tmp/c.txt
+ A b1 HTTP
+ B b2 HTTP
+ B b3 MYSQL
+ C b4 MYSQL
+ C b5 MQ
+ D b6 NGINX
+ ```
+
+3. command | getline [var\]
+
+ ```bash
+ Shell > awk 'BEGIN{ "date +%Y%m%d" | getline datenow ; print datenow}'
+ 20240107
+ ```
+
+ !!! tip "Підказка"
+
+ ```
+ Використовуйте подвійні лапки, щоб включити команду Shell.
+ ```
+
+4. next
+
+ Раніше ми представили оператори **break** і **continue**, перший використовувався для завершення циклу, а другий використовувався для виходу з поточного циклу. Дивись [тут](#bc). Для **наступного**, коли умови виконуються, він зупиняє вхідний запис, який відповідає умовам, і продовжить наступні дії.
+
+ ```bash
+ Shell > seq 1 5 | awk '{if(NR==3) {next} print $0}'
+ 1
+ 2
+ 4
+ 5
+
+ # equivalent to
+ Shell > seq 1 5 | awk '{if($1!=3) print $0}'
+ ```
+
+ Пропустити придатні записи рядків:
+
+ ```bash
+ Shell > cat /etc/passwd | awk -F ":" 'NR>5 {next} {print $0}'
+ root:x:0:0:root:/root:/bin/bash
+ bin:x:1:1:bin:/bin:/sbin/nologin
+ daemon:x:2:2:daemon:/sbin:/sbin/nologin
+ adm:x:3:4:adm:/var/adm:/sbin/nologin
+ lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
+
+ # equivalent to
+ Shell > cat /etc/passwd | awk -F ":" 'NR>=1 && NR<=5 {print $0}'
+ ```
+
+ !!! tip "Підказка"
+
+ ```
+ "**next**" не можна використовувати в "BEGIN{}" і "END{}".
+ ```
+
+5. Функція **system**
+
+ Ви можете використовувати цю функцію для виклику команд в Shell, наприклад:
+
+ ```bash
+ Shell > awk 'BEGIN{ system("echo nginx http") }'
+ nginx http
+ ```
+
+ !!! tip "Підказка"
+
+ ````
+ Під час використання функції **system** слід додавати подвійні лапки. Якщо не додати, програма `awk` вважатиме його змінною програми `awk`.
+
+ ```bash
+ Shell > awk 'BEGIN{ cmd1="date +%Y" ; system(cmd1)}'
+ 2024
+ ```
+ ````
+
+ **Що робити, якщо сама команда Shell містить подвійні лапки?**
+ Використовувати символи екранування - "\\", такі як:
+
+ ```bash
+ Shell > egrep "^root|^nobody" /etc/passwd
+ Shell > awk 'BEGIN{ system("egrep \"^root|^nobody\" /etc/passwd") }'
+ root:x:0:0:root:/root:/bin/bash
+ nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
+ ```
+
+ Інший приклад:
+
+ ```bash
+ Shell > awk 'BEGIN{ if ( system("xmind &> /dev/null") == 0 ) print "True"; else print "False" }'
+ False
+ ```
+
+6. Запишіть вихідні дані програми `awk` у файл
+
+ ```bash
+ Shell > head -n 5 /etc/passwd | awk -F ":" 'BEGIN{OFS="\t"} {print $1,$2 > "/tmp/user.txt"}'
+ Shell > cat /tmp/user.txt
+ root x
+ bin x
+ daemon x
+ adm x
+ lp x
+ ```
+
+ !!! tip "Підказка"
+
+ ```
+ "**>**" вказує на запис у файл як накладання. Якщо ви хочете писати у файл як додаток, використовуйте "**>>**". Ще раз нагадуємо, що шлях до файлу слід взяти в подвійні лапки.
+ ```
+
+7. pipe символ
+
+ Дивись [тут](#ps)
+
+8. Спеціальні функції
+
+ синтаксис - `function NAME(parameter list) { function body }`. Як от:
+
+ ```bash
+ Shell > awk 'function mysum(a,b) {return a+b} BEGIN{print mysum(1,6)}'
+ 7
+ ```
+
+## Заключні зауваження
+
+Якщо ви володієте спеціальними навичками програмування, `awk` відносно легко вивчити. Однак для більшості системних адміністраторів зі слабкими знаннями мови програмування (включно з автором) `awk` може бути дуже складним для вивчення. Для інформації, яка не охоплюється, див. [тут](https://www.gnu.org/software/gawk/manual/ "посібник gawk").
+
+Ще раз дякую за читання.
diff --git a/docs/books/sed_awk_grep/index.uk.md b/docs/books/sed_awk_grep/index.uk.md
new file mode 100644
index 0000000000..409675d810
--- /dev/null
+++ b/docs/books/sed_awk_grep/index.uk.md
@@ -0,0 +1,16 @@
+---
+title: Sed, Awk & Grep - три мечники
+author: tianci li
+contributors: null
+tags:
+ - grep
+ - sed
+ - awk
+ - Регулярний вираз
+---
+
+# Огляд
+
+Операційна система GNU/Linux дотримується філософії «все є файлом». Побічним наслідком цієї філософії є те, що системним адміністраторам часто доводиться взаємодіяти з файлами, іменами файлів і вмістом файлів.
+
+Що стосується обробки вмісту файлу, три інструменти `grep`, `sed` і `awk` є потужними та часто використовуваними, тому люди називають їх "Трьома мечниками".
diff --git a/docs/guides/contribute/localdocs/mkdocs_venv.uk.md b/docs/guides/contribute/localdocs/mkdocs_venv.uk.md
index f2db9a0346..be5e46bb75 100644
--- a/docs/guides/contribute/localdocs/mkdocs_venv.uk.md
+++ b/docs/guides/contribute/localdocs/mkdocs_venv.uk.md
@@ -259,7 +259,7 @@ INFO - [11:46:50] Watching paths for changes:
INFO - [11:46:50] Serving on http://127.0.0.1:8000/
```
-Ваша копія сайту документації буде запущена під час відкриття вашого браузера за вказаною адресою (http://1127.0.0.1:8000). Копія ідеально відображає онлайн-сайт за функціональністю та структурою, дозволяючи оцінити зовнішній вигляд і вплив вашої сторінки на сайт.
+Ваша копія сайту документації буде запущена під час відкриття вашого браузера за вказаною адресою [http://1127.0.0.1:8000](http://1127.0.0.1:8000). Копія ідеально відображає онлайн-сайт за функціональністю та структурою, дозволяючи оцінити зовнішній вигляд і вплив вашої сторінки на сайт.
MkDocs містить механізм для перевірки змін у файлах у папці, визначеній шляхом `docs_dir`, і вставлення нової сторінки або зміна існуючої в `documentation/docs` буде автоматично розпізнано та створить нову статичну збірку сайту.
@@ -267,7 +267,7 @@ MkDocs містить механізм для перевірки змін у ф
### Вихід із середовища розробки
-Коли відображення нової сторінки задовольнить вас, ви можете вийти з середовища розробки. Для цього потрібно спочатку вийти з *MkDocs*, а потім дезактивувати віртуальне середовище python. Щоб вийти з *MkDocs*, вам потрібно використати комбінацію клавіш CTRL + C, і, як ви бачили вище, щоб вийти з віртуального середовища, вам потрібно буде викликати команду `deactivate`.
+Коли відображення нової сторінки задовольнить вас, ви можете вийти з середовища розробки. Для цього потрібно спочатку вийти з *MkDocs*, а потім дезактивувати віртуальне середовище python. Щоб вийти з *MkDocs*, вам потрібно використати комбінацію клавіш ++ctrl++ + ++"C"++, і, як ви бачили вище, щоб вийти з віртуального середовища, вам потрібно буде викликати `deactivate `.
```bash
...
diff --git a/docs/guides/desktop/xfce_installation.uk.md b/docs/guides/desktop/xfce_installation.uk.md
index ae311a6d01..8da16c3980 100644
--- a/docs/guides/desktop/xfce_installation.uk.md
+++ b/docs/guides/desktop/xfce_installation.uk.md
@@ -1,5 +1,5 @@
- - -
-title: XFCE Desktop author: Gerard Arthus, Steven Spencer contributors: Steven Spencer, Antoine Le Morvan, K.Prasad, Ganna Zhyrnova tested_with: 8.5, 8.6, 9.0 tags:
+title: XFCE Desktop author: Gerard Arthus, Steven Spencer contributors: Steven Spencer, Antoine Le Morvan, K.Prasad, Ganna Zhyrnova tested_with: 8.9, 9.3 tags:
- xfce
- робочий стіл
- - -
@@ -14,6 +14,7 @@ title: XFCE Desktop author: Gerard Arthus, Steven Spencer contributors: Steven S
* Робоча станція або ноутбук
* Бажання запустити XFCE як робочий стіл замість стандартного робочого столу GNOME
+* Для 9 мінімальних і 8 процедур, можливість `sudo` для підвищення привілеїв
=== "9"
@@ -93,6 +94,71 @@ title: XFCE Desktop author: Gerard Arthus, Steven Spencer contributors: Steven S

+=== "9-minimal"
+
+ ## 9 minimal: Вступ
+
+ Якщо ви встановили Rocky Linux 9.x і вирішите встановити XFCE після цього, ця процедура допоможе вам це зробити. Ця процедура передбачає встановлення `Rocky-9.3-x86_64-minimal.iso`.
+
+ ### Оновіть свою систему
+
+ Спочатку переконайтеся, що ваша система оновлена:
+
+ ```bash
+ sudo dnf update -y && dnf upgrade -y
+ ```
+
+
+ 
+
+ По-друге, виконайте наведену нижче команду, щоб установити репозиторій epel-release, який містить усі пакунки, необхідні для встановлення для Xfce Desktop.
+
+ ```bash
+ sudo dnf install epel-release -y
+ ```
+
+
+ 
+
+ ### Встановіть XFCE desktop
+
+ Встановіть XFCE, виконавши цю команду:
+
+ ```bash
+ sudo dnf groupinstall xfce -y
+ ```
+
+
+ 
+
+ ### Запуск робочого столу XFCE
+
+ Ви можете запустити робочий стіл XFCE з командного рядка, якщо побачите повідомлення «Complete!» у виведенні команди та без помилок.
+
+ ```bash
+ sudo systemctl isolate graphical.target
+ ```
+
+
+ ### Увімкнути робочий стіл XFCE під час завантаження
+
+ На цьому етапі ви встановили робочий стіл XFCE у системі та переконалися, що він працює, запустивши його з командного рядка. Якщо ви хочете, щоб ваша система завжди запускалася з XFCE замість командного рядка, ви повинні виконати таку команду. Вам потрібно буде спочатку відкрити термінал XFCE за допомогою значка 9 точок:
+
+ ```bash
+ sudo systemctl set-default graphical.target
+ ```
+
+
+ 
+
+ **Важливо:** Ви можете увійти за допомогою свого імені користувача та пароля root.
+
+ 
+
+ Тепер ви можете перевірити це. Перезавантажте систему за допомогою команди `sudo reboot`. Ви побачите, що ваша система відкривається на екрані входу на робочий стіл XFCE.
+
+ 
+
=== "8"
## 8: Встановлення Rocky Linux Minimal
diff --git a/docs/guides/web/php.it.md b/docs/guides/web/php.it.md
index 999fe82d35..0d20148313 100644
--- a/docs/guides/web/php.it.md
+++ b/docs/guides/web/php.it.md
@@ -2,7 +2,7 @@
title: PHP e PHP-FPM
author: Antoine Le Morvan
contributors: Steven Spencer, Ganna Zhyrnova
-tested_with: 8.5
+tested_with: 8.9
tags:
- web
- php
@@ -11,7 +11,11 @@ tags:
# PHP e PHP-FPM
-**PHP** (**P**HP **H**ypertext **P**reprocessor) è un linguaggio sorgente di scripting, appositamente progettato per lo sviluppo di applicazioni web. Nel 2021, PHP rappresentava poco meno dell'80% delle pagine web generate nel mondo. PHP è open-source ed è il nucleo dei più famosi CMS (WordPress, Drupal, Joomla!, Magento, ...).
+!!! warning "Scritto per Rocky Linux 8.x"
+
+ Questa procedura è stata pubblicata inizialmente quando Rocky Linux 8.x era l'unica versione. Questa procedura deve essere testata e riscritta per Rocky Linux 9.x.
+
+**PHP** (**P**HP **H**ypertext **P**reprocessor) è un linguaggio di scripting sorgente, appositamente progettato per lo sviluppo di applicazioni web. Nel 2021, PHP rappresentava poco meno dell'80% delle pagine web generate nel mondo. PHP è open-source ed è il nucleo dei più famosi CMS (WordPress, Drupal, Joomla!, Magento, ...).
**PHP-FPM** (**F**astCGI **P**rocess **M**anager) è integrato nel PHP dalla sua versione 5.3.3. La versione FastCGI di PHP offre ulteriori funzionalità.
@@ -22,7 +26,7 @@ tags:
* Nel caso di **CGI**, ogni richiesta porta alla creazione di un **nuovo processo**, che è meno efficiente in termini di prestazioni.
* **FastCGI** si basa su un **certo numero di processi** per il trattamento delle sue richieste client.
-PHP-FPM, **oltre a migliori prestazioni**, porta:
+PHP-FPM, **oltre a prestazioni migliori**, porta con sé:
* La possibilità di una migliore **separazione delle applicazioni**: lancio di processi con uid/gid diversi, con file `php.ini` personalizzati,
* La gestione delle statistiche,
@@ -35,35 +39,43 @@ PHP-FPM, **oltre a migliori prestazioni**, porta:
## Scegliere una versione PHP
-Rocky Linux, come il suo upstream, offre molte versioni del linguaggio. Alcune di esse hanno raggiunto la fine della loro vita ma sono mantenute per continuare ad ospitare applicazioni storiche che non sono ancora compatibili con le nuove versioni di PHP. Si prega di fare riferimento alla pagina [ versioni supportate ](https://www.php.net/supported-versions.php) del sito web php.net per scegliere una versione supportata.
+Rocky Linux, come il suo upstream, offre molte versioni del linguaggio. Alcuni di essi hanno raggiunto la fine del loro ciclo di vita, ma vengono mantenuti per continuare a ospitare applicazioni storiche che non sono ancora compatibili con le nuove versioni di PHP. Fare riferimento alla pagina [versioni supportate](https://www.php.net/supported-versions.php) del sito web php.net per scegliere una versione supportata.
Per ottenere un elenco delle versioni disponibili, basta inserire il seguente comando:
-```
+```bash
$ sudo dnf module list php
+
Rocky Linux 8 - AppStream
-Name Stream Profiles Summary
-php 7.2 [d] common [d], devel, minimal PHP scripting language
-php 7.3 common [d], devel, minimal PHP scripting language
-php 7.4 common [d], devel, minimal PHP scripting language
+Name Stream Profiles Summary
+php 7.2 [d] common [d], devel, minimal PHP scripting language
+php 7.3 common [d], devel, minimal PHP scripting language
+php 7.4 common [d], devel, minimal PHP scripting language
+php 8.0 common [d], devel, minimal PHP scripting language
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
```
Rocky fornisce, dal proprio repository AppStream, diversi moduli PHP.
-Noterete che la versione predefinita di un Rocky 8.5 è la 7.2, che ha già raggiunto la sua fine vita al momento in cui scriviamo.
+Si noterà che la versione predefinita di Rocky 8.9 è la 7.2, che ha già raggiunto la fine del suo ciclo di vita al momento in cui si scrive.
-Puoi attivare un nuovo modulo inserendo il seguente comando:
+È possibile attivare un modulo più recente immettendo il seguente comando:
-```
-sudo dnf module enable php:7.4
+```bash
+sudo dnf module enable php:8.0
==============================================================================================
Package Architecture Version Repository Size
==============================================================================================
Enabling module streams:
- httpd 2.4
- php 7.4
+ httpd 2.4
+ nginx 1.14
+ php 8.0
+
+Transaction Summary
+==============================================================================================
+
+Is this ok [y/N]:
Transaction Summary
==============================================================================================
@@ -72,10 +84,6 @@ Is this ok [y/N]: y
Complete!
```
-!!! Note "Nota"
-
- Attualmente non è possibile installare PHP 8 dai repository di AppStream. Per questo, dovrai passare attraverso il repository REMI. Questa installazione non è contemplata nel presente documento.
-
Ora si può procedere all'installazione del motore PHP.
## Modalità PHP cgi
@@ -88,13 +96,13 @@ L'installazione di PHP è relativamente banale, poiché consiste nell'installare
L'esempio seguente installa PHP con i moduli normalmente installati con esso.
-```
-$ sudo dnf install php php-cli php-gd php-curl php-zip php-mbstring
+```bash
+sudo dnf install php php-cli php-gd php-curl php-zip php-mbstring
```
È possibile verificare che la versione installata corrisponda a quella prevista:
-```
+```bash
$ php -v
PHP 7.4.19 (cli) (built: May 4 2021 11:06:37) ( NTS )
Copyright (c) The PHP Group
@@ -104,42 +112,42 @@ Zend Engine v3.4.0, Copyright (c) Zend Technologies
### Configurazione
-### Integrazione con Apache
+#### Integrazione con Apache
Per servire pagine PHP in modalità CGI, è necessario installare il server apache, configurarlo, attivarlo e avviarlo.
* Installazione:
-```
-$ sudo dnf install httpd
+```bash
+sudo dnf install httpd
```
* Attivazione:
-```
-$ sudo systemctl enable httpd
-$ sudo systemctl start httpd
-$ sudo systemctl status httpd
+```bash
+sudo systemctl enable httpd
+sudo systemctl start httpd
+sudo systemctl status httpd
```
-* Non dimenticarti di configurare il firewall:
+* Non dimenticatevi di configurare il firewall:
-```
-$ sudo firewall-cmd --add-service=http --permanent
-$ sudo firewall-cmd --reload
+```bash
+sudo firewall-cmd --add-service=http --permanent
+sudo firewall-cmd --reload
```
-Il vhost predefinito dovrebbe funzionare fuori dalla scatola. PHP fornisce una funzione `phpinfo()` che genera una tabella riassuntiva della sua configurazione. È molto utile per testare il buon funzionamento di PHP. Tuttavia, fate attenzione a non lasciare tali file di prova sui vostri server. Rappresentano un enorme rischio per la sicurezza della vostra infrastruttura.
+Il vhost predefinito dovrebbe funzionare subito. PHP fornisce una funzione `phpinfo()` che genera una tabella riassuntiva della sua configurazione. È molto utile per testare il buon funzionamento di PHP. Tuttavia, fate attenzione a non lasciare tali file di prova sui vostri server. Rappresentano un enorme rischio per la sicurezza della vostra infrastruttura.
-Crea il file `/var/www/html/info.php` (essendo la directory vhost predefinita della configurazione predefinita di apache `/var/www/html`):
+Creare il file `/var/www/html/info.php` (`/var/www/html` è la cartella vhost della configurazione predefinita di apache):
-```
+```bash
```
-Usa un browser web per verificare che il server funzioni correttamente andando alla pagina http://your-server-ip/info.php.
+Utilizzare un browser web per verificare il corretto funzionamento del server accedendo alla pagina [http://your-server-ip/info.php](http://your-server-ip/info.php).
!!! Warning "Attenzione"
@@ -153,23 +161,23 @@ Come abbiamo evidenziato in precedenza in questo documento, ci sono molti vantag
L'installazione è limitata al pacchetto php-fpm:
-```
-$ sudo dnf install php-fpm
+```bash
+sudo dnf install php-fpm
```
-Poiché php-fpm è un servizio dal punto di vista del sistema, deve essere attivato e avviato:
+Poiché php-fpm è un servizio per il sistema, deve essere attivato e avviato:
-```
-$ sudo systemctl enable php-fpm
-$ sudo systemctl start php-fpm
-$ sudo systemctl status php-fpm
+```bash
+sudo systemctl enable php-fpm
+sudo systemctl start php-fpm
+sudo systemctl status php-fpm
```
### Configurazione
Il file di configurazione principale è memorizzato in `/etc/php-fpm.conf`.
-```
+```bash
include=/etc/php-fpm.d/*.conf
[global]
pid = /run/php-fpm/php-fpm.pid
@@ -181,11 +189,11 @@ daemonize = yes
I file di configurazione php-fpm sono ampiamente commentati. Andate a dare un'occhiata!
-Come puoi vedere, i file con l'estensione `.conf` nella directory `/etc/php-fpm/` sono sempre inclusi.
+Come si può vedere, i file della cartella `/etc/php-fpm/` con estensione `.conf` sono sempre inclusi.
Per impostazione predefinita, un pool di processi PHP, chiamato `www`, è definito in `/etc/php-fpm.d/www.conf`.
-```
+```bash
[www]
user = apache
group = apache
@@ -214,23 +222,23 @@ php_value[soap.wsdl_cache_dir] = /var/lib/php/wsdlcache
| `[pool]` | Nome del pool di processi. Il file di configurazione può comprendere diversi pool di processi (il nome del pool tra parentesi inizia una nuova sezione). |
| `listen` | Definisce l'interfaccia di ascolto o il socket unix utilizzato. |
-#### Configurare il modo di accedere ai processi php-fpm
+#### Configurazione del modo di accedere ai processi di php-fpm
-Ci sono 2 modi per connettersi.
+Configurazione del modo di accedere ai processi di php-fpm.
-Tramite un'interfaccia di inet come:
+Tramite un'interfaccia inet come:
`listen = 127.0.0.1:9000`.
-Oppure attraverso un socket Unix:
+O tramite un socket Unix:
`listen = /run/php-fpm/www.sock`.
!!! Note "Nota"
- L'uso di un socket quando il server web e il server PHP si trovano sulla stessa macchina elimina il livello TCP/IP e ottimizza le prestazioni.
+ Utilizzando un socket quando il server web e il server PHP si trovano sulla stessa macchina, si elimina il livello TCP/IP e si ottimizzano le prestazioni.
-Quando si lavora tramite un'interfaccia, bisogna configurare `listen.owner`, `listen.group`, `listen.mode` per specificare il proprietario, il gruppo proprietario e i diritti del socket Unix. **Attenzione:** entrambi i server (web e PHP) devono avere i diritti di accesso al socket.
+Quando si opera tramite un'interfaccia, è necessario configurare `listen.owner`, `listen.group`, `listen.mode` per specificare il proprietario, il gruppo di proprietari e i diritti del socket Unix. **Attenzione:** entrambi i server (web e PHP) devono avere i diritti di accesso al socket.
Quando si lavora tramite un socket, è necessario configurare `listen.allowed_clients` per limitare l'accesso al server PHP a determinati indirizzi IP.
@@ -242,18 +250,18 @@ I processi di PHP-FPM possono essere gestiti staticamente o dinamicamente.
In modalità statica, il numero di processi figli è impostato dal valore di `pm.max_children`;
-```
+```bash
pm = static
pm.max_children = 10
```
Questa configurazione avvierà 10 processi.
-In modalità dinamica, PHP-FPM lancerà al massimo il numero di processi specificato dal valore di `pm.max_children`, iniziando a lanciare un numero di processi corrispondente a `pm.start_servers`, e mantenendo almeno il valore di `pm.min_spare_servers` di processi inattivi e al massimo `pm.max_spare_servers` processi inattivi.
+In modalità dinamica, PHP-FPM lancerà al massimo il numero di processi specificato dal valore di `pm.max_children`, iniziando a lanciare un numero di processi corrispondente a `pm.start_servers`, e mantenendo almeno il valore di `pm.min_spare_servers` di processi inattivi e al massimo `pm.max_spare_servers` di processi inattivi.
Esempio:
-```
+```bash
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
@@ -261,28 +269,27 @@ pm.min_spare_servers = 1
pm.max_spare_servers = 3
```
-PHP-FPM creerà un nuovo processo per sostituire uno che ha processato un numero di richieste equivalente a `pm.max_requests`.
+PHP-FPM creerà un nuovo processo per sostituire quello che ha elaborato un numero di richieste equivalente a `pm.max_requests`.
-Per impostazione predefinita, `pm.max_requests` è impostato a 0, il che significa che i processi non vengono mai riciclati. L'uso dell'opzione `pm.max_requests` può essere interessante per applicazioni con perdite di memoria.
+Per impostazione predefinita, `pm.max_requests` è impostato a 0, il che significa che i processi non vengono mai riciclati. L'uso dell'opzione `pm.max_requests` può essere interessante per applicazioni con problemi di memoria.
-C'è una terza modalità di funzionamento, la modalità `ondemand`. Questa modalità avvia un processo solo quando riceve una richiesta. Non è una modalità ottimale per i siti con forti influenze, ed è da riservare per esigenze specifiche (siti con richieste molto deboli, backend di gestione, ecc.).
+C'è una terza modalità di funzionamento, la modalità `ondemand`. Questa modalità avvia un processo solo quando riceve una richiesta. Non è una modalità ottimale per i siti con forti pressioni e deve essere riservata a esigenze specifiche (siti con richieste molto deboli, backend di gestione, ecc.).
!!! Note "Nota"
La configurazione della modalità operativa di PHP-FPM è essenziale per garantire un funzionamento ottimale del server web.
-
#### Stato del processo
PHP-FPM offre, come Apache e il suo modulo `mod_status`, una pagina che indica lo stato del processo.
Per attivare la pagina, impostare il suo percorso di accesso tramite la direttiva `pm.status_path`:
-```
+```bash
pm.status_path = /status
```
-```
+```bash
$ curl http://localhost/status_php
pool: www
process manager: dynamic
@@ -306,7 +313,7 @@ La direttiva slowlog specifica il file che riceve la registrazione delle richies
La posizione predefinita del file generato è `/var/log/php-fpm/www-slow.log`.
-```
+```bash
request_slowlog_timeout = 5
slowlog = /var/log/php-fpm/www-slow.log
```
@@ -317,9 +324,9 @@ Un valore di 0 per `request_slowlog_timeout` disabilita la registrazione.
L'impostazione predefinita di nginx include già la configurazione necessaria per far funzionare PHP con PHP-FPM.
-Il file di configurazione `fastcgi.conf` (o `fastcgi_params`) si trova sotto `/etc/nginx/`:
+Il file di configurazione `fastcgi.conf` (o `fastcgi_params`) si trova in `/etc/nginx/`:
-```
+```bash
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
@@ -351,7 +358,7 @@ Affinché nginx possa elaborare i file `.php`, le seguenti direttive devono esse
Se PHP-FPM è in ascolto sulla porta 9000:
-```
+```bash
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
@@ -360,7 +367,7 @@ location ~ \.php$ {
Se php-fpm è in ascolto su un socket unix:
-```
+```bash
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
@@ -369,9 +376,9 @@ location ~ \.php$ {
### Integrazione con Apache
-La configurazione di apache per utilizzare un pool PHP è abbastanza semplice. Basta usare i moduli proxy con una direttiva `ProxyPassMatch`, per esempio:
+La configurazione di apache per utilizzare un pool PHP è abbastanza semplice. È sufficiente usare i moduli proxy con una direttiva `ProxyPassMatch`, per esempio:
-```
+```bash
ServerName web.rockylinux.org
DocumentRoot "/var/www/html/current/public"
@@ -393,21 +400,21 @@ La configurazione di apache per utilizzare un pool PHP è abbastanza semplice. B
Prima di tutto, dobbiamo conoscere la quantità media di memoria utilizzata da un processo PHP, con il comando:
-```
+```bash
while true; do ps --no-headers -o "rss,cmd" -C php-fpm | grep "pool www" | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }' >> avg_php_proc; sleep 60; done
```
-Dopo un po' di tempo, questo dovrebbe darci un'idea abbastanza precisa dell'impronta media della memoria di un processo PHP su questo server.
+Dopo un po' di tempo, questo dovrebbe darci un'idea abbastanza precisa dell'occupazione media di memoria di un processo PHP su questo server.
Per il resto di questo documento, diciamo che il risultato è un'impronta di memoria di 120 Mb per processo a pieno carico.
-Su un server con 8Gb di RAM, conservando 1Gb per il sistema e 1Gb per la OPCache (vedi il resto di questo documento), rimangono 6Gb per elaborare le richieste PHP dei clienti.
+Su un server con 8 Gb di RAM, mantenendo 1 Gb per il sistema e 1 Gb per la OPCache (si veda il resto di questo documento), rimangono 6 Gb per elaborare le richieste PHP dei client.
-Possiamo facilmente concludere che questo server può accettare al massimo **50 thread** `((6*1024) / 120)`.
+Si può facilmente concludere che questo server può accettare al massimo **50 thread** `((6*1024) / 120)`.
-Una buona configurazione di `php-fpm` specifica per questo caso di utilizzo sarebbe:
+Una buona configurazione di `php-fpm` specifica per questo caso d'uso sarebbe:
-```
+```bash
pm = dynamic
pm.max_children = 50
pm.start_servers = 12
@@ -424,32 +431,25 @@ con:
### Configurazione di Opcache
-La `opcache` (Optimizer Plus Cache) è il primo livello di cache su cui possiamo influire.
+L'`opcache` (Optimizer Plus Cache) è il primo livello di cache su cui possiamo intervenire.
Mantiene gli script PHP compilati in memoria, il che ha un forte impatto sull'esecuzione delle pagine web (elimina la lettura su disco degli script + il tempo di compilazione).
Per configurarla, dobbiamo lavorare su:
-* La dimensione della memoria dedicata all'opcache in base al rapporto di hit
-
-Configurando correttamente
-
-
-
-
-
+* La dimensione della memoria dedicata alla opcache in base alla percentuale di successo, configurandola in modo corretto
* il numero di script PHP da memorizzare nella cache (numero di chiavi + numero massimo di script)
* il numero di stringhe da mettere in cache
Per installarla:
-```
-$ sudo dnf install php-opcache
+```bash
+sudo dnf install php-opcache
```
Per configurarla, modificare il file di configurazione `/etc/php.d/10-opcache.ini`:
-```
+```bash
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
@@ -459,13 +459,13 @@ dove:
* `opcache.memory_consumption` corrisponde alla quantità di memoria necessaria per l'opcache (da aumentare fino a ottenere un corretto rapporto di successo).
* `opcache.interned_strings_buffer` la quantità di stringhe da mettere in cache.
-* `opcache.max_accelerated_files` è vicino al risultato del comando `find ./ -iname "*.php"|wc -l`.
+* `opcache.max_accelerated_files` è prossimo al risultato del comando `find ./ -iname "*.php"|wc -l`.
-Puoi fare riferimento alla pagina `info.php` (incluso il `phpinfo();`) per configurare l'opcache (vedi per esempio i valori di `Cached scripts` e `Cached strings`).
+Si può fare riferimento a una pagina `info.php` (compresa la funzione `phpinfo();`) per configurare l'opcache (vedi per esempio i valori di `Cached scripts` e `Cached strings`).
!!! Note "Nota"
- Ad ogni nuovo inserimento di nuovo codice, sarà necessario svuotare l'opcache (per esempio riavviando il processo php-fpm).
+ A ogni nuova distribuzione di nuovo codice, sarà necessario svuotare la opcache (ad esempio riavviando il processo php-fpm).
!!! Note "Nota"
|