1·which命令
作用是在PATH变量指定的路径中搜索可执行文件的所在位置,他一般用来确定系统中是否安装了指定的软件。
命令格式:
which 可执行文件的名称
会返回该程序的路径。
注:shell内建命令不在PATH指定的目录中。
到底什么是命令?
命令可以是下面四种形式之一:
是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等。
是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,上面我本地环境中的 cd 命令,就是一个 shell 内部命令。
是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。 比如上面讲到的 cd 命令,在实验楼环境中就是一个 shell 函数。
是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。
2·whereis 命令
用于定位可执行文件、源代码文件、帮助文件在文件系统中的位置。还具有搜索源代码、指定备用搜索路径和搜索不寻常项的功能。
查找速度很快,因为他根本不是在磁盘中漫无目的的乱找,而是在一个数据库(/var/lib/mlocate)中查询。这个数据库是linux系统自己创建的,包含有本地所有文件的信息,并且每天通过自动执行updatedb命令更新一次。
命令格式:
whereis[选项]文件
常用参数:
- -b 定位可执行文件
- -m 定位帮助文件
- -s 定位源代码文件
-u 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其他文件
-B| 指定搜索可执行文件的路径
-M| 指定搜索帮助文件的路径
-S|指定搜索源代码文件的路径
3·locate命令
与whereis类似,且他们使用相同的数据库。要想获得更全面的搜索结果,可使用。
locate 命令使用了十分复杂的匹配语法,可以使用特殊字元(如’*’和’?’)来指定需要查找的样本。
命令格式:
locate[选项][搜索字符串]
常用参数:
-q 安静模式,不会显示任何错误讯息
-n 至多显示n个输出
-r 使用正规表达式做寻找的条件
-V 显示版本讯息
EG1:搜索 etc 目录下所有以 sh 开头的文件,可以使用如下命令:locate /etc/sh
EG2: 搜索 etc 目录下文件名包含 lou 的文件,可以使用如下命令: locate /etc/*lou*
4·find命令
作用是沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作。
命令格式:
find [选项][搜索路径][表达式]
默认路径是当前目录,默认表达式为-print
表达式可能由下列成分组成:操作符、选项、测试表达式以及动作。
常用参数:
参数 描述
-print
find 命令将匹配的文件输出到标准输出
-exec find 命令对匹配的文件执行该参数所给出的 shell 命令
-name 按照文件名查找文件
-type 查找某一类型的文件
-prune
使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同 时使用-depth 选项,那么-prune 将被 find 命令忽略
-user 按照文件属主来查找文件
-group
按照文件所属的组来查找文件
-mtime -n +n
按照文件的更改时间来查找文件,-n 表示文件更改时间距现在小于 n天,+n 表示文件更改时间距现在大于 n 天,find 命令还有-atime 和 -ctime 选项
EG1:打印当前目录下的文件目录列表 ,可以使用如下命令:find . -print
EG2:打印当前目录下所有以.txt 结尾的文件名 ,可以使用如下命令 find . -name "*.txt" -print -iname 选项跟-name 选项作用一样,不同在于-iname 会忽略字母大小写。
EG3: 打印当前目录下所有以.txt 或.pdf 结尾的文件名 youwenti find . \( -name "*.pdf" -or -name "*.txt")\
EG4: 打印当前目录下所有不以.txt 结尾的文件名 ,可以使用如下命令:find . ! -name "*.txt"
下面将介绍如何根据文件类型、权限、所有者及操作符来查找匹配文件。
根据文件类型来查找文件,使用-type 选项,常见 find 文件类型见下表。
文件类型 描述
b 块设备文件
c 字符设备文件
d 目录
f 普通文件
l 符号链接
根据文件权限查找文件,使用-perm 选项。所有者使用-user 选项。
另外,find 命令可以通过逻辑操作符来创建更复杂的逻辑关系,例如 find 命令(一)中的例三就使用了操作符-or。find 命令的逻辑操作符见下表。
操作符 描述
-and 匹配如果操作符两边的测试条件都为真。可以简写为-a。若没有使用操作符,则默认使用-and
-or 匹配若操作符两边任一个测试条件为真。简写:-o
-not 匹配若操作符后边的测试条件为假。简写:!
() 把测试条件和操作符组合起来形成更大的表达式。
EG1:打印当前目录下所有以.txt 结尾的符号链接 ,可以使用如下命令:find . -type l -name "*.txt" -print
EG2: 打印当前目录下所有权限为 777 的 php 文件(web 服务器上的 php 文件一般需要执行权限),可以使用如下命令:find . -type f -name "*.php" -perm 777
EG3: 打印当前目录下 root 用户拥有的所有文件,可以使用如下命令:find . -type f -user root
EG4: 打印当前目录下权限不是 777 和 664 的所有文件,可以使用如下命令:find . -type f \(! -perm 777 -and ! -perm 644 \)
下面将介绍如何使用 find 命令的-exec 选项来实现对查找到的文件执行指定的动作命令。
EG1: 找到当前目录下所有 php 文件,并显示其详细信息,可以使用如下命令:find . -name "*.php" -exec ls -l {} \;
-exec 是 find 命令对找到的文件执行的动作,这个动作就是对找到的文件执行命令,上面的命令就是 ls -l {}。在这里说明一下{}和\;,{}其实它就是一个占位符,在 find 命令的执行过程中会不断地替换成当前找到的文件,相当于”ls -l 找到的文件”。而\;是-exec 的命令结束标记,因为规定-exec 后面的命令必须以;结束,但;在 shell 中有特殊含义,必须要转义,所以写成\;。
5·xargs命令
用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入)。但有些命令只能以命令行参数的形式接收数据,而无法通过stdin接收数据流,在这种情况下,无法通过管道将数据重定向给这些命令。
xargs命令可以从标准输入接收输入,并把输入转换为一个特定的参数列表。
命令格式:
command|xargs [选项][command]
xargs命令应该紧跟在管道操作符之后,因为它以标准输入作为主要的源数据流。
常用参数:
-n 指定每行最大的参数数量
-d 指定分隔符
6·cut命令
将文本按列进行切分的小工具,他可以指定分隔每列的定界符。如果一行数据包含多个字段(多列),现在想要提取其中的一列或多列,就需要cut。
命令格式:
cut[选项][文件名]
常用参数:
参数 描述
-b 以字节为单位进行分割
-c 以字符为单位进行分割
-d 自定义分隔符,默认为制表符
-f 自定义字段
--complement
抽取整个文本行,除了那些由 -c 或 -f 选项指定的文本
常用范例:
例一:取出 student.txt 文件中的第一列和第三列,可以使用如下命令:
cut -f 1,3 -d ‘ ’ student.txt
例三:取出 student.txt 文件中的前三列,可以使用如下命令:
cut -f 1-3 -d ‘ ’ student.txt、
例三:取出 student.txt 文件中的前三列,可以使用如下命令:
cut -f 1-3 -d ‘ ’ student.txt
7·paste命令
功能正好和cut相反,它会添加一个或多个文本列到文件中,而不是从文件中抽取文本咧。它通过读取多个文件,然后把每个文件中的字段整合成单个文本流,输入到标准输出。
命令格式:
paste[选项][文件名]
常用参数:
参数 描述
-s 将每个文件合并成行而不是按行粘贴
-d 自定义分隔符,默认为制表符
常用范例:
例一:将 student.txt 和 telphone.txt 文件中的内容按列拼接,可以使用如下命令:
paste student.txt telphone.txt
例二:将 student.txt 和 telphone.txt 文件中的内容按列拼接,指定分隔符为’:’,可以使用如下命令:
paste student.txt telphone.txt -d ‘:’
8·tr命令
tr命令用来更改字符。我们可以把它看做是一种基于字符的查找和替换操作。换字是一种把字符从一个字母转换为另一个字母的过程。tr从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
tr只能通过stdin(标准输入),而无法通过命令行参数来接收输入。
translate(转换)的缩写。
命令格式:
tr [选项] SET1 SET2
将来自 stdin 的输入字符从 SET1 映射到 SET2,并将其输出写入 stdout(标准输出)。SET1 和 SET2 是字符类或字符集。如果两个字符集的长度不相等,那么 SET2 会不断重复其最后一个字符,直到长度与 SET1 相同。如果 SET2 的长度大于 SET1,那么在 SET2 中超出 SET1 的那部分字符则全部被忽略。
常用参数:
参数 描述
-d 删除匹配 SET1 的内容,并不作替换
常用范例:
例一:将输入的字符大写转换为小写,可以使用如下命令:
echo ‘THIS IS SHIYANLOU!’ | tr ‘A-Z’ ‘a-z’
例二:将输入的字符中的数字删除,可以使用如下命令:
echo ‘THIS 123 IS S1HIY5ANLOU!’ | tr -d ‘0-9’
例三:tr 命令的一个有趣的用法是执行 ROT13 文本编码。ROT13 是一款微不足道的基于一种简易的替换暗码的加密类型。把 ROT13 称为“加密”是大方的,“文本模糊处理”更准确些。有时候它被用来隐藏文本中潜在的攻击内容。这个方法就是简单地把每个字符在字母表中向前移动 13 位。因为移动的位数是可能的 26 个字符的一半,所以对文本再次执行这个算法,就恢复到了它最初的形式。可以使用如下命令:
#加密
echo ‘shiyanlou’ | tr ‘a-zA-Z’ ‘n-za-mN-ZA-M’
fuvlnaybh
#解密
echo ‘fuvlnaybh’ | tr ‘a-zA-Z’ ‘n-za-mN-ZA-M’
shiyanlou
9·sort命令
同文本文件打交道时,总避不开排序,那是因为对于文本处理任务而言,排序可以起到不小的作用。sort命令能够帮助我们队文本文件和stdin进行排序操作。通常,它会结合其他命令来生成所需要的输出。
命令格式:
sort[选项][文件名]
常用参数:
参数 描述
-n 基于字符串的长度来排序,使用此选项允许根据数字值排序,而不是字母值
-k 指定排序关键字
-b 默认情况下,对整行进行排序,从每行的第一个字符开始。这个选项导致 sort 程序忽略每行开头的空格,从第一个非空白字符开始排序
-m 只合并多个输入文件
-r 按相反顺序排序,结果按照降序排列,而不是升序
-t 自定义分隔符,默认为制表符
常用范例:
例一:列出/usr/share/目录下使用空间最多的前 10 个目录文件,可以使用如下命令:
du -s /usr/share/* | sort -nr | head -10
du -s /usr/share/* 命令显示/usr/share/目录下所有文件和目录的磁盘使用空间,目录包含目录下的子目录和文件
例二:ls 命令能显示目录下文件的详细信息,包含空间使用大小,但与 du 命令不同的是,ls 命令不计算目录下的子目录和文件的大小。ls 显示格式如下:
-rwxrwxrwx 1 root root 542 11 月 29 test.php
现在想要对 ls 命令输出信息中的空间使用大小字段进行排序,可以使用如下命令:
ls -l /usr/bin/ | sort -nr -k 5 | head -10
例三:首先来看下下面的例子: img 由于 11 由 1 开始,比 5 大,所以排在 5 的前面。这时排序可以通过自定义排序字段来排序。使用下面的命令就可以解决。
sort -k 1,1 -k 2n data.txt
第一个-k 选项指明只对第一个字段排序,1,1 意味着“始于并且结束于第一个字段”。 第二个-k 选项 2n 表示对第二个字段按数值排序。 还有一种格式,如-k 3.4,表示始于第三个字段的第四个字符,按数值排序。
-k 选项的语法格式如下:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
这个语法格式可以被其中的逗号(“,”)分为两大部分,Start 部分和 End 部分。
先给你灌输一个思想,那就是“如果不设定 End 部分,那么就认为 End 被设定为行尾”。这个概念很重要的,但往往你不会重视它。
Start 部分也由三部分组成,其中的 Modifier 部分就是类似 n 和 r 的选项部分。我们重点说说 Start 部分的 FStart 和 CStart。 FStart.CStart,其中 FStart 就是表示使用的域,而 CStart 则表示在 FStart 域中从第几个字符开始算“排序首字符”。CStart 是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 5 就是省略了 CStart 的例子。
同理,在 End 部分中,你可以设定 FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将 CEnd 设定为 0(零),也是表示结尾到“域尾”。
10·uniq命令
uniq命令经常和sort命令一起使用。uniq从标准输入或单个文件名参数接收数据有序列表,默认情况下,从数据列表中删除任何重复行。
只能用于排过序的数据输入,因此,要么使用管道,要么将排过序的文件作为输入,并总是以这种方式与sort命令介个起来使用
unique的缩写
命令格式:
uniq[选项][文件名]
常用参数:
参数 描述
-c 在每行前加上表示相应行目出现次数的前缀编号
-d 只输出重复的行
-u 只显示唯一的行
-D 显示所有重复的行
-f 比较时跳过前 n 列
-i 在比较的时候不区分大小写
-s 比较时跳过前 n 个字符
-w 对每行第 n 个字符以后的内容不作对照
常用范例:
例一:找出/bin 目录和/usr/bin 目录下所有相同的命令,可以使用如下命令:
ls /bin /usr/bin | sort | uniq -d
11·join命令
类似于paste,它会往文件中添加列,但是它使用了独特的方法来完成。一个join操作通常与关系型数据库相关联,在关系型数据库中来自多个享有共同关键域的表格的数据结合起来,得到一个期望的结果。这个join命令执行相同的操作,它把来自于多个基于共享关键域的文件的数据结合起来。
通俗讲,就是讲两个文件中指定栏位相同的行链接起来,即按照两个文件中共同拥有的某一列,将对应的行拼接成一行。
命令格式:
join[选项]文件1 文件2
常用参数:
参数 描述
-j FIELD
等同于 -1 FIELD -2 FIELD,-j 指定一个域作为匹配字段
-1 FIELD
以 file1 中 FIELD 字段进行匹配
-2 FIELD
以 file2 中 FIELD 字段进行匹配
-t 自定义分隔符,默认为制表符
12·comm命令
comm命令将逐行比较已经排序的文件。现实的结果包括3列:第1列为只在第一个文件中找到的行,第2列为只在第二个文件中找到的行,第3列为两个文件的共有行。
命令格式:
comm [选项] 文件 1 文件 2
常用参数:
参数 描述
-1 不输出文件 1 特有的行
-2 不输出文件 2 特有的行
-3 不输出两个文件共有的行
13·diff命令
被用来监测文件之间的差异。它支持许多输出格式,并且一次能处理许多文本文件。软件开发员经常使用diff程序来检查不同程序源码版本之间的更改,diff能够递归地检查源码目录,经常称之为源码树。diff程序的一个常见用例是创建diff文件或者补丁,它会被其它程序使用。
diff在命令行中打印每一个行的改动,并且diff是svn、cvs、git等版本控制工具不可或缺的一部分。
differential的缩写
命令格式:
diff[选项]文件
常用参数:
参数 描述
-c 上下文模式,显示全部内文,并标出不同之处
-u 统一模式,以合并的方式来显示文件内容的不同
-a 只会逐行比较文本文件
-N 在比较目录时,若文件 A 仅出现在某个目录中,预设会显示:Only in 目录。 若使用-N 参数,则 diff 会将文件 A 与一个空白的文件比较
-r 递归比较目录下的文件
14·df命令
用来检查linux服务器的文件系统的磁盘空间占用情况。
disk free的缩写
命令格式:
df[选项]文件
常用参数:
参数 描述
-a 全部文件系统列表
-h 方便阅读方式显示
-i 显示 inode 信息
-T 文件系统类型
-t<文件系统类型>
只显示选定文件系统的磁盘信息
-x<文件系统类型>
不显示选定文件系统的磁盘信息
15·du命令
du也可以查看使用空间,与df不同的是Linux du命令是对文件和目录磁盘使用的空间的查看。
disk usage的缩写。
命令格式:
du [选项]文件
常用参数:
参数 描述
-a 显示目录中个别文件的大小。
-b 显示目录或文件大小时,以 byte 为单位。
-c 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k 以 KB(1024bytes)为单位输出。
-m 以 MB 为单位输出。
-s 仅显示总计,只列出最后加总的值。
-h 以 K,M,G 为单位,提高信息的可读性
16·time命令
常用于测量一个命令的运行时间,包括实际使用时间(real time)、用户态使用时间(the process spent in user mode)、内核态使用时间(the process spent in kernel mode)。
实际时间:从command命令开始执行到运行终止。
用户态:命令执行完成花费的用户CPU时间。
内核态:命令执行完成花费的系统CPU时间。
命令格式:
time 命令