Linux学习第二十四篇--连续命令的逻辑,管道符及管道命令

来源:互联网 发布:君の知らない物语 编辑:程序博客网 时间:2024/05/29 03:30

前言

学习linux已经三十四天了(去掉回学校用掉的十天,二十四天),貌似进度有些慢,前面的blog都是基于鸟哥的linux私房菜第三版写的,然后前段时间无意间看到了第四版,于是从上一篇blog开始,学习开始基于第四版了,如果非要说两者最大的区别在哪,第三版是基于centos5版本的,而第四版是基于centos7写的,两个系统之间变更还是很大的.

扯一点题外话,我的本职是一个java码农,如果非要说起自己学习linux的动力,第一点是因为爱好,第二点就是因为工作需要了,在工作时常常会在服务器上排查一些原因,很多问题其实犯得都很低级,比如,之前写过一个接口,接口需要生成一个临时文件,但是我不知道linux系统具体的权限问题,于是很尴尬...

类似这种问题还有很多,于是,便下定决心,要学一下linux,就把linux的学习权重调整到了最高,开始专心的学习linux,怎么说呢,与其说是"学",倒不如说是了解.

毕竟自己还要工作,没有很充裕的时间去学习,去实践,于是往往学了新的知识,就会有一部分知识变得模糊起来,又要复习一遍.所以进度也就一点点慢了下来,当然还有一部分原因是因为自己最开始学习linux的激情慢慢开始退散了...

毛病...三分钟热度啊...当然这些都是题外话,其实针对这种学了新知识忘了旧知识的问题,我也有比较适合自己的方法,就是拿一本同类的书籍看一下.

于是,最近又在看<跟老男孩学linux运维>这本书,怎么说呢,我习惯是将两本书学习时间错开,通常我会在看第一本书三分之一之后,才会再看第二本书,这样有了第一本书的基础,看第二本书进度会比较快一点,而且,还可以拿来同第一本书里的内容比对,增强自己的记忆.

这是目前我找到的比较适合我的方法,也推荐大家可以试一下.

好了,废话说完了,记一下昨天的笔记,对了,我写笔记一般都是先看一遍,然后再根据自己的记忆总结,然后结合书本里的内容记笔记,感觉这样可以再多    复习一遍.

linux连续命令的逻辑

在说linux连续命令之前,要先了解一下linux命令执行的规则.
在shell中,linux自上而下,从左到右依次执行各命令,如果在执行过程中遇到子shell,那么先执行子shell,然后继续执行shell.
在之前的笔记中,记过关于在命令行界面如何依次执行多个命令.
比如:
mkdir panda; ls
通过分号将多个命令分割开来,然后依次执行.
这样,系统就会先创建panda文件夹,然后再执行ls命令.但是这样其实是有一些缺陷的.比如.如果我们此时已经存在了panda目录.

那么,我们如何想要在panda目录存在的情况下就不执行创建目录这个步骤该如何做呢?

这里我们就要使用命令执行的逻辑处理.
我们可以看一下上面这个命令,我们先列出panda这个目录后面跟两个 | ,然后再执行mkdir panda命令.
这两个 | 我们成为或,就是或者的或,与之对应的还有两个&符号,我们称之为与,也可以理解为和.
他们的使用方法如下:

命令1&&命令2如果命令1执行完毕,且正确,那么就执行命令2.
如果命令1执行完毕,但是错误,那么不执行命令2.命令1||命令2如果命令1执行完毕,且正确,那么则不执行2.
如果命令1执行完毕,但是错误,那么执行命令2.
那么,.他们是如何实现的呢,这牵扯到一个概念,叫做命令回传值 ?.
问号是一个特殊的变量,它标志着上一个命令的回传值
如果上一个命令执行的结果是正确的,那么回传值就是0.关于命令回传值,我们可以通过$?来获取.
这样,我们就可以理解为当回传值为0的时候,&&后的命令执行,||后的命令不执行.
这样就比较容易记了.

管道符

在之前的blog中,有使用过一种命令:

当时使用这种命令的原因是如果我们列出的文件太多的话,那么一个屏幕是无法完全展示出来,造成的结果就是我们往往只能看到最后一屏幕的信息,前面我们就没法看到了,但是当我们使用ls |more 的时候,他就会使用more的形式来展开这些文件信息,我们就可以使用more支持的按键操作来操作这些数据了.
但是需要注意的是:
1.管道符后面使用的必须是管道命令.
2.管道命令只能够处理由前一个指令传来的正确信息.
那么什么是管道命令呢?
管道命令,该命令能够接受标准输出的数据.比如,more/less/head/tail之类的.

cut和grep命令

cut命令用于在文件的每一行中提取片段.比较重要一点的选项应该就是b,c,d,f四个了.
b选项用于指定一个区间比如-b 10-100 输出第十到第一百个字节.
c类似于b,但是c输出的是字符.
-d指定分割字符,比如我们使用-d 'A' 那么就会将内容以A为间隔,分割成多段.该选项通常配合-f使用.
-f命令用于指定取出使用-d分割后内容的第几段.
这里有一点需要注意的是,cut命令和grep命令他们针对的数据都是一行一行的.
grep命令用于输出匹配指定格式的那一行数据.他和cut命令有一些不同,cut命令用于处理,而grep则主要是将匹配行输出.
他的常用选项比较多一点.
-a选项,将二进制文件作为文本文件来查找.
-c,计算搜寻到字符串的总次数.
-i,匹配时忽略大小写.
-n,输出行号.
-v,单项选项,即输出非匹配的那些行.
-A 顺便输出后几行
-B顺便输出前几行

排序命令

sort命令用于对文本文件排序他的常用选项
-b,忽略排序字段或关键字中开头的空格.
-c,如果指定文件已排序,则不再排序.
-f,忽略大小写.
-r,反向排序.
个人觉得记住这几个常用的就好了,其他的等用到再查文档就好了.
uniq命令用于删除排序文件中重复的行.记住一个-i忽略大小写就够了,其他的还是用到差文档.
wc命令用于输出文件中的行数(l),单词书(w),字节数(c).

双向重导向

这个命令比较好玩,tee,他的作用是从标准输入写到标准输出和文件里.
我们之前使用数据流重导向的时候,都是将数据导到文件或者标准输出,如果我们需要将数据流同时导入文件和标准输出那就要用到tee命令了.

tee和普通重导向区别如下图:




看一下这个命令:

挺好玩的.

字符处理命令

tr命令用来删除和替换字符.他常用两个选项,-d表示删除 -s表示替换,
col可以将tab转换成对应的空格.通过col -x即可.
join命令,读取两个文件,将相同的行合并成一行显示.
paste命令,和join差不读,他将两个文件的同一行合并成一行,中间以tab分隔开,也可以使用-d 指定分隔符.我觉得这个用来比对文件挺好的.
expand命令和之前说的col差不多,他可以将tab转换成对应的空格数,还可以同-t选项指定一个tab对应几个空格.

分区命令

这个分区命令可不是fdisk命令,他的作用是将文件分割成多个.有什么用处呢,比如fat32文件系统支持的最大单个文件大小是4GB,那如果我们有一个5GB的文件咋办...
这是很正常的一件事,周六的时候,我在家重装系统,没注意做系统盘时候U盘是FAT32格式的,但是我那个系统4GB多一点 ,这就很尴尬了,我又做成NTFS格式的...
这就是一个很常见的问题.
假设我们U盘的文件系统最大只支持4GB,这时候我们要存放一个5GB的文件,难道我们要重新格式化U盘吗?
这时候我们就用到这个分区命令--split.
split命令就是用来分割文件的.他的常用选项也就三个,
第一个是b,通过-b选项我们就可以指定输出文件的大小,比如-b -m.
第二个是c,指定输出的字节数
第三个是l,指定输出的行数.

xargs

这个东西还是比较有意思的,我记得我刚开始学java的时候,有个东西叫main函数,就可以在命令行接受参数,但是这个东西是怎么来的我一直都不知道,或者说,不知道为什么这样做可以,现在学到这终于明白了...吼吼...
xargs - 从标准输入重建并执行命令行
他有不少选项.
比如,
-0,他可以将命令中一些特殊字符作为普通字符处理.
-e可以指定一个字符串,告诉xargs命令到此结束.
-p,执行每一个参数,都会询问一下,
-n 指定命令执行时,使用参数的个数.
最后补充一个好玩的,就是减号 - ,-号表示上一个标准输出...恩,就这样,木有了....这篇blog前前后后用了一个周...也是没谁了...



原创粉丝点击