|
- codeblock
+ ++"codeblock"++
|
@@ -161,4 +160,3 @@ local servers = { "html", "cssls", "tsserver", "clangd", "marksman" }
Його використання та, як наслідок, запам’ятовування первинних ключів для вставлення символів коду Markdown забезпечать ефективне пришвидшення запису, дозволяючи вам зосередити свою увагу на вмісті.
-
From 57093301485abf08fab9f9f34bb367424b1c6c15 Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Wed, 31 Jan 2024 05:35:20 -0500
Subject: [PATCH 15/24] New translations php.md (Italian)
---
docs/guides/web/php.it.md | 180 +++++++++++++++++++-------------------
1 file changed, 90 insertions(+), 90 deletions(-)
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"
From c56dc418c619a7e0a0e66f88bb8e91025af4917f Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Wed, 31 Jan 2024 11:49:42 -0500
Subject: [PATCH 16/24] New translations plugins_manager.md (Italian)
---
docs/books/nvchad/nvchad_ui/plugins_manager.it.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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.
From 7f3aba1d8a4d471e91d88381e0aa3e68e3a78612 Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Thu, 1 Feb 2024 07:30:01 -0500
Subject: [PATCH 17/24] New translations 14-special-authority.md (Ukrainian)
---
.../admin_guide/14-special-authority.uk.md | 31 +++++++++++--------
1 file changed, 18 insertions(+), 13 deletions(-)
diff --git a/docs/books/admin_guide/14-special-authority.uk.md b/docs/books/admin_guide/14-special-authority.uk.md
index 4043f99475..066bdcc34b 100644
--- a/docs/books/admin_guide/14-special-authority.uk.md
+++ b/docs/books/admin_guide/14-special-authority.uk.md
@@ -235,7 +235,7 @@ Shell > setfacl -b FILE_NAME
!!! info "примітка"
- Рекурсія застосовується до файлів/каталогів, які вже існують.
+ Рекурсія підходить для файлів/каталогів, які вже існують у каталозі.
Розглянемо наступний приклад:
@@ -290,6 +290,10 @@ default:mask::rwx
default:other::---
```
+!!! info "Інформація"
+
+ За замовчуванням і рекурсія використання дозволів ACL вимагає, щоб робочим об’єктом команди був каталог! Якщо об’єктом операції є файл, буде виведено повідомлення про помилку.
+
### SetUID
Роль "SetUID":
@@ -305,7 +309,7 @@ default:other::---
Як бачите, звичайні користувачі мають лише r та x, але x власника стає s, доводячи, що команда `passwd` має дозволи SUID.
-Добре відомо, що звичайні користувачі (uid >= 1000) можуть змінити свій пароль. Справжній пароль зберігається у файлі **/etc/shadow**, але дозвіл тіньового файлу становить 000, і звичайні користувачі не мають жодних дозволів.
+Добре відомо, що звичайні користувачі (uid >= 1000) можуть змінювати свої паролі. Фактичний пароль зберігається у файлі **/etc/shadow**, але дозвіл файлу тіней становить 000, і звичайні користувачі не мають жодних дозволів.
```bash
Shell > ls -l /etc/shadow
@@ -467,7 +471,7 @@ Shell > su - tom
Shell(tom) > rm -rf /tmp/tom_file1
```
-!!! info "Інформація"
+!!! info "примітка"
користувачі root (uid=0) не обмежені дозволами SUID, SGID і SBIT.
@@ -550,10 +554,10 @@ Shell > chattr -i /tmp/filei /tmp/diri
#### Опис атрибута a:
-| | Видалення | Модифікація | Додавання вмісту файлу | Перегляд | Створення файлу |
-|:-------:|:----------------------------------------:|:------------------------------:|:------------------------------:|:------------------------------:|:---------------:|
-| файл | × | × | √ | √ | - |
-| каталог | x (Каталог і файли в каталозі) | √ (Файли в каталозі) | √ (Файли в каталозі) | √ (Файли в каталозі) | √ |
+| | Видалення | Модифікація | Додавання вмісту файлу | Перегляд | Створення файлу |
+|:-------:|:----------------------------------------:|:-----------------------------:|:------------------------------:|:------------------------------:|:---------------:|
+| файл | × | × | √ | √ | - |
+| каталог | x (Каталог і файли в каталозі) | x (Файли в каталозі) | √ (Файли в каталозі) | √ (Файли в каталозі) | √ |
Приклади для файлу:
@@ -584,19 +588,19 @@ Shell > mkdir /etc/dira
Shell > cd /etc/dira && echo "asdf" > afile
Shell > chattr +a /etc/dira
-Shell > lsattr -a /etc/dira
+Shell > lsattr -ad /etc/dira
-----a--------e----- /etc/dira/
Shell > rm -rf /etc/dira
rm: cannot remove '/etc/dira/afile': Operation not permitted
-# Allow modification
+# Free modification is not allowed
Shell > vim /etc/dira/afile
-asdf-bcd
+asdf
Shell > echo "new line" >> /etc/dira/afile
Shell > cat /etc/dira/afile
-asdf-bcd
+asdf
new line
# Allow creation of new files
@@ -648,7 +652,8 @@ Shell > visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
↓ ↓ ↓ ↓
- 1 2 3 4...
+ 1 2 3 4
+...
```
| Частина | Опис |
@@ -666,7 +671,7 @@ Shell > visudo
101 tom ALL=/sbin/shutdown -r now
...
-# Ви можете використовувати опцію "-c", щоб перевірити наявність помилок у написанні /etc/sudoers.
+# You can use the "-c" option to check for errors in /etc/sudoers writing.
Shell > visudo -c
Shell > su - tom
From b771e3df0c5705a42da4a4641f0c9a6599593009 Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Thu, 1 Feb 2024 08:25:44 -0500
Subject: [PATCH 18/24] New translations 1_regular_expressions_vs_wildcards.md
(Ukrainian)
---
.../1_regular_expressions_vs_wildcards.uk.md | 157 ++++++++++++++++++
1 file changed, 157 insertions(+)
create mode 100644 docs/books/sed_awk_grep/1_regular_expressions_vs_wildcards.uk.md
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)
From 3789fc4997aad4a3fa326aafe95ba0ef17c8e2bb Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Thu, 1 Feb 2024 08:25:45 -0500
Subject: [PATCH 19/24] New translations 2_grep_command.md (Ukrainian)
---
docs/books/sed_awk_grep/2_grep_command.uk.md | 280 +++++++++++++++++++
1 file changed, 280 insertions(+)
create mode 100644 docs/books/sed_awk_grep/2_grep_command.uk.md
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
+ ```
From 61b16d162e6d0bb7f60862fe2d39ba69f6fca771 Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Thu, 1 Feb 2024 08:25:47 -0500
Subject: [PATCH 20/24] New translations 3_sed_command.md (Ukrainian)
---
docs/books/sed_awk_grep/3_sed_command.uk.md | 836 ++++++++++++++++++++
1 file changed, 836 insertions(+)
create mode 100644 docs/books/sed_awk_grep/3_sed_command.uk.md
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
+ ```
From d8350af2da767e3626ca914cd761c498e1577084 Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Thu, 1 Feb 2024 08:25:50 -0500
Subject: [PATCH 21/24] New translations 4_awk_command.md (Ukrainian)
---
docs/books/sed_awk_grep/4_awk_command.uk.md | 2034 +++++++++++++++++++
1 file changed, 2034 insertions(+)
create mode 100644 docs/books/sed_awk_grep/4_awk_command.uk.md
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").
+
+Ще раз дякую за читання.
From fc2244a425ff70e2409514bc23e2d423631b0079 Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Thu, 1 Feb 2024 08:25:51 -0500
Subject: [PATCH 22/24] New translations index.md (Ukrainian)
---
docs/books/sed_awk_grep/index.uk.md | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
create mode 100644 docs/books/sed_awk_grep/index.uk.md
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` є потужними та часто використовуваними, тому люди називають їх "Трьома мечниками".
From 0cfcd4809d7dae9309f78a2c10f3a6979db3a39e Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Fri, 2 Feb 2024 06:33:25 -0500
Subject: [PATCH 23/24] New translations xfce_installation.md (Ukrainian)
---
docs/guides/desktop/xfce_installation.uk.md | 68 ++++++++++++++++++++-
1 file changed, 67 insertions(+), 1 deletion(-)
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
From e3694e010b6c874674115ec1a304ccfa3a9414aa Mon Sep 17 00:00:00 2001
From: Rocky Linux Automation
<75949597+rockylinux-auto@users.noreply.github.com>
Date: Fri, 2 Feb 2024 15:03:08 -0500
Subject: [PATCH 24/24] New translations index.md (Italian)
---
docs/books/nvchad/index.it.md | 88 ++++++++++++++++-------------------
1 file changed, 40 insertions(+), 48 deletions(-)
diff --git a/docs/books/nvchad/index.it.md b/docs/books/nvchad/index.it.md
index 0ecff1025c..5a395d25c6 100644
--- a/docs/books/nvchad/index.it.md
+++ b/docs/books/nvchad/index.it.md
@@ -9,25 +9,25 @@ tags:
- editor
---
-# Introduzione
+# :material-book-open-page-variant-outline: Introduzione
-In questo libro troverete il modo di implementare Neovim, insieme a NvChad, per creare un **ambiente** di **sviluppo** **integrato** (IDE) completamente funzionale.
+In questo libro troverete il modo di implementare Neovim, insieme a NvChad, per creare un ==**ambiente** di **sviluppo** **integrato**== (IDE) completamente funzionale.
Dico "modi" perché ci sono molte possibilità. L'autore si concentra sull'uso di questi strumenti per la scrittura di markdown, ma se il markdown non è il vostro obiettivo, non preoccupatevi, continuate a leggere. Se non conoscete nessuno di questi strumenti (NvChad o Neovim), questo libro vi fornirà un'introduzione a entrambi e, se seguirete questi documenti, vi renderete presto conto che potete configurare questo ambiente in modo che sia di grande aiuto per qualsiasi esigenza di programmazione o di scrittura di script.
Volete un IDE che vi aiuti a scrivere i playbook di Ansible? Puoi ottenerlo! Volete un IDE per Golang? Anche questo è disponibile. Volete semplicemente una buona interfaccia per scrivere script BASH? È anche disponibile.
-Grazie all'uso dei **L**anguage **S**erver **P**rotocols e dei linters, è possibile configurare un ambiente personalizzato per l'utente. La cosa migliore è che una volta configurato l'ambiente, è possibile aggiornarlo rapidamente quando sono disponibili nuove modifiche attraverso l'uso di Packer e Mason, entrambi trattati qui.
+Grazie all'uso dei ==**L**anguage **S**erver **P**rotocols== e dei ==linters==, è possibile configurare un ambiente personalizzato per l'utente. La cosa migliore è che una volta configurato l'ambiente, questo può essere rapidamente aggiornato quando sono disponibili nuove modifiche attraverso l'uso di [lazy.nvim][] e [Mason][], entrambi trattati qui.
-Poiché Neovim è un fork di `vim`, l'interfaccia generale sarà familiare agli utenti di `vim`. Se non siete utenti di `vim`, con questo libro imparerete rapidamente la sintassi dei comandi. Le informazioni trattate sono molte, ma è facile seguirle e, una volta completato il contenuto, saprete abbastanza per costruire il vostro IDE per *le vostre* esigenze con questi strumenti.
+Poiché Neovim è un fork di [Vim][], l'interfaccia generale sarà familiare agli utenti di *vim*. Se non siete utenti di *vim*, con questo libro imparerete rapidamente la sintassi dei comandi. Le informazioni trattate sono molte, ma è facile seguirle e, una volta completato il contenuto, saprete abbastanza per costruire il vostro IDE per *le vostre* esigenze con questi strumenti.
L'intento dell'autore era quello di **non** suddividere il libro in capitoli. Il motivo è che ciò implica un ordine da seguire che, nella maggior parte dei casi, non è necessario. *Si* consiglia di iniziare da questa pagina, leggere e seguire le sezioni "Software aggiuntivo", "Installare Neovim" e "Installare NvChad", ma da lì si può scegliere come procedere.
-## Utilizzo di Neovim come IDE
+## :simple-neovim: Utilizzo di Neovim come IDE
L'installazione di base di Neovim fornisce un ottimo editor per lo sviluppo, ma non può ancora essere definito un IDE; tutte le funzionalità IDE più avanzate, anche se già preimpostate, non sono ancora attivate. Per farlo, dobbiamo passare le configurazioni necessarie a Neovim, ed è qui che NvChad ci viene in aiuto. Questo ci permette di avere una configurazione di base con un solo comando!
-La configurazione è scritta in Lua, un linguaggio di programmazione molto veloce che consente a NvChad di avere tempi di avvio e di esecuzione dei comandi e dei tasti molto rapidi. Ciò è reso possibile anche dalla tecnica di `Lazy loading` utilizzata per i plugin, che li carica solo quando necessario.
+La configurazione è scritta in Lua, un linguaggio di programmazione molto veloce che consente a NvChad di avere tempi di avvio e di esecuzione dei comandi e dei tasti molto rapidi. Ciò è reso possibile anche dalla tecnica di ==Lazy loading== utilizzata per i plugin, che li carica solo quando necessario.
L'interfaccia risulta essere molto pulita e piacevole.
@@ -37,23 +37,18 @@ Come gli sviluppatori di NvChad tengono a precisare, il progetto vuole essere so
### Caratteristiche Principali
-- **Progettato per essere veloce.** Dalla scelta del linguaggio di programmazione alle tecniche di caricamento dei componenti, tutto è stato progettato per ridurre al minimo i tempi di esecuzione.
-
-- **Interfaccia attraente.** Nonostante si tratti di un'applicazione _cli_, l'interfaccia ha un aspetto moderno e bello dal punto di vista grafico, inoltre tutti i componenti si adattano perfettamente all'interfaccia utente.
-
-- **Estremamente configurabile.** Grazie alla modularità derivata dall'applicazione di base (NeoVim), l'editor può essere adattato perfettamente alle proprie esigenze. Tenete presente, tuttavia, che quando parliamo di personalizzazione ci riferiamo alla funzionalità e non all'aspetto dell'interfaccia.
-
-- **Meccanismo di aggiornamento automatico.** L'editor è dotato di un meccanismo (attraverso l'uso di _git_) che consente di effettuare aggiornamenti con un semplice comando `:NvChadUpdate`.
-
-- **Powered by Lua.** La configurazione di NvChad è scritta interamente in _lua_, il che le consente di integrarsi perfettamente nella configurazione di Neovim, sfruttando tutte le potenzialità dell'editor su cui si basa.
-
-- **Numerosi temi incorporati.** La configurazione include già un gran numero di temi da utilizzare, tenendo sempre presente che stiamo parlando di un'applicazione _cli_, i temi possono essere selezionati con il tasto ` + th`.
+* :material-run-fast: **Progettato per essere veloce.** Dalla scelta del linguaggio di programmazione alle tecniche di caricamento dei componenti, tutto è stato pensato per ridurre al minimo i tempi di esecuzione.
+* :material-invert-colors: **Interfaccia attraente.** Nonostante sia un'applicazione *cli*, l'interfaccia ha un aspetto moderno e bello dal punto di vista grafico, inoltre tutti i componenti si adattano perfettamente all'interfaccia utente.
+* :material-file-settings-outline: **Estremamente configurabile.** Grazie alla modularità derivata dall'applicazione di base (NeoVim), l'editor può essere adattato perfettamente alle proprie esigenze. Tenete presente, tuttavia, che quando parliamo di personalizzazione ci riferiamo alla funzionalità e non all'aspetto dell'interfaccia.
+* :material-update: **Meccanismo di aggiornamento automatico.** L'editor è dotato di un meccanismo (attraverso l'uso di *git*) che consente di effettuare aggiornamenti con un semplice comando `:NvChadUpdate`.
+* :material-language-lua: **Powered by Lua**. La configurazione di NvChad è scritta interamente in *lua*, il che le permette di integrarsi perfettamente nella configurazione di Neovim, sfruttando tutte le potenzialità dell'editor su cui si basa.
+* :material-palette-outline: **Numerosi temi integrati.** La configurazione comprende già un gran numero di temi da utilizzare, ricordando sempre che stiamo parlando di un'applicazione *cli*, i temi possono essere selezionati con il tasto ` + th`.

## Riferimenti
-### Lua
+### :simple-lua: Lua
#### Che cos’è Lua?
@@ -69,38 +64,30 @@ Lua è utilizzato nello sviluppo di videogiochi e motori di gioco (Roblox, Warfr
Ci sono due componenti principali di Lua:
-- L'interprete Lua
-- La macchina virtuale Lua (VM)
+* L'interprete Lua
+* La macchina virtuale Lua (VM)
Lua non viene interpretato direttamente attraverso un file Lua come altri linguaggi, ad esempio Python. Utilizza invece l'interprete Lua per compilare un file Lua in bytecode. L'interprete Lua è altamente portatile e in grado di funzionare su una moltitudine di dispositivi.
#### Caratteristiche Principali
-- Velocità: Lua è considerato uno dei linguaggi di programmazione più veloci tra i linguaggi di scripting interpretati; può eseguire compiti molto impegnativi dal punto di vista delle prestazioni più velocemente della maggior parte degli altri linguaggi di programmazione.
-
-- Dimensioni: Lua ha dimensioni davvero ridotte rispetto ad altri linguaggi di programmazione. Le dimensioni ridotte sono ideali per integrare Lua in più piattaforme, dai dispositivi embedded ai motori di gioco.
-
-- Portabilità e integrazione: La portabilità di Lua è quasi illimitata. Qualsiasi piattaforma che supporti il compilatore C standard può eseguire Lua senza problemi. Lua non richiede complesse riscritture per essere compatibile con altri linguaggi di programmazione.
+* Velocità: Lua è considerato uno dei linguaggi di programmazione più veloci tra i linguaggi di scripting interpretati; può eseguire compiti molto impegnativi dal punto di vista delle prestazioni più velocemente della maggior parte degli altri linguaggi di programmazione.
+* Dimensioni: Lua ha dimensioni davvero ridotte rispetto ad altri linguaggi di programmazione. Le dimensioni ridotte sono ideali per integrare Lua in più piattaforme, dai dispositivi embedded ai motori di gioco.
+* Portabilità e integrazione: La portabilità di Lua è quasi illimitata. Qualsiasi piattaforma che supporti il compilatore C standard può eseguire Lua senza problemi. Lua non richiede complesse riscritture per essere compatibile con altri linguaggi di programmazione.
+* Semplicità: Lua ha un design semplice ma fornisce potenti funzionalità. Una delle caratteristiche principali di Lua sono i meta-meccanismi, che consentono agli sviluppatori di implementare le proprie funzionalità. La sintassi è semplice e in un formato facilmente comprensibile, in modo che chiunque possa facilmente imparare Lua e utilizzarlo nei propri programmi.
+* Licenza: Lua è un software libero e open-source distribuito sotto la licenza MIT. Questo permette a chiunque di utilizzarlo per qualsiasi scopo senza pagare alcuna licenza o royalty.
-- Semplicità: Lua ha un design semplice ma fornisce potenti funzionalità. Una delle caratteristiche principali di Lua sono i meta-meccanismi, che consentono agli sviluppatori di implementare le proprie funzionalità. La sintassi è semplice e in un formato facilmente comprensibile, in modo che chiunque possa facilmente imparare Lua e utilizzarlo nei propri programmi.
-
-- Licenza: Lua è un software libero e open-source distribuito sotto la licenza MIT. Questo permette a chiunque di utilizzarlo per qualsiasi scopo senza pagare alcuna licenza o royalty.
-
-### Neovim
+### :simple-neovim: Neovim
Neovim è descritto in dettaglio nella sua [pagina dedicata](install_nvim.md), quindi ci limiteremo a soffermarci sulle caratteristiche principali, che sono:
-- Prestazioni: Molto veloce.
-
-- Personalizzabile: Ampio ecosistema di plugin e temi.
-
-- Evidenziazione della sintassi: Integrazione con Treesitter e LSP (richiede alcune configurazioni aggiuntive).
+* Prestazioni: Molto veloce.
+* Personalizzabile: Ampio ecosistema di plugin e temi.
+* Evidenziazione della sintassi: Integrazione con Treesitter e LSP (richiede alcune configurazioni aggiuntive).
+* Multpiattaforma: Linux, Windows e macOS
+* Licenza: Mit: Una licenza permissiva breve e semplice con condizioni che richiedono solo la conservazione del copyright e degli avvisi di licenza.
-- Multipiattaforma: Linux, Windows e macOS
-
-- Licenza: Mit: Una licenza permissiva breve e semplice con condizioni che richiedono solo la conservazione del copyright e degli avvisi di licenza.
-
-### LSP
+### :material-protocol: LSP
Che cos'è il **L**anguage **S**erver **P**rotocol?
@@ -108,19 +95,24 @@ Un server di linguaggio è una libreria di linguaggio standardizzata che utilizz
L'idea alla base del Language Server Protocol (LSP) è quella di standardizzare il protocollo di comunicazione tra strumenti e server, in modo che un singolo server linguistico possa essere riutilizzato in più strumenti di sviluppo. In questo modo, gli sviluppatori possono semplicemente integrare queste librerie nei loro editor e fare riferimento alle infrastrutture linguistiche esistenti, invece di personalizzare il loro codice per includerle.
-### tree-sitter
+### :material-file-document-check-outline: tree-sitter
-[Tree-sitter](https://tree-sitter.github.io/tree-sitter/) è costituito essenzialmente da due componenti: un generatore di parser e una libreria di parsing incrementale. Può costruire un albero sintattico del file sorgente e aggiornarlo in modo efficiente a ogni modifica.
+[Tree-sitter](https://tree-sitter.github.io/tree-sitter/) è costituito essenzialmente da due componenti: un ==generatore di parser== e una ==libreria di parsing incrementale==. Può costruire un albero sintattico del file sorgente e aggiornarlo in modo efficiente a ogni modifica.
Un parser è un componente che scompone i dati in elementi più piccoli per facilitarne la traduzione in un'altra lingua o, come nel nostro caso, per passarli alla libreria di parsing. Una volta scomposto il file sorgente, la libreria di parsing analizza il codice e lo trasforma in un albero sintattico, consentendo di manipolare la struttura del codice in modo più intelligente. In questo modo è possibile migliorare (e velocizzare)
-- evidenziazione della sintassi
-- navigazione del codice
-- refactoring
-- oggetti e movimenti del testo
+* evidenziazione della sintassi
+* navigazione del codice
+* refactoring
+* oggetti e movimenti del testo
-!!! note "LSP e complementarità tree-sitter"
+??? note "LSP e complementarità tree-sitter"
Sebbene possa sembrare che i due servizi (LSP e tree-sitter) siano ridondanti, in realtà sono complementari in quanto LSP lavora a livello di progetto mentre tree-sitter lavora solo sul file sorgente aperto.
-Ora che abbiamo spiegato un po' le tecnologie utilizzate per creare l'IDE, possiamo passare al [software aggiuntivo](additional_software.md) necessario per configurare il nostro NvChad.
+Ora che abbiamo spiegato un po' le tecnologie utilizzate per creare l'IDE, possiamo passare al [software aggiuntivo][] necessario per configurare il nostro NvChad.
+
+[lazy.nvim]: https://github.com/folke/lazy.nvim
+[Mason]: https://github.com/williamboman/mason.nvim
+[Vim]: https://www.vim.org/
+[software aggiuntivo]: additional_software.md
|