基本命令(2)+管道符、重定向、环境变量

      基本命令仅剩3个,但这三个很重要,在日常会多次使用

   1.打包压缩与搜索命令

      1.1 tar命令

      tar命令用于对文件进行打包压缩或解压,格式为:tar [选项] [文件]。Linux中比较常见的压缩格式很多,主要使用的是.tar或.tar.gz或.tar.bz2格式。这几个压缩格式都是使用tar命令压缩生成的

参数 作用
-c 创建压缩文件
-x 解开压缩文件
-z 用Gzip格式压缩或解压
-j 用bzip2格式压缩或解压
-v 显示压缩或解压的过程
-f 目标文件名
-C 解压到指定目录
-t 查看压缩包内有哪些文件

      通过参数可以知道-c和-x参数不能同时使用;-z参数和-j参数的压缩格式不同,所以二者也不能同时使用。
      假设,我们需要压缩的文件很多也很大,再加上终端在执行完一个任务之前是不会显示新的命令行的,我们就可能因为长时间的没有提示而认为系统死机了,那么使用-v参数就显得很便利了。
      -f参数很重要,它必须放在参数的最后一位,代表需要压缩或解压的文件名称。
      综合上面几条就能看到压缩文件和解压文件的具体参数了。
压缩文件为.tar:tar -cvf 文件名.tar 目录或文件

压缩格式为.tar.gz:tar -czvf 文件名.tar.gz 目录或文件

压缩格式为.tar.bz2:tar -cjvf 文件名.tar.bz2 目录或文件

查看压缩包内的文件

      解压基本同压缩,仅仅时将参数c换为参数x,我便不放截图了。
将需要解压的文件解压到置顶目录(以.tar.bz2为例):tar -xjvf 文件名.tar.bz2 -C 目录

      当出现未知格式的压缩包时(使用tar命令压缩),可以尝试使用tar -xvf进行解压。Linux不存在后缀名,所以不论是.tar或.tar.gz或.tar.bz2都可以换成其他的形式,而使用上面的这些格式是给使用压缩包的用户减少工作量。

      1.2 grep命令

      grep命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为:grep [选项] [文件]
      grep命令相比较于cut命令是按行提取。

参数 作用
-b 将可执行文件当作文本文件来搜索
-c 仅显示找到的行数
-i 忽略大小写
-n 显示行号
-v 反向选择——仅列出没有关键词的行

      grep是使用相当广泛的文本搜索匹配工具。
查找系统中不允许登录的账户:grep /sbin/nologin /etc/passwd

      1.3 find命令

      find命令用于按照指定条件来查找文件,格式为:tar [查找路径] 参数 操作
      find命令比较特殊,它没有短格式,同时他的长格式只有一个“-”,同时find命令需要消耗很大的系统资源。

参数 作用
-name 匹配名称
-user 匹配所有者
-group 匹配所有组
-perm 匹配权限(mode为完全匹配,-mode为包含即可)
-nouser 匹配没有所有者的文件
-nogroup 匹配没有所有组的文件
-newer f1 ! f2 匹配比文件1新但比文件2旧的文件
-size 匹配文件的大小

      匹配指定文件大小可以使用“+”“-”号表示大于或小于特定大小的文件,同时需要指名单位。

b——块(512字节)
c——字节
k——千字节
M——兆字节
G——吉字节

      例搜索大小为1MB的文件:find / -size 1M

全盘搜索指定名称的文件:find / -name 文件名`

搜索所有属于特定用户的文件:find / -user 用户名

      可以看到有一个报错信息说proc目录下的某某某不是一个文件也不是一个目录,这是正常的。

      如果我们需要查找的不是文件而是命令呢,这时候就需要whereis命令来帮忙了:whereis 命令名

   2、重定向

      输入重定向:将文件内容导入到命令中
      输出重定向:将命令的结果导入到文件中

标准输入重定向:文字描述符为0,默认从键盘输入,也可以从其他文件或命令中输入
标准输出重定向:文字描述符为1,默认输出到屏幕
错误输出重定向:文字描述符为2.默认输出到屏幕

输出重定向很容易:uptime > uptime.txt

输入重定向是很少用的

      上面是两个重定向的内容我理解也不是很清楚。第一个输入重定向导入的是uptime.txt里的信息而不是文件本身,即将uptime.txt文件的内容导入到wc命令中,命令对内容进行了操作,相当于下面的例子。

   3、管道符

      现在再说一下之前见到的一个符号,在前面用命令将文件内的所有小写字母换成了大写字母。
      管道符的格式为:命令A | 命令 B。简单的描述这个命令就是“把前一个命令要输出到屏幕的信息作为后一个命令的输入进行又一次处理”。
      前面grep命令已经知道怎么获取不允许登录的账户信息,因为内容太多无法完全显示。现在需要知道有多少个账户就需要使用管道符和wc命令的合作:grep /sbin/nologin //etc/passwd | wc -l

      管道符就像一个制胜法宝,通过嵌套不同的命令我们可以得到想要的信息。比如/etc目录下众多的文件,可以用ls命令和more命令的结合分页查看都有那些文件。

      实际上管道符可以进行多个命令进行嵌套,你不仅限于两个命令,比如:命令A | 命令B | 命令C|……

   4、命令行的通配符

      Linux系统内文件众多,时间一长我们就忘记了自己曾经创建的文件在哪、叫什么。所以在日常使用的时候就需要使用通配符进行查找。
      现在我想看一下我的硬盘分区权限属性,其中一种方法是:ls -l /dev/sdals -l /dev/sda1ls -l /dev/sda2一一查看。这样可以,但是数量一多就显得不现实。
      通配符就可以完美解决这个问题。通配符就是通用的匹配信息的字符。

星号(*):代表零个或者多个字符
问号(?):代表一个字符
中括号([]):不同的格式代表不同的匹配内容

比如上面说的硬盘分区权限信息,就可以用星号来匹配:ls -l /dev/sda*

可以看到使用星号时/dev/sda本身也被匹配到了。而问号和中括号则没有匹配到sda本身。[0-9]想来也能理解,就是从0开始不停的对比,直到9为止;[1,3,5]这个其实可以不加逗号,但是建议加上,因为虽然电脑可以理解时1,3,5三个数,但是人会读错,可以是1,35,也可以是13,5同时也可以直接理解成135。我们加上逗号的作用就是为了防止歧义产生。

   5、常用转义字符

      有4种转义字符是比较常见的:

反斜杠():使反斜杠后面的一个变量变为单纯的字符串
单引号(”):使单引号内的所有变量转义为单纯的字符串
双引号(“”):保留期中的变量属性,不对其进行转义处理
反引号(‘“):把其中的命令执行后返回结果

      先对变量赋值在输出变量。我要输出“价格为15美元” 的内容。直接在变量前加$是不可以的,两个$$是显示当前程序的pid号,不是我们预期的信息。所以我们用反斜杠对其转义

      那么如果我需要10个”$”符号呢,我分别加一个反斜杠?可以。如果是100个,1000个呢?显然不现实,单引号便是首选,只需要开头和结尾分别放置单引号的一部分就可以了,其中的所有特殊字符全部变成了普通的字符串。

      双引号呢,好像没有那么明显。其实不是的,echo输出的文字是需要双引号引起的,但是他可以省略双引号,只有特殊的时候不能省略,所以表现不是很明显。输出价格的截图中可以看到双引号内的特殊字符并没有发生变化。

   6、重要的环境变量

      环境变量是计算机系统用于保存可变值的数据类型。在Linux中变量名称一般都是大写的,这是一种约定俗成的规范。我们可以通过变量名提取相应的变量值。
      我们执行一个命令要经历4个步骤;

步骤1:判断用户是否以绝对路径或相对路径的方法输入命令,如果是则直接执行
步骤2:Linux系统检查用户输入的命令是否有别名
步骤3:bash解释器判断用户输入的是内部命令还是外部命令,外部命令交给步骤4执行
步骤4:系统在多个路径中查找用户输入的命令文件

      systemtl restart network是重启网卡的命令,使用别名可以简化操作。当然使用这种方式创建的别名都是临时的。如果想要修改别名可以使用whereis alias来查找alias所在目录进行修改。

      我们使用的99%的命令都是外部命令,只有1%的命令是前面三个步骤。
      比较不同的用户在使用相同的变量时是可以有不同值的.比如:root用户使用echo $HOME时和普通用户使用echo $HOME是不一样的。
      我们可以用env命令查看所有的环境变量。

      在我们设置的变量都是局部变量,换个可能换个目录就不能使用了.这时候我们就需要用export 变量名的方式将变量设置为全局变量。这个设置好的变量不是永久的,想将变量设置为永久的需要修改文件才可以。文件有两个,只需要修改其中之一就可以了。一个是etc目录下的profile文件,一个是家目录下的.bashrc文件。如果存在两个同名变量,新设置的变量将会覆盖旧的变量。