Shell基础(2)——命令、管道、文件

wils
wils

创作者俱乐部成员

说在前面,Shell命令出现更早,所以本该说WPS公式借鉴了命令,但为了方便理解,后面会用命令类比公式,不要在意这些细节😁

安装环境:以后会介绍各种环境,但对于自用,先推荐安装git for windows,git不仅是版本管理工具,还提供一个比较完善的linux环境,安装简单,使用方便,且对于尝试github上的很多好东西,git是必备工具,装一个绝对不亏👍

先介绍命令:简单来说,命令就是公式。公式用来处理表格区域,命令大多用来处理文件,只是命令的写法不使用括号,而是用空格间隔开的参数,如图:

🔔

seq算是最简单的命令,输入seq 5回车,就是生成1到5这样5行文本,空格后面的5就是参数

对于大多数命令,都可以在后面加上--help参数,显示命令的帮助文档,以了解命令的用法

然后介绍管道:简单来说,用管道连接的命令,就是公式的嵌套。前一个命令的运行的结果,会作为下一个命令的输入,如图:

💡

seq 5的结果,会传递给sort -r,而sort -r的意思是把输入倒序输出,所以结果是5到1这5行数字

下面那句,则是把sort --help输出的sort命令的帮助文件,传递给grep命令,grep命令可以理解成公式里的vlookup,它的第一个参数是要搜索的内容,这里是搜索倒序,所以结果是帮助文档里含有倒序的这一行

最后介绍文件:有句话是说linux的一切都是文件,无论硬件资源还是网络接口都是文件,所以大多数命令都是用来处理文件的,可以类比于大多数公式用来处理表格区域。

管道里传递的也是文件,类似于嵌套的公式里传递的数组。命令结束后,结果一般会输出到屏幕上,如果要写入文件,可以用tee命令或者使用重定向,重定向的写法更常见,如图:

👋

大于号在这里表示把管道里的内容(这里是stdout)写入文件a.txt

cat用来从文件里读取内容

这里需要注意,文件不是其他编程语言里的字符串,而更接近二进制数据这个意思

关于文件,需要了解以下这些命令:

file命令,用来猜文件的格式,不像windows里通过后缀判断文件类型,file是通过分析文件的内容,来判断文件的类型,如图:

🔔

file判断出a、b、c三个文件分别是utf8、ansi、utf8BOM编码,后面是gif、jpg文件

iconv命令,用来转字符编码,比如gbk转utf-8时没啥问题,但反过来,有时候utf-8字符没有对应的gbk,可以通过参数跳过或替换这些字符,如图:

🔔

首先用file判断a.txt是utf-8编码,然后用iconv,-f指定来源编码,-t指定目标编码,输出到b.txt,最后判断b.txt,发现类型是ansi

unix2dos、dos2unix命令,用来改变换行符,比如windows里默认的换行符是CRLF,linux默认是LF,如图,记事本右下角可以看到不同

📌

通过unix2dos b.txt,将b.txt里原本使用的LF换行符转换为CRLF

上面通过搜索unix2dos的帮助,可以看到,这个命令有添加、删除、保持文件BOM的选项,可以解决很多csv文件因为BOM导致无法导入系统的问题

论坛里曾有人问过,如果有很多csv文件是utf8编码的,需要批量转换为gbk编码,怎么办?

类比于我们用公式解决问题,很自然的想到,可以先列出所有csv,然后把这个文件列表当成参数传递给上面的iconv命令转编码。是的,管道的魅力就在这里,把很多命令用管道连起来,数据在管道中流过,生成最终的结果。

可行的写法有很多,比如:

  1. 典型的表格思维,每行一个文件名列出所有文件,把每一行修改成命令,把这么多条命令统统传递给shell执行,如图:

👋

ls -1 *.csv命令,以每行一个文件名的形式列出所有csv文件

sed命令,逐行处理管道中的文件,参数s/x/y/是指对每一行正则替换x为y,类比regepx公式,x中.*表示这一行文件名,y中&表示整个正则匹配到的内容,也就是文件名

ls命令管道给sed命令的结果,是用文件名构造出来的iconv转码命令

这只是文本,还没有执行,所以在检查之后,只需再管道传递给shell本身,也就是sh命令,就可以执行批量转码

  1. 使用xargs命令管理参数的传递,通过xargs命令,可以管理每次传递几个什么样的参数给后面的命令,所以可以这样写:

🔔

ls *.csv命令,列出所有csv文件

xargs -i命令,每次取出前面传递过来的内容,用{}指代这个内容,构造后面命令的参数

echo命令,把参数输出到屏幕,这里用来检查一下构造的对不对

sh -c命令,执行参数里的命令

所以上面这句的意思是,ls列出所有csv文件,xargs每次取出一个文件名,构造一个iconv转码的命令,当成参数传递给shell执行,也就是执行了批量转码

  1. 使用find的参数-exec执行命令,ls命令比较简陋,find命令可以更好的找到所有子文件夹里符合筛选条件的文件,其-exec可以直接构造命令处理找到的每一个文件,如图:

💡

find命令可以根据文件名、类型、时间等条件筛选出指定的文件,然后在-exec参数里构造一句iconv转码命令,同样用{}指代每一个文件名,执行批量转码

  1. 使用for循环所有文件,执行命令

📌

*.csv在shell里会自动展开成文件名的列表,所以可以用for循环,变量i指代每一个文件名

do和done之间是循环执行的语句,可以用echo输出每个文件名,也可以用iconv执行转码

今天介绍了shell脚本最基础的一些用法,类比于wps里用来处理表格的公式,命令是用来处理文件的,简单的命令可以填补wps在操作外部文件上确少的一些功能。用管道将命令连接起来,则像嵌套的公式一样可以完成更复杂的任务。尤其是在批量处理大量、超大文本时,脚本可以用更少的代码、更快的完成任务。

ps. 问ai可以快速生成linux命令了,支持国产linux系统的推广!

广东省
浏览 770
收藏
4
分享
4 +1
4
+1
全部评论 4
 
方盛
方盛

创作者俱乐部成员

专业
· 湖北省
回复
 
howard
打卡
· 云南省
回复
 
清华学弟任泽岩
清华学弟任泽岩

创作者俱乐部成员

太专业了,抠底层逻辑的都是大佬。
· 辽宁省
回复
 
Boyuan
对比表格科普shell命令, 有创意, 辛苦了.
· 河南省
回复