COSH est un shell de ligne de commande concaténatif.
Les opérations de base de shell comme ls
, ps
, stat
, etc., sont implémentées comme des fonctions qui renvoient les valeurs de première classe, au lieu de s'appuyer sur des exécutables qui renvoient des flux de texte. Cela rend le travail avec les résultats plus simple:
Trouver des chemins de fichier correspondant à une chaîne et recherchez ces fichiers pour les données
shot | trouver . -iname '* test *' -print0 | xargs -0 données grep |
matraque | LSR; [Test M] Grep; [f <; [données m] grep] carte |
Trouvez tous les processus en utilisant plus de 500 m de mémoire:
shot | PS --No-Headers Aux | awk '$ 6> 500000' |
matraque | PS; [mem get; 1000 1000 *; 500 *; >] grep |
Un petit ensemble de primitives polyvalents signifie que moins doit être rappelé par rapport aux coquilles typiques (voir par exemple les différents drapeaux pour cut(1)
), bien que certaines commandes puissent être plus longues en conséquence:
Obtenez les deuxième et troisième colonnes de chaque ligne d'un fichier CSV:
shot | Cut -D, -F2,3 Test-Data / CSV |
matraque | Test-data / csv f <; [chomp; , diviser; (1 2) Obtenez la carte |
Trier les fichiers par temps de modification:
shot | ls -tr |
matraque | LS; [[Stat; mtime get] 2 Appliquer; <=>] Sortp |
Les opérateurs arithmétiques et les fonctions de codage / décodage XML / JSON / YAML / CSV réduisent le nombre de fois où il devient nécessaire d'utiliser un langage de programmation plus complet ou un exécutable tiers:
Incrémentez les numéros de point flottant dans le fichier:
shot | SED 'S / $ / + 10 /' NUMS | Colombie-Britannique |
matraque | nums f <; [chomp; Carte 10 +] |
Obtenez la première valeur du membre du tableau "ZXCV" d'un fichier JSON:
shot | JQ .zxcv [0] Test-Data / JSON2 |
matraque | Test-data / json2 f <; De-JSON; zxcv get; 0 Get |
Il s'intègre également aux appels exécutables externes, où cela est nécessaire:
Imprimer les données du certificat:
frapper | pour moi dans `trouver. -iname '* .pem'`; faire openSSL x509 -in $ i -Text -Noout; fait |
matraque | LSR; [pem $ m] grep; [{OpenSSL X509 -IN {} -Text -Noout}] Map; |
Voir la documentation complète pour plus de détails.
Cela a été testé sur Linux (Debian 12), mais devrait fonctionner sur n'importe quel système Linux / MacOS / BSD où la rouille peut être construite.
make
make test
sudo make install
Outre l'exécutable Core cosh
, cela installera également une bibliothèque compilée des fonctions de base ( rt.chc
).
user@host:/$ cosh
/$ hello println;
hello
Chaque exemple commence à partir du répertoire du clone du référentiel.
Liste des fichiers dans un répertoire spécifié:
cosh$ test-data ls
v[gen (
0: test-data/cert.der
1: test-data/json-bigint
2: test-data/json2
3: test-data/json1
4: test-data/readfile
5: test-data/yaml1.yml
6: test-data/test.ch
7: test-data/csv
8: test-data/split
9: test-data/readlines
)]
cosh$
Trier les fichiers alphabétiquement dans un répertoire spécifié:
cosh$ test-data ls; sort
(
0: test-data/cert.der
1: test-data/csv
2: test-data/json-bigint
3: test-data/json1
4: test-data/json2
5: test-data/readfile
6: test-data/readlines
7: test-data/split
8: test-data/test.ch
9: test-data/yaml1.yml
)
cosh$
Une commande externe peut être exécutée en préfixant la commande avec un espace:
cosh$ vim test-data/csv
...
Lisez un fichier en mémoire:
cosh$ test-data/csv f<;
v[gen (
0: "1,2,3,4n"
1: "5,6,7,8n"
2: "9,10,11,12n"
)]
cosh$
Pour chaque ligne d'un fichier CSV, supprimez la nouvelle ligne et divisez sur des virgules:
cosh$ test-data/csv f<; [chomp; , split] map;
v[gen (
0: (
0: 1
1: 2
2: 3
3: 4
)
1: (
0: 5
1: 6
2: 7
3: 8
)
2: (
0: 9
1: 10
2: 11
3: 12
)
)]
cosh$
Lisez un fichier JSON en mémoire:
cosh$ test-data/json2 f<; from-json;
h(
"asdf": 1
"qwer": 2
"tyui": h(
"asdf": 5
)
"zxcv": (
0: 3
1: 4
)
)
cosh$
Obtenez les noms de champ à partir du fichier JSON et imprimez-les à la sortie standard:
cosh$ test-data/json2 f<; from-json; keys; println for;
asdf
qwer
tyui
zxcv
cosh$
Trouvez les noms de champ qui correspondent à un regex donné:
cosh$ test-data/json2 f<; from-json; keys; [.{4} m] grep;
v[gen (
0: asdf
1: qwer
2: tyui
3: zxcv
)]
cosh$
cosh$ test-data/json2 f<; from-json; keys; [a..f m] grep;
v[gen (
0: asdf
)]
cosh$
Définissez et utilisez une nouvelle fonction:
cosh$ : add-5 5 +; ,,
cosh$ (1 2 3) add-5 map;
(
0: 6
1: 7
2: 8
)
cosh$
Capturez une valeur à l'aide d'un regex:
cosh$ test-data ls;
v[gen (
0: test-data/json-bigint
1: test-data/json2
2: test-data/json1
3: test-data/readfile
4: test-data/csv
5: test-data/split
)]
cosh$ test-data ls; ["/.*" c; shift] map;
v[gen (
0: /json-bigint
1: /json2
2: /json1
3: /readfile
4: /csv
5: /split
)]
cosh$
Imprimez le temps de modification d'un chemin dans un format spécifique:
cosh$ test-data stat; mtime get; from-epoch; %F strftime;
2023-01-20
cosh$
Trouvez les temps de ping pour une série de noms de domaine, en parallèle:
cosh$ (sourcehut.org github.com gitlab.com) [dup; A dig; answer.0.sdata.address get; 1 pingn; 0 get; 2 mlist] pmap;
v[channel-gen (
0: (
0: gitlab.com
1: h(
"icmp_seq": 1
"ttl": 58
"time_ms": 11.6
)
)
1: (
0: github.com
1: h(
"icmp_seq": 1
"ttl": 115
"time_ms": 28.4
)
)
2: (
0: sourcehut.org
1: h(
"icmp_seq": 1
"ttl": 52
"time_ms": 346
)
)
)]
cosh$
Obtenez le nombre total d'hôtes dans un ensemble de plages d'adresses IP:
cosh$ (1.0.0.0/24 2.0.0.0/14 3.0.0.0/8) [ip; ip.size] map; sum
17039616
cosh$
Créez une nouvelle base de données SQLite, ajoutez une table à la base de données et ajoutez un enregistrement au tableau:
cosh$ mydb touch
cosh$ mydb sqlite db.conn; c var; c !
cosh$ c @; "create table test (id, num)" db.prep; () db.exec
()
cosh$ c @; "insert into test values (?, ?)" db.prep; (1 2) db.exec
()
cosh$ c @; "select * from test" db.prep; () db.exec
(
0: h(
"id": 1
"num": 2
)
)
cosh$
Documentation
Voir la licence.