Cosh es un shell de línea de comandos concatenativo.
Las operaciones básicas de shell como ls
, ps
, stat
, etc., se implementan como funciones que devuelven los valores de primera clase, en lugar de confiar en ejecutables que devuelven los flujos de texto. Esto hace que trabajar con los resultados sea más simple:
Buscar rutas de archivos que coincidan con datos y busque datos en esos archivos
mierda | encontrar . -iname '*test*' -print0 | XARGS -0 Datos GREP |
aporrear | LSR; [Prueba M] Grep; [f <; [Datos M] Grep] Mapa |
Encuentre todos los procesos utilizando más de 500 m de memoria:
mierda | ps--no-headers aux | AWK '$ 6> 500000' |
aporrear | PD; [Mem Get; 1000 1000 *; 500 *; >] Grep |
Un pequeño conjunto de primitivas versátiles significa que se debe recordar menos en comparación con los capas típicas (ver las diversas banderas para cut(1)
), aunque algunos comandos pueden ser más largos como resultado:
Obtenga la segunda y tercera columnas de cada fila de un archivo CSV:
mierda | CUT -D, -F2,3 Test -Data/CSV |
aporrear | Data de prueba/CSV F <; [Chomp; , dividir; (1 2) Obtener] mapa |
Ordenar archivos por tiempo de modificación:
mierda | LS -TR |
aporrear | ls; [[STAT; mtime get] 2 aplicar; <=>] sortp |
Los operadores aritméticos y las funciones de codificación/decodificación XML/JSON/YAML/CSV reducen el número de veces que es necesario usar un lenguaje de programación más completo o un ejecutable de terceros:
Incremento de números de punto flotante en el archivo:
mierda | Sed 'S/$/+10/' NUMS | antes de Cristo |
aporrear | nums f <; [Chomp; 10 +] Mapa |
Obtenga el primer valor del miembro de la matriz "ZXCV" de un archivo JSON:
mierda | JQ .ZXCV [0] Test-Data/JSON2 |
aporrear | Data de prueba/JSON2 F <; de json; ZXCV Get; 0 consigue |
También se integra con llamadas ejecutables externas, donde eso es necesario:
Imprimir datos del certificado:
intento | Porque yo en `encontrar. -iname '*.pem'`; do openssl x509 -in $ i -Text -noout; hecho |
aporrear | LSR; [Pem $ m] Grep; [{OpenSSL x509 -in {} -Text -NOOUT}] MAP; |
Vea la documentación completa para obtener más detalles.
Esto se ha probado en Linux (Debian 12), pero debería funcionar en cualquier sistema Linux/MacOS/BSD donde se pueda construir óxido.
make
make test
sudo make install
Además del ejecutable de cosh
, esto también instalará una biblioteca compilada de funciones principales ( rt.chc
).
user@host:/$ cosh
/$ hello println;
hello
Cada ejemplo comienza desde el directorio de clonos del repositorio.
Lista de archivos en un directorio especificado:
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$
Ordenar archivos alfabéticamente en un directorio especificado:
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$
Se puede ejecutar un comando externo prefijando el comando con un espacio:
cosh$ vim test-data/csv
...
Lea un archivo en la memoria:
cosh$ test-data/csv f<;
v[gen (
0: "1,2,3,4n"
1: "5,6,7,8n"
2: "9,10,11,12n"
)]
cosh$
Para cada línea de un archivo CSV, elimine la nueva línea y diviértase en comas:
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$
Lea un archivo JSON en la memoria:
cosh$ test-data/json2 f<; from-json;
h(
"asdf": 1
"qwer": 2
"tyui": h(
"asdf": 5
)
"zxcv": (
0: 3
1: 4
)
)
cosh$
Obtenga los nombres de campo del archivo JSON e imprima en salida estándar:
cosh$ test-data/json2 f<; from-json; keys; println for;
asdf
qwer
tyui
zxcv
cosh$
Encuentre los nombres de campo que coinciden con una regex dada:
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$
Definir y usar una nueva función:
cosh$ : add-5 5 +; ,,
cosh$ (1 2 3) add-5 map;
(
0: 6
1: 7
2: 8
)
cosh$
Capture un valor utilizando una 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$
Imprima el tiempo de modificación de una ruta en un formato específico:
cosh$ test-data stat; mtime get; from-epoch; %F strftime;
2023-01-20
cosh$
Encuentre los tiempos de ping para una serie de nombres de dominio, en paralelo:
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$
Obtenga el número total de hosts en un conjunto de rangos de dirección IP:
cosh$ (1.0.0.0/24 2.0.0.0/14 3.0.0.0/8) [ip; ip.size] map; sum
17039616
cosh$
Cree una nueva base de datos SQLite, agregue una tabla a la base de datos y agregue un registro a la tabla:
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$
Documentación
Ver licencia.