【Linux】shell基础工具

1、sort
1.1原则:
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按照ASCII码值进行比较,最后将他们按升序输出。
这里写图片描述

1.2常见选项:
1.2.1sort的-r选项sort默认的排序方式是升序,如果想改成降序加上-r选项就可
这里写图片描述
1.2.2-u选项,它的作用很简单,即使在输出行中去除重复行
这里写图片描述
1.2.2-n选项,“要以数值来排序”
这里写图片描述
1.2.3 -t选项和-k选项,可以设定间隔符。指定了间隔符之后,就可以用-k来指定列数进行排序
这里写图片描述
指定分隔符,按照第二列整数进行排序
2、uniq
这里写图片描述

2.1常用选项
2.1.1-c:显示输出中,在每行行首加上本行在文件中出现的次数,它可取代-u和-d选项
这里写图片描述
2.1.2-d只显示重复行
这里写图片描述
2.1.3-u只显示文件中不重复的行
这里写图片描述
求file1和file2的交集、并集补集
这里写图片描述
交集:
这里写图片描述
并集:
这里写图片描述
补集:
这里写图片描述
3、paste
3.1、介绍
paste单词的意思是粘贴,该命令用来将多个文件的内容合并。paste将按行将不同文化信息放在一行,缺省情况下,paste连接时,用空格或者tab键分隔新行中不同文本
这里写图片描述
3.2常用选项
3.1.1、-d:指定域·分隔符
这里写图片描述
3.1.2、-s:将每个文件合并成行而不是按行粘贴
这里写图片描述
3.1.3、-:-就是该命令的一个选项。对每一个(-),从标准输入中读入一次数据。默认使用空格或者tab作域分隔符,该选项可以定制输出格式
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
4、cut
cu命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定File参数,cur命令将读取标准输入,必须指定-b,-c或-f标志之一
4.1、常见选项:
4.1.1 -b:以字节为单位进行分隔
这里写图片描述
4.1.2 -c:以字符为单位进行分隔:
这里写图片描述
这样看似乎-b -c并没有什么区别,看看下面的例子
这里写图片描述
用-c则会以字符为单位,输出正常;而-b只会以字节(8位二进制)来计算,输出就是乱码。这里的字符,不是我么c当中的占用一个字节的字符,可以理解为,汉字是有多个字节组成的多字节字符
4.1.3 -d 自定义分隔符
4.1.4 -f 与-d一起使用,指示显示哪个区域
这里写图片描述
5、xargs
xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转化成命令行参数,xargs能够处理管道或者stdin并将其转化cheng特定命令的命令行参数。xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs的默认命令是echo,空格是默认定界符,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代,xargs是构建单行命令的重要组件之一。
5.1、使用
对文件进行格式输出,将文件的多行输入转成单行输出
这里写图片描述
5.2选项
5.2.1 -n选项:指定列数,并多行输出
这里写图片描述
5.2.2 -d选项:自定义一个分隔符,将特定列打散,并指定格式输出
这里写图片描述
5.2.3、将格式化后的字符串作为命令行参数传递给其他命令,组装完成批量任务
这里写图片描述
5.2.4 -I选项:使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,当-l与xargs结合使用,每一个参数命令都会被执行一次
这里写图片描述
这里写图片描述
5.2.5 find,xargs,rm 混合
首先创建一批.bak文件
这里写图片描述
将新建的文件按照xargs的方式删掉
这里写图片描述
关于find命令的print选项,和xargss命令的-0选项
这里写图片描述
各个文件名,不再按照空格等字符作为结束标志,而因为prin0变成以NULL结尾
6、grep
6.1、grep是一款强大的文本过滤工具,按照关键字或者正则表达式进行行过滤
常用选项-
6.1.1-E 扩展
6.1.2-v匹配的行不显示
6.1.3、-q,安静模式,不会将结果显示,可以通过退出吗来看是否匹配成功
6.1.4、-i 忽略大小写
6.1.5、-n:输出匹配行的行号
6.1.6、-o:只输出文件中匹配到的部分
7、sed
7.1、sed是一种流编辑器,它是文本处理中非常常用的工具,能够完美的配合正则表达式使用,功能不同凡响,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着使用sed命令处理缓冲区内容,处理完成后,把缓冲区中的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,Sed主要用来编辑一个或多个文件;简化对文件的反复操作,编辑转换程序等。sed默认按照Basic规范基本匹配。
这里写图片描述

7.2、命令格式
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)
7.3、常见基本使用:
7.3.1、/pattern/p :打印匹配pattern的行
这里写图片描述
使用p命令时需要注意,sed是把处理文件的内容连同处理结果一起输出到标准输出的,因此p命令表示除了把文件内荣打印出来之外还额外打印一遍匹配pattern的行,要想只输出处理结果,应加上-n选项,这种用法相当于grep命令
7.3.2、/pattern/d:删除匹配pattern的行
删除c代码中的所有printf语句
这里写图片描述
注意,sed命令不会修改源文件,删除命令只表示某些行不打印输出,而不是从原文件中删去。如果要影响源文件,需要使用-i选项
这里写图片描述
7.3.3、/pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配的字符串替换为pattern2
使用sed,注释c代码中所有的printf
这里写图片描述
7.3.4、/pattern/s/pattern1/pattern2/g:查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2
这里写图片描述
这里写图片描述
已匹配字符串&,可以表示匹配pattern1之后的所有字符。sed匹配时默认以基准准则匹配
子串匹配标记\1,\2…\n
这里写图片描述
、(…\)用于匹配子串,对于匹配到的第一个子串就标记为\1,依次类推匹配到的第二个结果就是\2,我们通过对标签进行重组,从而完成书记逆置
这里写图片描述
这里写图片描述
sed -n ‘3,5p’ file 打印3-5行的信息(包括3和5)
sed ‘3,5d’ file 删除第3行到第5行
这里写图片描述
退出状态:
sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0,只有当命令存在语法错误时,sed的退出状态才不是0
sed -n ‘/^f/,/^h/p’ file 删除以‘f’开头行和以‘h’开头的行之间的行
sed -n ‘/^f/,15p’ file 删除以‘f’开头的行到第15行的内容
7.3.4、模式空间保持空间
sed在正常情况下,将处理的行读入模式空间,脚本中的“sed-command(sed命令)”就一条接着一条进行处理,知道脚本执行完毕。然后该行被输出,模式被清空;接着,再重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。一般情况下,数据的处理只使用模式空间,按照如上的逻辑即可完成主要任务。但是某些时候,通过使用保持空间,还可以带来意想不到的效果
(1)模式空间:可以想成工程里面的流水线,数据直接在它上面处理
(2)保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。正常情况下,如果不显示使用某些高级命令,保持空间不会使用到
sed高级命令:
(1)g:将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
(2)G:将hold space中的内容append到pattern space\n后
(3)h:将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
(4)H:将pattern space中的内容append到hold space\n后
(5)d: 删除pattern中的所有行,并读入下一新行到pattern中
(6)D: 删除multiline pattern中的第一行,不读入下一行
(7)x:交换保持空间和模式空间的内容
(8)N:将下一行添加到pattern space中
(9)n:读取下一行到pattern space
(10)e:处理多次
7.3.5创建文件:
这里写图片描述
(1)给每行结尾加一行空行
这里写图片描述
(2)用sed模拟出tac的功能(倒序输出)
这里写图片描述

(3)追加匹配到文件结尾
这里写图片描述
(4)-e选项允许在同一行里执行多条命令
行列转化
这里写图片描述
(5)行列转化
这里写图片描述
(6)打印奇偶数行
这里写图片描述
(7)求1-100的求和
这里写图片描述
(8)再求1-100的和
这里写图片描述
:a表示标签a,ba表示跳转到a标签,表示最后一行,!表示不做后续操作,所以,!ba表示最后一行不跳转到a标签,结束此次操作
8、awk
sed以行为单位处理文件,awk比sed强的地方在于不仅能以行为单位还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格或者Tab,但是行分隔符和列分隔符都可以自定义,比如/etc/passwd文件的每一行有若干个字段,字段之间以:分隔,就可以重新定义awk的列分隔符为:并以列为单位处理这个文件。awk实际上是一门很复杂的脚本语言,还有像c语言一样的分支和循环结构,但是基本用法和sed类似,awk命令行的基本形式为:
awk option ‘script’ file1 file2…awk option -f scriptfile file1 file2 …
和sed一样,awk处理的文件既可以由标准输入重定向得到,也可以由当命令行参数传入,编辑命令可以直接当命令行参数传入也可以用 -f参数指定一个脚本文件,编辑命令的格式为:
/pattern/{actions}
condition{actions}
和sed类似,pattern是正则表达式,actions是一系列操作,awk程序一行一行读出待处理文件,如果某一行与pattern匹配或者满足condition条件,则执行相应的actions,如果一条awk命令只有actions部分,则actions作用于待处理文件的每一行
其实awk有三个不同的版本:awk,nawk和gawk,未做特殊说明,一般指gawk,gawk是AWK的GNU版本。
awk其名称来源于三个创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan姓氏的首字母。实际上AWK的确拥有自己的语言:AWK程序设计语言,三位创始者已经将它正式定义为“样式扫描和处理语言”
8.1、print命令
这里写图片描述
此时, 1 2表示指定的域(列)
输出多个域时,print使用,作为分隔符
这里写图片描述
根据条件进行输出
这里写图片描述
8.2、printf
这里写图片描述
printf命令在使用上,几乎和c一模一样
8.3、awk定制输入输出符
awk默认按照空格作为分隔符,如果想定制分隔符,常用的方法是使用-F选项
这里写图片描述
8.3.1-F可以支持多种符号进行定制分隔符
这里写图片描述
8.4、BEGIN&END
BEGIN和END,是awk中两个极具特色的表达式,可以用他们作文本处理之前的准备工作,之后的收尾工作,极具使用价值,基本格式如下:
BEGIN{}/REG/{} END{}
BEGIN{} condition{ } END{}
任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行。因此,通常使用BEGIN之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置变量,使用END来输出最终结果
统计文本中,成绩及格的人数,这里awk中的变量,语法的使用要格外注意。全部类c
这里写图片描述
统计文本中空行的行数
这里写图片描述
8.5、awk脚本
awk除了上面的基本命令行的使用方式之外,还有awk脚本方式,不过基本写法与命令行相同,语法也是基本类c通过awk脚本,统计产品的档次,85分以上,优75-85,良60-75,60分以下差
这里写图片描述
8.6、awk内置变量
上面例子中有一个变量叫FS,这个变量叫做awk的内置变量。常见的内置变量有:
8.6.1、ARGC:命令行参数个数
8.6.2:、ENVIRON:支持队列中系统环境变量的使用
8.6.3、FILENAME:awk浏览的文件名
8.6.4、FNR:浏览文件的记录数
8.6.5、FS:设置输入域分隔符,等价于命令行-F选项
8.6.6、NF:浏览记录的域的个数
8.6.7、NR:已读的记录数
8.6.8、OFS:输出域分隔符
8.6.9、ORS:输出域分隔符
8.6.10、RS:控制记录分隔符
这里写图片描述
其中NF表示最后一个域,(NF-1)表示倒数第二个域,FS定制输入域分隔符,OFS定制输出域分隔符
9、find
Linux下find命令在目录结构中搜索文件,并执行指定的操作,Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有很强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下
find pathname -options [-print -exec -ok …]
用于在文件树中查找文件,并作出相应的处理(可能访问磁盘)
(1)pathman:find明亮所查找的目录路径。例如用。来表示当前目录
(2)-print:find命令将匹配的文件输出到标准输出。其中print0我们之前已经见过面了
(3)-exec:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为‘command’{}\;注意{}和\;之间的空格
(4)-ok:和-exec的作用相同,只不过以一种更安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行
常见选项:
9.1、-name:按照文件名查找文件
9.2、-perm:按照文件权限来查找文件
9.3、-prune:使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略
9.4、-depth:在查找文件时,首先查找目录中的文件,然后再在其子目录中查找
9.5、-user:按照文件属主来查找文件
9.6、-group:按照文件所属的组来查找文件
9.7、-nogroup:查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
9.8、-nouser:查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在
9.9、-newer file1 ! -newer file2:查找更改时间比文件file1新但比文件file2旧的文件
9.10、-type:查找某一类型的文件,诸如
(1)-b:块设备文件
(2)-d:目录
(3)-c:字符设备文件
(4)-p:管道文件
(5)-l:符号链接文件
(6)-f:普通文件
查找系统中所有的test.c文件
这里写图片描述
查找系统指定目录下所有的权限是633的文件
这里写图片描述
查找系统下所有的拥有者是billy的文件
这里写图片描述
查找系统中无属主的文件,即在/etc/passwd中不存在
这里写图片描述
查找更改时间被文件file.old新但是比file.new旧的文件
这里写图片描述
查找系统中所有管道文件
这里写图片描述
查找文件大小是2048个字节的文件
这里写图片描述
查找系统中所有大于2048字节小于4096字节的文件
这里写图片描述
查找系统中所有,大于2048字节小于4096字节的文件,并使用printf输出
这里写图片描述
查找系统中所有,大于2048字节小于4096字节的文件,并使用对符合条件的文件进行ls -l输出

10、几个命令:
10.1、查看电脑信息
这里写图片描述
10.2、查看cpu信息
这里写图片描述
10.3、查看内存信息
这里写图片描述
10.4、查看硬盘信息
这里写图片描述
10.5、查看主板信息
这里写图片描述
10.6、查看内存详细信息
这里写图片描述
10.7、查看内存、进程、负载信息
这里写图片描述
10.8、查看运行时间、负载情况这里写图片描述
11、free
11.1理解free命令
这里写图片描述
11..1.1、第一行可以理解为从操作系统的角度来看内存分配
total:总物理内存大小。
used:已分配的大小,注意,对操作系统来说任何被使用的内存都是used(包括buffers和cached)
free:未被分配的物理内存大小
shared:共享内存大小,用于进程间通信
buffers:主要用于块设备数据缓冲,例如记录文件系统的metadata(目录权限等信息)
cached:主要用于文件内容缓冲
11.1.2第二行(可以理解为从应用程序的角度来看内存分配)
used:303308 =520128(系统默认的used)-25044(buffers)-191776(catched)。站在用户进程角度,你操作系统buffer和cache机制,跟我有什么关系?我真实占用的内存就是那么多,就是所谓的“buffers/cache机制”,
free:占用的少了,free的自然就多了,算法:709044=520128+25044+191776
swap:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有操作的程序,这些被释放的空间被临时保存在Swap空间中,等待被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存在Swap空间中,等到这些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不足,才进行swap交换。需要说明一点,并不是所有从物理内存中交换出来的数据都会会被放到Swap中(如果这样的话,Swap就会不堪重负),有相当一部分数据被直接交换到文件系统。例如,有的程序会打开一些文件,对文件进行读写(其实每个程序都至少要打开一个文件,那就是运行程序本身),当需要将这些程序的内存空间交换出去时,就没有必要将文件部分的数据放到Swap空间中,而可以直接将其放到文件里去。如果是读文件,那么内存数据被直接释放不需要交换出来,因为下次需要时,可直接从文件中恢复,如果是写文件,只需要将变化的数据,保存在文件中,以便恢复。但是那些用malloc和new函数生成的对象的数据则不同,它们需要Swap空间,因为它们在文件系统中没有相应的“储备”文件,因此被称作“匿名内存数据”。这类数据还包括堆栈中的一些状态和变量数据等。所以说,Swap空间是“匿名”数据的交换空间,是不是swap越大越好呢?不是,太大会让操作系统认为自己有很大的swap,从而可能导致一致在执行swap IO,进而影响整机性能,一般设置成内存的1-2倍大小
11.1.3关于cache和bffer
buffer是用于存放要输出到块设备的数据的,而cache是存放从块设备读出的数据的,这二者是为了提高IO性能的,并由OS管理
如果你注意关心过存储系统的话,你会发现硬盘的读写缓冲/缓存名称是不一样的,叫write-buffer和read-cache。很明显的说出了两者的区别(但请注意,并不是说buffer只能用来write,cache只能用来read)
buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及trackingln-fight pages
cached是用来给文件(内容)做缓冲,储存属性信息
而cached直接用来记忆我们打开的文件,比如先后执行两次命令#man X,你就可以明显的感觉到第二次的开大的速度快很多
而buffers随时都在增加,比如先后两次使用ls/dev后,就会发现第二次执行的速度会较第一次快,这就是buffer/cached的区别
12、iostat
12.1、分析io压力
12.1.1、系统出现D状态进程,证明此时有进程因为IO问题而进入“不可中断睡眠状态”,该状态非常危险,处理不当有可能导致主机无响应甚至宕机
12.1.2、系统的Swap分区使用率超过一定的阈值(我们这里假设它是80%),后续有具体问题具体对待,swap被过度使用,此时说明内存已经很紧张,需要不断的换入换出来辗转腾挪对外提供服务,而swap本身是在硬盘上,本身就是IO,所以会有潜在的性能问题
12.1.3、iowait响应时间变久,很好理解,忙了久反应慢了,随即再去检查每块硬盘的util,到达100,报警
12.1.4、要用到的命令ps/iostat,以及/proc/meminfo
12.1.5、ps命令自行搜索,常见选项a(显示现行终端机下的所有程序,包括其他用户的程序)u(以用户为主的格式来显示程序状况)x(显示所有程序,不以终端机来区分o(用户自定义格式)j(作业格式)L(显示LWP)等等,我们使用ps -axo stat
12.2、、iostat命令简介(iostat -x显示的比较详细)
rrqm/s:每秒进行merge的读操作数目,即delta(rmerge)/s
wrqm/s:每秒进行merge的写操作数目,即delta(wmerge)/s
r/s:每秒完成的读I/O设备次数,即delta(rio)/s
w/s:每秒完成的写I/O设备次数,即delta(wio)/s
rsec/s:每秒写扇区次数,即delta(rsect)/s
wsec/s:每秒写扇区次数,即delta(wsect)/s
rkB/s:每秒读k字节数,是resect/s的一半,因为每扇区大小位512字节
wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算)
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即
delta(use)/s/1000 (因为use的单位为毫秒)
正则补充: \s是指空白,包括空格、换行、tab缩进等所有的空白,而\S刚好相反

猜你喜欢

转载自blog.csdn.net/flowing_wind/article/details/80942022
今日推荐