COSH هو قذيفة سطر أوامر متسلسل.
يتم تنفيذ عمليات shell الأساسية مثل ls
و ps
و stat
وما إلى ذلك كوظائف تعيد قيم الدرجة الأولى ، بدلاً من الاعتماد على المواد التنفيذية التي تُرجع تدفقات النص. هذا يجعل العمل مع النتائج أكثر بساطة:
ابحث عن مسارات الملف التي تطابق سلسلة ، وابحث عن هذه الملفات عن البيانات
ش | يجد . -iname '*test*' -print0 | بيانات XARGS -0 GREP |
ضرب بالعصا | LSR ؛ [اختبار م] grep ؛ [f <؛ [Data M] Grep] خريطة |
ابحث عن جميع العمليات باستخدام أكثر من 500 متر من الذاكرة:
ش | PS-NO-Headers AUX | awk '$ 6> 500000' |
ضرب بالعصا | ملاحظة [MEM GET ؛ 1000 1000 *؛ 500 *؛ >] جريب |
مجموعة صغيرة من البدائية متعددة الاستخدامات تعني أنه يجب تذكر أقل عند مقارنتها بالقذائف النموذجية (انظر على سبيل المثال ، الأعلام المختلفة cut(1)
) ، على الرغم من أن بعض الأوامر قد تكون أطول نتيجة:
احصل على الأعمدة الثانية والثالثة من كل صف من ملف CSV:
ش | CUT -D ، -F2،3 اختبار البيانات/CSV |
ضرب بالعصا | اختبار data/csv f <؛ [Chomp ؛ ، ينقسم؛ (1 2) الحصول على] الخريطة |
فرز الملفات حسب وقت التعديل:
ش | ls -tr |
ضرب بالعصا | LS ؛ [[STAT ؛ MTIME GET] 2 تطبيق ؛ <=>] sortp |
يقوم المشغلون الحسابيون ووظائف تشفير/فك تشفير XML/JSON/YAML/CSV بتقليل عدد المرات التي يصبح من الضروري استخدام لغة برمجة أكثر شهرة أو طرف ثالث قابلة للتنفيذ:
أرقام النقطة العائمة في الملف:
ش | sed 's/$/+10/' nums | قبل الميلاد |
ضرب بالعصا | NUMS F <؛ [Chomp ؛ 10 +] الخريطة |
احصل على القيمة الأولى من عضو مجموعة "ZXCV" في ملف JSON:
ش | JQ .zxcv [0] اختبار data/json2 |
ضرب بالعصا | اختبار data/json2 f <؛ من جون zxcv get ؛ 0 احصل |
يتكامل أيضًا مع المكالمات الخارجية القابلة للتنفيذ ، حيث يكون ذلك ضروريًا:
بيانات شهادة الطباعة:
سحق | لأني في العثور. -iname '*.pem'` ؛ do openssl x509 -in $ i -text -noout ؛ منتهي |
ضرب بالعصا | LSR ؛ [pem $ m] grep ؛ [{openssl x509 -in {} -text -noout}] خريطة ؛ |
انظر الوثائق الكاملة لمزيد من التفاصيل.
تم اختبار هذا على 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 ، قم بإزالة الخط الجديد وانقسام على الفواصل:
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$
ابحث عن أسماء الحقل التي تتطابق مع 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$
تحديد واستخدام وظيفة جديدة:
cosh$ : add-5 5 +; ,,
cosh$ (1 2 3) add-5 map;
(
0: 6
1: 7
2: 8
)
cosh$
التقاط قيمة باستخدام 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$
اطبع وقت تعديل المسار بتنسيق محدد:
cosh$ test-data stat; mtime get; from-epoch; %F strftime;
2023-01-20
cosh$
ابحث عن أوقات ping لسلسلة من أسماء المجال ، بالتوازي:
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$
الوثائق
انظر الترخيص.