Silentdoer

导航

nushell总结

在nushell环境,ps是nushell内置的命令,如果要用外部的命令,可以加^来使用,即^ps,其他有冲突的命令也是如此切换

str collect后续会被str join替换

0.单引号类似raw string,所以'aa\nbb'就是会输出六个字符,即\n不会转义;而双引号里面可以有转义字符;

然后单引号和双引号都支持字符串插值,即$'...'和$"...",它们的区别其实就是'..'和".."的区别,如下:

'aa'|$'ff\($in + "4")'
输出:ff\aa4【可以看到$'..'里面的\没有作为转义起始字符,而就是当成一个普通字符\

'aa'|$"ff\($in + "4")"
输出:ff($in + "4")【可以看到$".."里的\当成了转义起始符,所以(不再是表达式的括号,而转义为了一个普通的(字符,因此(右边的“表达式”也就变成了普通字符

还有反引号字符串,这是因为单引号字符串内部没有任何转义,所以如果单引号内部需要有单引号字符就没法做了,这时候就可以用反引号:

`aa'bb`输出aa'bb,反引号也是不支持转义的,它和单引号互补;

还支持^'D:/Apps/Git/custom/bin1/ls.exe -l'来执行一个命令,它类似eval命令可以这么写:'ls -l'|^$in

 

1.["aa\n","bb\n"]输出一个列表,然后每行最后都有换行

2.["aa\n","bb\n"]|str collect其实就是str join功能;

3.netstat -anp是raw input类型,可以用netstat -anp|into string来转换为string类型;

4.["aa\n","bb\n"]|str trim是会将list每个元素都进行trim,但是不会转换(join)为string类型,也不会去掉空元素;
str trim也能对string类型做trim【但是不好的地方是它不能传要trim的参数】
str trim支持trim特定字符,如"aaa,"|str trim -c ","输出aaa

5."aa\nbb\n\n"|lines或split row "\n"将字符串转换为list,但是这个都是会trim掉两边的换行【不知道有没有不trim的】
【提了bug,这个lines可以自动trim,但是split row "\n"不应该】

6.str reverse和str trim一样如果输入是list则每个元素都reverse,但是返回的仍然是之前顺序的list,如果输入是string则将整个string reverse;

7.length是针对list的,所以"aaa"|length是返回1而不是3,要获取"aaa"的长度可以先split chars再length统计;

8.所有的管道符传递的数据都是copy语义的,不会对输入参数造成改变;

9.nushell终端支持上下文,即let kk = "uuu"按回车会到下一行,此时$kk按回车能打印uuu字符串;【所以let Path其实就类似shell里在终端上export kk = 9】
nushell和rust一样,支持对变量重新定义,即可以执行多次let kk = ..

10.str contains "pattern"可以对string和list<string>操作,对于string则是判断这个string是否包含pattern,返回值是bool类型,如果是list<stirng>则是对每个
元素都执行str contains "pattern",返回list<bool>

11.[[1,2,3],[4,5],"ss"]这种多维数组可以通过arr|flatten扁平化为一维数组;

12.nushell支持:[["aa","bb"],"ee"]|describe,返回list<any>,那么就可以实现类似[$"(ls)", $"(netstat -anp)"]|select 1只展示第二个命令【$"(ls)"可以换成(ls),但是输出类型会变成table】

13.ls|$in.name.0可以取出name的值,有cell类型;ls返回的是一个table类型;可以简化为(ls).name.0

14.shell没有void的概念,像echo、表达式之类的,它们都会返回参数本身或者表达式本身;然后就是echo没有$in,它的输入只有“函数参数”一种,因此"aa"|echo $in要这么写

好吧,像linux的ls、ifconfig则返回的值是nothing,类似void的概念;

注意,echo本身不会打印数据(将数据push到控制台),而是会像表达式一样返回出来,由控制台自动打印(类似控制台自动打印表达式的计算值);而print "aa"则会主动打印"aa"并且返回nothing出来;

15.注意,select 0不是说把list的第一个元素取出来作为一个item,select是subList的概念,即select 0仍然是list,只是里面只有之前list的第一个元素

16.只适用于list<table<...>>这种复杂item类型(table在nu看来也是一种特殊的list,因此可以扁平化,但是table也无法继续flatten),但是flatten无法将list<string>转换为string【单个元素】;用arr.0的方式取数组,用tb.column.0取cell,通过describe可以得到item/cell正确的类型;

17.nushell可以处理如string、int、list<any>、table(类似list<map>)、record等等数据类型,而bash则只能处理字符串类型

18."abcde,"|str substring $"0,(($in|split chars|length) - 2)",注意"abce"|($in|xxx)等同于"abce"|$in|xxx

19.table类似list<map>【list<record>】,但不是list;record类型就类似map

20.字符串比较还支持正则匹配和不匹配:

'APL' =~ '^\w{0,3}$'
表示正则匹配,返回true

'FORTRAN' !~ '^\w{0,3}$'
表示正则不匹配,也是返回true

21.["aa", "bb", "cc"]|where {|x, idx| $idx >= 1}可以实现limit 1的效果

22.netstat -anp|lines|where {|r, idx| $idx >= 1}|parse -r '(?<first>.*\b)(?<sss>\d+).*?'|$in.sss可以实现去掉第一行,然后cut出最后一列的功能

这里parse -r '...'里的每个()都是一列(除了特殊的正则描述),然后每列的?<xxx>都是标题,接着是内容的正则匹配pattern;

23.ls ((pwd) + '/nu')支持双括号来计算多层表达式

24.nushell支持list和map【record】的字面量,如[1,3].1输出3,{'a':9}.a输出9;

25.select的"table/list"来源是$in,然后它的参数是"table"的key或者下标【而下标某种意义上也是key】;select支持同时选择列和行:ls | select name size 1,即选出name和size列然后获取第二行,而针对list数据源则只有选择行这一步骤;

26.["aa-bb","cc-dd","ee-ff"]要把它改成table,每个元素是一行,每行又通过-分隔为record,实现整体转换为table(list->table)除了用parse外,即:

["aa-bb","uu-kk","cc-ee"]|each {|row| $row|parse "{col1}-{col2}"|$in.0},还可以用split column实现:

["aa-bb","uu-kk","cc-ee"]|each {|row| $row|split column "-" <col1> <col2>|$in.0};注意这里的<col1>和<col2>可以不写,head就会是column1和column2【最好别写,否则如果少写了会导致只展示一列,不过可以多写,多出的那一列因为没有列数据也不会展示】

27.sys命令好用,可以查看系统各种信息(比如CPU、内存、磁盘)

28.用nups -l | select pid name cwd | where name == "idea64.exe" | $in.cwd.0来得到进程名的程序路径

posted on 2022-12-08 19:58  Silentdoer  阅读(315)  评论(0编辑  收藏  举报