O COSH é um shell de linha de comando concatenativo.
Operações básicas de shell como ls
, ps
, stat
e assim por diante são implementadas como funções que retornam valores de primeira classe, em vez de confiar em executáveis que retornam fluxos de texto. Isso simplifica o trabalho com os resultados:
Encontre os caminhos de arquivo que correspondam a uma string e pesquise esses arquivos para obter dados
sh | encontrar . -iname '*test*' -print0 | Dados Xargs -0 Grep |
cosh | LSR; [teste m] grep; [f <;; [Dados M] Grep] Mapa |
Encontre todos os processos usando mais de 500m de memória:
sh | PS-NO-CABTADORES AUX | Awk '$ 6> 500000' |
cosh | ps; [Mem Get; 1000 1000 *; 500 *; >] Grep |
Um pequeno conjunto de primitivas versáteis significa que menos precisa ser lembrado quando comparado com conchas típicas (veja por exemplo, as várias bandeiras para cut(1)
), embora alguns comandos possam ser mais longos como resultado:
Obtenha a segunda e a terceira colunas de cada linha de um arquivo CSV:
sh | corte -d, -f2,3 test -data/csv |
cosh | teste-data/csv f <; [chomp; , dividir; (1 2) Obtenha] mapa |
Classificar arquivos por tempo de modificação:
sh | LS -TR |
cosh | LS; [[Stat; mtime get] 2 aplicar; <=>] Sortp |
Operadores aritméticos e funções de codificação/decodificação XML/JSON/YAML/CSV reduzem o número de vezes que se torna necessário usar uma linguagem de programação mais completa ou um executável de terceiros:
Incrementar números de ponto flutuante no arquivo:
sh | sed 's/$/+10/' nums | bc |
cosh | Nums f <; [chomp; 10 +] mapa |
Obtenha o primeiro valor do membro da matriz "ZXCV" de um arquivo JSON:
sh | jq .zxcv [0] teste-dados/json2 |
cosh | teste-data/json2 f <; From-Json; zxcv get; 0 Get |
Também se integra a chamadas executáveis externas, onde é necessário:
Imprimir dados de certificado:
Bash | para eu em `encontre. -Iname '*.Pem'; do OpenSSL x509 -in $ i -Text -Noout; feito |
cosh | LSR; [PEM $ M] grep; [{OpenSSL x509 -in {} -text -noout}] map; |
Veja a documentação completa para obter mais detalhes.
Isso foi testado no Linux (Debian 12), mas deve trabalhar em qualquer sistema Linux/MacOS/BSD onde a ferrugem possa ser construída.
make
make test
sudo make install
Além do executável do Core cosh
, isso também instalará uma biblioteca compilada de funções principais ( rt.chc
).
user@host:/$ cosh
/$ hello println;
hello
Cada exemplo começa no diretório do clone do repositório.
Listar arquivos em um diretório 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$
Classifique os arquivos em ordem alfabética em um diretório 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$
Um comando externo pode ser executado prefixando o comando com um espaço:
cosh$ vim test-data/csv
...
Leia um arquivo na memória:
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 linha de um arquivo CSV, remova a nova linha e divida em vírgulas:
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$
Leia um arquivo JSON na memória:
cosh$ test-data/json2 f<; from-json;
h(
"asdf": 1
"qwer": 2
"tyui": h(
"asdf": 5
)
"zxcv": (
0: 3
1: 4
)
)
cosh$
Obtenha os nomes de campo do arquivo JSON e imprima -os na saída padrão:
cosh$ test-data/json2 f<; from-json; keys; println for;
asdf
qwer
tyui
zxcv
cosh$
Encontre os nomes de campo que correspondem a um determinado regex:
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$
Defina e use uma nova função:
cosh$ : add-5 5 +; ,,
cosh$ (1 2 3) add-5 map;
(
0: 6
1: 7
2: 8
)
cosh$
Capture um valor usando um 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 o tempo de modificação de um caminho em um formato específico:
cosh$ test-data stat; mtime get; from-epoch; %F strftime;
2023-01-20
cosh$
Encontre o Ping Times para uma série de nomes de domínio, em 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$
Obtenha o número total de hosts em um conjunto de intervalos de endereço IP:
cosh$ (1.0.0.0/24 2.0.0.0/14 3.0.0.0/8) [ip; ip.size] map; sum
17039616
cosh$
Crie um novo banco de dados SQLite, adicione uma tabela ao banco de dados e adicione um registro à tabela:
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$
Documentação
Consulte a licença.