先说一个shell,啥是shell,shell其实就是操作系统的人机接口。人类通过shell和机算计沟通,告诉计算机想干什么。计算通过shell告诉人类结果是什么。

常见的shell有:sh、csh、ksh、bash、zsh、dash。我们一般常用的是bash

使用命令查看我们安装了哪些shell




redies 删除key 通配符_标准输入


查看当前使用的shell


redies 删除key 通配符_redies 删除key 通配符_02


修改登陆shell可以使用命令


chsh   -s   /bin/zsh


这样就登陆shell换成了zsh。Chsh -s的原理是修改了/etc/passwd文件中我们所登陆的用户对应那行最后一的shell配置。


redies 删除key 通配符_标准输入_03


Shell变量可以分为环境变量和自定义变量,区别是环境变量可以在其进程的子进程中继续有效。

变量在定义的时候不用加$,引用的时候要加$


redies 删除key 通配符_标准输入_04


使用export会把自定义变量导出为环境变量。

env和export命令显示的是环境变量。

set和declare命令显示是环境变量和自定义变量。

最常用的变量PATH

把路径加到PATH中:


export  PATH=$PATH:/kali/kali_tools


其它常用变量


变量                  说明
EDITOR                默认文本编辑器
SHELL                 默认shell
HOME                  用户主目录
LANG                  定义了本机语言字符集和排序规则(LANG=en可发切换为英文)
OLD_PWD               先前的工作目录
TZ                    本机所处的时区
USER                  用户名
PS1                   提示符字符串1


先说一下shell的通配符和常用字符集

通配符


字符                    匹配项
*                       匹配任意多个字符(包括0个)
?                       匹配任意单个字符(不包括1个)
[characters]            匹配任意一个属于字符范围中的字符
[!characters]           匹配任意一个不属于字符范围中的字符
[[:class:]]             匹配任意一个属于指定字符集中的字符


常用字符集


字符集                匹配项
[:alnum:]             匹配任意一个字母或数字
[:alpha:]             匹配任意一个字母
[:digit:]             匹配任意一个数字
[:lower:]             匹配任意一个小写字母
[:upper:]             匹配任意一个大写字母
[:graph:]             匹配图形字符
[:print:]             匹配可打印字符
[:punct:]             匹配标点符号
[:space:]             匹配空白字符
[:xdigit:]            匹配十六进制字符
[:cntrl:]             匹配控制字符


举例


g*                      以g开头的
b*.txt                  以b开头,中间任意多个字符,并以.txt结尾
Da???                   以Da开头,后面跟3个任意字符的
[abc]*                  以a、b、c其中的任意一个开头的
[!abc]*                 不以a、b、c其中的任意一个开头的
[[:upper:]]*            以大写字母开头的
*[[:lower:]123]         以小写字母或者1、2、3中的任意一个结尾的


xargs命令

xargs是excute argument的缩写,它的作用是从标准输入中读取内容,并将此内容重新格式化,然后传递给它要协助的命令,作为那个命令的参数执行。

说xargs之前,我们要先说一下管道的问题。

管道的作用就是把前面的标准输出作为后面命令的标准输入,比如:


redies 删除key 通配符_redies 删除key 通配符_05


通过管道传递,我们看到cat命令只是显示了ABC.txt这几个字符,而并不是显示的ABC.txt这个文件的内容。

这就引出了程序的编程方式的问题。很多的命令行程序,他们有的只能接受命令行参数,有的只能接受标准输入(比如echo),有的即能接受标准输入,也能接受命令行参数。但是从不同的渠道接受到的输入怎么处理就因程序而异了。完全取决于程序的编程方式。

标准输入就是编程语言中诸如scanf或者readline这种命令;而参数是指程序的main函数传入的args字符数组。管道符|和重定向符<>是将数据作为程序的标准输入,而$(cmd)是读取cmd命令输出的数据作为参数。反引号内的命令结果也做为参数。

输入重定向就是说,程序想读取数据的时候就会去 files[0] 读取,所以我们只要把 files[0] 指向一个文件,那么程序就会从这个文件中读取数据,而不是从键盘。同理,输出重定向就是把files[1]指向一个文件,那么程序的输出就不会写入到显示器,而是写入到这个文件中。管道符其实就是把一个进程的输出流和另一个进程的输入流接起一条“管道”,数据就在其中传递。

这样我们就理解了上图中cat命令的结果,cat如果带参数,那它会把参数代表的文件内的内容显示。如果cat是从标准输入中得到显示的内容,那cat会把标准输入中的内容直接显示出来。

说回xargs,xargs就是把前面命令的标准输出转换为后面命令的参数,而不是做为后面命令的标准输入。比如


redies 删除key 通配符_redies 删除key 通配符_06


上图中可以看到,xargs接收到标准输入,转换成cat的参数了。

在格式化方面,xargs默认会把收到的输入中的换行符、连续空格、制表符替换成单空格做为分隔符。

xargs的-0选项可以将分隔符从默认的空格变成NULL(也就是0),还会将单引号、双引号、反斜线等都当做是普通字符。当然我们可以使用-d选项指定其它的符号为分隔符,但是要格外慎重一些,避免与目标中含有的符号一样,造成误分隔。

再说几个小技巧

xargs的-n选项,比如-n 3 选项会把格式化好的参数每次3个传递给后面的命令来执行,这个过程中xargs会调用后面的命令多次。

xargs的-I选项,一图胜千言


redies 删除key 通配符_标准输入_07


-I 选项也会执行命令多次,并且把参数插到对应的位置。{}就是占位符,每次占一个位置,对比-n选项,后面的cat可以带选项。

-E 选项,遇到指定的参数时会截断。-E ‘aaa’会截掉aaa之后的参数。

time命令

time命令是用来测量Linux程序的执行时间的。


redies 删除key 通配符_redies 删除key 通配符_08


real:从ls执行到退出消耗的总时间(包括内核态代码执行时间+用户态代码执行时间+ls进程阻塞时间+中间其它进程的时间)。

  • user:ls用户态代码所消耗的时间。
  • sys:ls内核态代码一所消耗的时间。

多核的情况下real会小于user+sys,单核的情况下real会大于user+sys。

这个time命令是bash的内置命令。还有一个time命令是独立软件。不要混了。

file命令

file命令可以识别出文件的类型和编码格式

  • -i 选项可以附加输出文件的MIME类型
  • -F 选项可以指定输出字段的分隔符号

file命令查看软链接文件时输出的是软链接本身的信息,加-L选项后可以查看实际文件的信息。

  • -f 选项可以从清单中读取大量的文件名批量工作
  • -z 选项可以查看gzip压缩的文件内部的文件信息

ln命令

要说ln命令先得讲一下软件链接和硬链接

软件链接:类似于快捷方式,删除了软链接不会删出除源文件。
硬链接:拥有自己的inode节点,指向源文件的数据块。每新一建个硬链接源文件的数据块的引用计数会加1。删除硬链接时会对源文件数据块的引用计数减1,当引用计数减为0时系统才会真正清除此文件的数据。硬链接不能跨分区,也不能跨文件系统来建立。

ln默认是建立硬链接。使用-s选项可以建立软链接。

使用命令ln -s 源文件或目录 链接名称 来建立软链接

对于硬链接,不允许普通用户对目录建立硬链接。因为目录内可能会有别的硬链接,万一这个链中出现环的话遍历目录的时候就可能陷入无限循环。我们用ls -l命令可以看到目录的的链接数至少是2,说明系统中存在很多目录的硬链接,并且ln的-d选项就是root专门用来对目录建立硬链接。这个主要是因为我们说的不能建立目录的硬链接主要是操作系统的一个硬性规定,不是技术上不能实现。能建立是能建立,不能瞎见。万一出现循环,处理起来很头大。软链接不会出现循环,因为系统能够区分软链接,它有自己的inode节点。

ls的-i选项可以显示软链接的指向,便于查看。

最后再说一下ln命令的一个小问题

ln命令有个-n选项,官方解释是:把一个目录的软链接文件当成一个普通文件。意思就是对于源目录A,它有一个软链接P,P本来指向目录A的,现在我想让P指向另一个目录B,如我用ln -s P B命令对P进行重新指向是不能成功的。也就是说直接改指向是不行的,改不了,这个命令的结果是会在目录A里新建了一个指向的B的软链接。我们要想改P的指向必须使用ln -snf P B命令。f的意思是强制。

find命令

find命令来源于findutils软件包,这个软件包里还有其它三个有名的命令

  • xargs:由于来源于同一软件包,它和find的配合非常对口。
  • locate:用于根据文件名数据库快速定位文件。
  • updatedb:用于更新文件名数据库。

这里主要讲find命令,命令格式:find 路径 -选项(路径可以是多个,由空格分隔,选项可也是多个代表多个条件,文件名支持正则表达式)。

find a b c -name|regex|perm|mmin|size 命令会从abc三个文件夹和它们的子文件夹中递归搜索满足后面指定条件的文件。如果没有b目录,它会报错说明b目录不存在,然后继续搜索往后搜索c目录。

find默认是递归查找的,它会一级一级的子目录去搜索,可以使用-maxdepth选项指定查找深度,例如-maxdepth 1会只搜索当前文件夹内的内容,不会深入到子目录中,约等于关闭了递归查找。

在linux中,一切皆文件。所以你可以搜索任何东西,像普通文件、目录、链接、管道、设备等等都可以。

-type选项用来指定要搜索的文件类型


d:文件夹
f:普通文件
l:软链接文件
b:块设备
c:字符设备
p:管道文件
s:sock套接字


  • -name选项用来指定文件名称,可以使用shell能配符,例如-name “*.txt”
  • -regex选项用来使用正则表达式来对名字进行匹配,例如-regex ‘.*/e.*avi.*[0-9]+$’
  • -user和-group用来筛选文件所属的用户和组
  • -perm选项用来筛选权限,例如-perm 664、
  • -size选项用来筛选文件大小,-size +10M是指大于10M,-10M指小于10M,10M不加符号代表等于10M

最后我们说一下按时间来搜索文件的方法,这个稍微复杂一些


-mmin:限制文件被修改的时间范围。+5代表5分钟以前被修改过。-5代表5分钟内初修改。
-cmin:限制文件状态改变的时间范围。+5和-5同上所述。
-amin:限制文件被访问的时间范围。
-mtime:同mmin,时间单位由分钟变成天。
-ctime:同cmin,时间单位由分钟变成天。
-atime:同amin,时间单位由分钟变成天。
-newer aa.txt:修改时间比aa.txt文件的修改时间近的。
-anewer aa.txt:访问时间比aa.txt文件的访问时间近的。
-cnewer aa.txt:状态变化时间比aa.txt文件的状态变化时间近的。


还有一个更牛逼的

-newer[a|B|c|m|t]:用两种指定的时间做比较,其中:


a:访问时间
B:诞生时间(只有BSD系统有)
c:状态变化时间
m:修改时间
t:指定具体时间值


举例:


-neweram  aa.txt:筛选访问时间比aa.txt文件的修改时间新的文件。
-newerma  aa.txt:筛选修改时间比aa.txt文件的访问时间新的文件。
-newermt  2020-2-21:筛选修改时间比2020-2-21新的文件。指定的时间格式可以精确到秒,比如”2020-2-21 22:50:22”。


在find的查找条件中,他们默认是与的关系,各个条件是用and连接的。find的逻辑运算符有三个:


-a:与(默认运算方式),比如-type f -name “*.txt”实际上就是:-type f -a -name “*.txt”
-o:或,例如-type f -o -name “*.txt”将筛选是普通文件或者名字是.txt结尾的文件
!:非,这个是单目运算符,把一个表达式取反。例如-type f -o !-name “*.txt” 将筛选是普通文件或者名字不是.txt结尾的文件。


使用小括号可以提高一个表达式的优先级,例如:(-type f -o !-name “*.txt” ) -o (-type f -o -user kali ),要使用小括号的时候一定要用转义,不然的话shell会把括号提前解析处理了,传不到find命令中。

最后说一个find命令的后处理选项-exec

-exec选项实际上是一个类似xargs的处理管道。例如下面的命令:


find  .  -name  “*.txt”  -exec  ls  -h  {}  ;


-exec选项会把搜索到的每个符合条件的文件传递给后面的ls命令。填充到{}占位符的位置。

在-exec用法中,分号(;)代表要传递的结果的目标命令(ls)结束,它是-exec选项的一部分,不是find命令的部分,为了防止分号在传给find之前被shell解析了,我们在分号前加个转义一下。

du命令

du全称是disk usage,它会显示磁盘的使用情况。du与df是兄弟,du显示文件夹和文件的占用空间大小,df显示磁盘分区的使用大小。ls显示的是文件的实际大小(和占用空间大小不一样)。

du默认只输出文件夹的空间使用量,不会关注单个文件,要想包括单个文件的大小信息可以指定文件名或者使用-a选项:


redies 删除key 通配符_标准输入_09


-a  会把隐藏文件也显示出来。可以加上—exclude=”*/.*”来排除隐藏文件。
-h  选项用来以友好方式(带合适单位)显示大小,-c选项用来统计总量,如下所示


redies 删除key 通配符_redies 删除key 通配符_10


关于du有一点要注意,使用ls查看稀疏文件(sparse file)时文件的大小会显示很大,但是使用du去查看文件的占用空间时会发现文件实际占用的空间很小。

gzip命令

gzip是用来压缩文件的命令,它只能压缩普通文件,不支持压缩文件夹、符号链接等类型的文件。所以gzip一次只能压缩一个文件。

举例:


gzip aa.txt:压缩aa.txt文件,会生成aa.txt.gz文件,并且删除源文件aa.txt。加-c选项可以保留aa.txt源文件。
gzip -d aa.txt.gz:解压aa.txt.gz文件,并且删除aa.txt.gz源文件。
gzip -1 aa.txt:以级别1压缩aa.txt文件,一共1-9个级别,级别越高压缩强度越大,速度越慢。默认级别是6。


bzip2命令

bzip2命令也是压缩文件的命令,相比于gzip,bzip2的稳定性和效果要好。

举例:


bzip2  aa.txt:压缩aa.txt文件,会生成aa.txt.bz2文件,并且删除源文件aa.txt。
bzip -d aa.txt.bz2:解压aa.txt.bz2文件,并且删除aa.txt.bz2源文件。


tar命令

由于压缩命令一次只能压缩一个文件,且在不能压缩文件夹,所以我们需要一个打包工具,把要压缩的所有文件打包好后再压缩,这个命令就是tar。它可以一次性完成打包和压缩。

举例:


tar -czvf aa.txt bb.txt mulu:把aa.txt、bb.txt和目录mulu打包到一起并用gzip算法压缩。其中
#-c:打包;-z:用gzip压缩;-v:显示过程的详细信息;-f:指定在打包的文件(放最后)
tar -cjvf aa.txt bb.txt mulu:同上,只不过是使用bzip2压缩打包后的文件。
tar -xzvf aa.tar.gz:解压已经打包好的压缩文件aa.tar.gz,压缩时算法是gzip。
tar -xjvf aa.tar.bz2:解压已经打包好的压缩文件aa.tar.bz2,压缩时算法是bzip2。
tar -tzvf aa.tar.gz:把x选项换成t是指不解包,只是看看包里有什么文件。
我们可以不加任何解压参数,tat会自动识别压缩方式,直接用tar -xvf即可


zip命令

zip命令可以压缩文件夹,而且压缩完后不会删除源文件。对应的解压命令是unzip


-r 选项用来递归压缩文件夹里有文件
-v 选项可以用来不解压只查看压缩文件里的文件
-t 选项可以用来测试压缩文件的完整性


zip a.zip -d b.txt可以在不解压的情况下删除压缩文件中的b.txt文件。

unzip -d cc/ dd.zip可以把dd.zip解压到指定目录cc中。

dd命令

dd命令用于读取标准输入、设备或文件中的内容,原封不去的写到别的地方。

举例:


dd if=/dev/sdc of=/home/kali/sdc.img:备份硬盘sdc到sda.img文件
dd if=/home/kali/sdc.img of=/dev/sdc:恢复备份sdc.img到sda盘
dd if=/dev/sdb of=/dev/sdc:磁盘对拷
dd if=/dev/fd0 of=/home/kali/fd0.img count=1 bs=1440k这条命令多了两个选项count和bs,其中:


bs用来指定单次读入和单次写出的数据块(block)大小,可是C(字节1B)、W(2B)、K、M、G默认512字节。也可以使用ibs和obs来分别指定单次读入和写出的大小。
count用来指定读写的次数。它和bs一起决定了要读出和写入的数据大小,比如上例中就代表每次读写1440K数据,只读写一次即可。

不加if=的话是从标准输入读取,不加of=的话是输出到标准输出。

grep命令

grep命令用来进行文本搜索,grep默认只支持基本的正则表达式,加-E后支持扩展的正则表达式。加-F后是fast模式,不支持任何正则表达式,可以屏蔽掉正则表达式元字符。

grep查找是以行为单位,结果显示也是以行为单位输出。grep支持多文件查找。

举例:


grep  --color  "kali"  /etc/passwd,从passwd文件中查找含有kali的行,并高亮kali字符串。
grep  -v kali  /etc/passwd,从passwd文件中查找不含kali的行,-v是取反操作。


-n选项会在结果中显示行号,-c选项会只显示统计有多少满足条件的行,不显示行内容。

grep默认会对搜索的内容区分大小写,使用-i选项可以不区分大小写。

-A,-B,-C三个选项用来显示除了符合条件的行以外,额外显示此行前面、后面、前后各多少行。比如-A 2是指额外显示符合条件的行和它前面2行。

在做多文件查找时,有时只想显示哪些文件包含要搜索的字符串而不需要知道具体的内容和行是多少,此时我们可以使用-l选项。取反的话可以用-lv或者直接用-L。

grep支持正则表达式,这是grep的主要用途,关于正则表达式因为内容太多,不做细说了,这里只说一下基本正则表达式和扩展正则表达式的区别。

这两者的区别主要是元字符的区别:

基本正则表达式(BRE)中,只承认^ $ . [ ] *这六个元字符。
扩展正则表达式(ERE)除了承认BRE的六个元字符外又增加了? + |等多个元字符。

要想把元字符当成普通字符需要在元字符前面加反斜杠转义。

但是在ERE中,(){}这四个本来是普通字符,如果在()和{}前面加了反斜杠,那么()和{}会变成元字符。

sed命令

sed用来进行文本的编辑替换,它也是以行为单位进行处理,流式作业,它会把文档的第一行调入缓冲区,然后处理(不需要处理的行不代表是没处理,它也要流过缓冲区,也会输出),处理完了输出,再调入下一行再处理,直到处理完成所有行。可以把sed看成一个染色器,根据条件对文档进行染色修饰,修饰完后输出,只不过是修饰一行输出一行。默认情况下sed是在缓存中处理文件,处理结果不会影响源文件。

sed的用法:sed option command file。对于option,一般用-n屏蔽输出没有处理的行(sed默认会修饰一行输出一行,除非你是删除了这行),-e来设置多个command。-f用来从文件中读取command部分。command指明了如何处理,file指要处理的文件。

command部分是重点,包括两大块:一块用来限定范围,一块是处理动作。

先说范围限定这部分,有两种方式:

指定行数,比如“3,5”代表从第三行到第五行,也就是345这三行。
指定条件,使用正则表达式限定行的模式,比如/^a/代表以a开头的行。

再说动作部分,这个很多,说几个常用的:

d:表示删除行。
p:打印显示该行。一般和-n选项一起使用。
r:读取指定文件的内容。
w:分流写入指定文件。'/aa/w bb.txt/' 把包含aa的行写入bb.txt
a:在下面插入新行新内容。
s:替换文本整体,支持正则表达式和&附加符号。
y:对位替换,不支持正则和&符号,比如'y/ab/AB/',是指把a替换为A,把b替换为B,不 管ab是不是连续。

举例:


sed  -n  '10,20p'  aa.txt把aa.txt的10到20行显示出来,带行号。
sed  '/^[dD]/s/x/X/g'  aa.txt所有以d或D开头的行中的x换成X。后面那个g代表这一整行中的所有x都要替换成X,而不是只把第一个x换成X。
sed  's/B.*/&2020/'  aa.txt把aa.txt所有行中B.*字串的最后加上2020四个字符。主要是注意这个&字符,代表附加的意思。
echo  "aa  bb" | sed  's/(aa).*/bb 1/' 这个命令会输出bb  aa。正好把aa  bb对调了。这里用了sed的预存储技术,也就是用()括起来的部分会先被存储起来,根据()出现的顺序用1,2,3这样的形式引用。


关于-e选项,-e选项会在顺序执行多个command时使用,注意多个command之间传递的不仅仅是要处理的行,每一行都会依次通过每个command,不区分需不需要处理,前一个command的结果是后一个command的输入,就这样一行行的在缓冲区中流过。如下图所示:


redies 删除key 通配符_硬链接_11


每一行都会依次流过每个命令,如果有命令不处理这一行,那它会原样流到下一个命令。

还有一个技巧,sed '/am/{n;s/bb/cc/;}' aa.txt这个命令的意思就是把含有am的行的下一行中的bb字符换成cc。这里的{}里面有两个命令,n就是指一行。

awk命令

awk用来处理文本,很复杂,很强大。和sed一样,awk处理文件也是以行为单位。awk其实更像一种编程语言。

awk命令格式:

awk 'BEGIN {打开文件前预处理} 条件 {正常处理每行} 条件 {正常处理每行} END {关闭文件后处理} aa.txt

BEGIN和END处理部分可以省略。

举例:


awk  '/am/  {print $1, $3, $1+$2+$3}'  aa.txt输出aa.txt中含有am的行中第一列和第三列。


条件部分支持正则表达式,$1,$2,$3....代表第一列第二列第三列。$0代表整行。如果一二列是数字我们还可以输出它们的和。

大体说一下awk的工作过程:

第〇步:把awk命令的参数依次存放到ARGV数组中,比如,执行awk '' aa.txt bb.txt命令,那么ARGV[1]=="aa.txt",ARGV[2]=="bb.txt"。当然ARGV[0]就是awk。
第一步:awk读取一条记录(1行),并将这条记录赋值给$0。把当前文件名赋值给FILENAME,把当文件编号赋值给ARGIND(这里是处理的第几个文件编号就是几),把当前文件已经读出的行数赋值给FNR,把awk这次工作从开始到现在一共读出的总行数(多文件)赋值给NR。
第二步:把记录分隔成多个字段,把这行的字段总数赋值给NF,并把各个字段依次存储到$1,$2,$3.....中。(默认的分隔符是空格、制表符,可以用-F来指定其它的字段分隔符;更精细的话可以把输入的字段分隔符存在FS变量中,输出的字段分隔符在OFS变量中。输入的行分隔符存在RS中,把输出的行分隔符存在ORS中)。
第三步:按照条件开始匹配这条记录,符合条件就进行后面的处理,不符合的话就不执行处理。不指定操作的话(就是没有{})默认是print,不指定条件的话就全部处理。操作故意留空的话{}则不作任何处理,也不会print。

awk命令一般会比较长,可以写成脚本,比如下面的tt.awk文件内容如下:


#!/bin/awk  -f
BEGIN {print "id  name  tel  totaln---------"}
{print  $1, $3, $4+$5+$6}
END  {print  "-----------------"}


调用时tt.awk aa.txt即可。

awk命令举例:


awk  'NR%2==0  {next}  {print  NR,  $0}'  aa.txt


输出奇数行。next的意思是直接跳去处理下一行,后面的命令不要执行了。这里有个重点,就是一个条件只能作用于相临的一个处理块每个处理块前面都可加条件,这是流式处理。


awk  'NR%2 !=0  {T=T+$2;next}  {print  NR}  END{print T}'  aa.txt


打印出偶数行号,最后输出奇数行第二列的和。next在这里很特殊,这个next会使得整个处理部分变成一个三目运算符。条件成立执行第一条处理,条件不成立执行第二条处理。因为如果没有next,后面的那个处理块一直会执行。再就是这个例子出现了变量T,在awk中,变量不用声明,起名即可用。


awk  '{print; getline; print}'  aa.txt


这里面出现一个getline,getline会读取当前行的下一行数据,默认赋值给$0,并同时更新NF、NR、FNR的值,因此下次awk再文件时便会隔去这行再读第二行。但是如果geline后面跟一个指定的变量,比如getline b,那么getline会读取当前行的下一行数据赋值给b,则当前的$0的值不会变,但NF、NR、FNR的值还是会被更新,awk再次读的时候还是会隔一行读。

awk还可调用系统命令,比如awk 'BEGIN {system("ls -al")}'

awk还支持for、while循环,还支持sub删除字符串。

cut命令

grep用来筛出行,cut用来剪出列。

cut可以按字节(-b),按字符(-c),按字段(-f)来剪出内容。


cut  -b  3-5,9  aa.txt会剪出aa.txt每行的第345以及第9字节。
cut  -b  -3, 4-  aa.txt剪出从行开始到第三个字符,以及从第4个字符到行尾。cut的定位都是闭区间。
cut  -d  :  -f  2  aa.txt剪出以:为分隔符的第2个字段。


wc命令

wc命令用来计算文件中的字节数、字数、单词数、行数等。


-c  统计字节数,-m统计字符数,-l统计行数,-w统计词数
-L  选项可以显示一个文件中最长行的长度(字节数)。


split命令

split命令用来分隔文件。举例如下:


split  -b  400M  av.mp4
把av.mp4拆分为一个个400M的文件,文件名会自动命名为x.aa、x.ab、x.ac。。。。。。


-b选项,以字节分隔,可以是KMGT。
-l 10,以10行为一个文件分融。
-a 2,分割后的文件后辍长度指定为2,上面的aa、ab、ac即是长度为2。

拆分后的文件合并可以使用cat命令


cat  xaa  xab  >av.mp4


windows系统下使用copy命令


copy  /b  xaa+xab  av.mp4


paste命令

不用于合并文件,paste是用来按列拼接文件。拼接连接符默认是Tab,也可以用-d选项指定。-s选项可以转置结果。如下图所示:


redies 删除key 通配符_redies 删除key 通配符_12


sort命令

sort用来对各种文件进行排序。也是以行为单位。默认输出结果到标准输出,不改变源文件内容。

举例说明:


sort  aa.txt 把aa.txt中的内容按行排序,依据是依次比较各行的字符ascii码,如果文件里是数字,可以使用-n选项来使用数字大小排序。
sort  -u  aa.txt  排序后去除重复项。
sort  -r  aa.txt  -o  bb.txt  逆序排序,并把结果保存到bb.txt。
sort  -t  ":"  -k  2  aa.txt,以:为分隔符分成各个字段,以第2个字段为依据排序。对于-k选项还有很多细节,如下:
sort  -t  ":"  -k  1  -k  2nr  aa.txt,以第一列排序为主要关键字,以第二列为次要关键字逆序数字排序。


-f 选项会忽略比较时的大小写。
-c 选项会检查文件是不是已排好序,如果是乱序将输也第一个乱序的行的信息。
-C 同-c,只是不会输出第一行,如果是乱序不会输出东西,命令返回值1
-M 按照月份排序
-b 忽略每一行前面的所有空白,从第一个可见字符开始比较。