# les traitements de donnée en ligne de commande

![tag](shell)
![category](developpement)

Il m'arrive souvent de traiter des données directement en ligne de commande ... souvent je pourrais écrire un programme qui le fait, mais pourquoi écrire quelques choses quand des outils existent déjà.

## cat

affiche le contenu d'un fichier 

> cat tutu.txt

## sort

permet de trier les élements d'entrée

par exemple trier les utilisateurs d'un systeme linux

> cat /etc/password | sort

## uniq

permet de supprimer les doublons ... par contre il ne supprime que les doublons adjacent, il faut donc souvent d'abord trier sa sorti puis supprimer les doublons

> cat /etc/password | sort | uniq

il y a aussi des paramètres qui permettent de faire des choses très rapidement

| Commande       | Rôle                                 |
| -------------- | ------------------------------------ |
| `uniq`         | retire les doublons adjacents        |
| `uniq -c`      | compte les occurrences               |
| `uniq -d`      | affiche seulement les doublons       |
| `uniq -u`      | affiche seulement les lignes uniques |


## awk

Il permet de découper un fichier en ligne/colonne et de les manipuler

| Variable | Signification      |
| -------- | ------------------ |
| `$1`     | première colonne   |
| `$2`     | deuxième colonne   |
| `$0`     | ligne entière      |
| `NF`     | nombre de colonnes |
| `NR`     | numéro de ligne    |


Par defaut le séparateur de champs est l'espace mais on peut lui en préciser un autre

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

ce qui est sympa avec *awk* est qu'on peut traiter la donner .. par exemple d'afficher que si une colonne est supérieur à 10

> ps aux | awk '$3 > 10 {print $11, $3}'

on faire des sommes

> awk '{sum += $2} END {print sum}'

donc on peut faire des contrôles très facilement

## jq

jq permet de traiter des fichiers json 

On peut ainsi afficher toutes les valeurs d'un attribut

> cat data.json | jq '.nom'

ou d'un path complet

> jq '.user.id' fichier.json

on peut aussi filter les données

> jq '.users[] | select(.age > 18)' fichier.json

ou bien juste formatter une sortie

> cat brut.json | jq

## csvkit

Il s'agit d'une suite d'outil python qui permet de manipuler des fichiers csv

son installation

> pip install csvkit

On peut extraire des colonnes

> csvcut -c nom,age fichier.csv

le plus interessant pour moi est qu'on peut utiliser du sql

> csvsql --query "select nom, age from fichier where age > 30" fichier.csv

## grep

permet de filtrer des éléments sur une valeur textuel

> ps aux | grep firefox

c'est aussi un outil puissant pour chercher dans un repertoire

> grep -r "mot" repertoire/

si on veut ignorer la casse

> grep -ri "mot" repertoire/

si on ne veut affichier que le nom du fichier

> grep -ril "mot" repertoire/


n 

