Cosh-это конкатенативная оболочка командной строки.
Основные операции оболочки, такие как ls
, ps
, stat
и т. Д., Реализируются как функции, которые возвращают первоклассные значения, в отличие от полагаться на исполняемые файлы, которые возвращают потоки текста. Это облегчает работу с результатами:
Найдите пути файлов, соответствующие строке, и ищите эти файлы для данных
шнур | находить . -iname '*test*' -print0 | Данные xargs -0 grep |
кош | LSR; [тест m] grep; [f <; [Data M] Греп] Карта |
Найдите все процессы, используя более 500 м памяти:
шнур | PS--не головки Aux | awk '$ 6> 500000' |
кош | PS; [mem get; 1000 1000 *; 500 *; >] Греп |
Небольшой набор универсальных примитивов означает, что необходимо запомнить меньше по сравнению с типичными оболочками (например, различные флаги для cut(1)
), хотя в результате некоторые команды могут быть длиннее:
Получите второе и третье столбцы из каждой строки файла CSV:
шнур | Cut -d, -f2,3 Теста -дата/CSV |
кош | Тестовые данные/CSV F <; [Chomp; , расколоть; (1 2) Получить] карту |
Сортировать файлы по времени изменения:
шнур | ls -tr |
кош | LS; [[Стат; mtime get] 2 применить; <=>] Сортп |
Арифметические операторы и функции кодирования/декодирования XML/JSON/YAML/CSV уменьшают количество раз, когда становится необходимым для использования более полнофункционального языка программирования или стороннего исполняемого файла:
Увеличение чисел с плавающей точкой в файле:
шнур | sed 's/$/+10/' Nums | до н.э. |
кош | Nums f <; [Chomp; 10 +] Карта |
Получите первое значение от члена массива "ZXCV" файла JSON:
шнур | JQ .ZXCV [0] TEST-DATA/JSON2 |
кош | ТЕСТ-DATA/JSON2 F <; от JSON; zxcv get; 0 Получить |
Он также интегрируется с внешними исполняемыми вызовами, где это необходимо:
Данные сертификата печати:
избиение | потому что я в `Найти. -iname '*.pem'`; DO OPENSSL X509 -IN $ I -TEXT -NOOUT; сделанный |
кош | LSR; [pem $ m] grep; [{openssl x509 -in {} -Text -noout}] map; |
Смотрите полную документацию для более подробной информации.
Это было протестировано на Linux (Debian 12), но должно работать над любой системой Linux/MacOS/BSD, где может быть построена ржавчина.
make
make test
sudo make install
Помимо исполняемого файла Core cosh
, это также установит скомпилированную библиотеку основных функций ( rt.chc
).
user@host:/$ cosh
/$ hello println;
hello
Каждый пример начинается с каталога клонов репозитория.
Списки файлов в указанном каталоге:
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$
Сортировать файлы в алфавитном порядке в указанном каталоге:
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$
Внешняя команда может быть выполнена, префикс команды с пространством:
cosh$ vim test-data/csv
...
Прочтите файл в память:
cosh$ test-data/csv f<;
v[gen (
0: "1,2,3,4n"
1: "5,6,7,8n"
2: "9,10,11,12n"
)]
cosh$
Для каждой строки файла CSV удалите Newline и разделен на запятые:
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$
Прочитайте файл JSON в память:
cosh$ test-data/json2 f<; from-json;
h(
"asdf": 1
"qwer": 2
"tyui": h(
"asdf": 5
)
"zxcv": (
0: 3
1: 4
)
)
cosh$
Получите имена поля из файла JSON и распечатайте их на стандартный вывод:
cosh$ test-data/json2 f<; from-json; keys; println for;
asdf
qwer
tyui
zxcv
cosh$
Найдите имена поля, которые соответствуют данной режиме:
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$
Определите и используйте новую функцию:
cosh$ : add-5 5 +; ,,
cosh$ (1 2 3) add-5 map;
(
0: 6
1: 7
2: 8
)
cosh$
Захватить значение, используя корпорацию:
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$
Распечатайте время изменения пути в определенном формате:
cosh$ test-data stat; mtime get; from-epoch; %F strftime;
2023-01-20
cosh$
Найдите время пинга для серии доменных имен, параллельно:
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$
Получите общее количество хостов в наборе диапазонов IP -адреса:
cosh$ (1.0.0.0/24 2.0.0.0/14 3.0.0.0/8) [ip; ip.size] map; sum
17039616
cosh$
Создайте новую базу данных SQLite, добавьте таблицу в базу данных и добавьте запись в таблицу:
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$
Документация
Смотрите лицензию.