《Linux私房菜》读书笔记

  • 在 Linux系统中,每一个硬件设备都被当成一个文件来对待,几乎所有的硬件设备文件都在 /dev这个目录下。
  • 挂载,所谓挂载就是用一个目录当成进入点,将磁盘分区的数据放置在该目录下,也就是说,进入该目录就可以读取该分区的。
  • 文件权限的概念:
    eg: drwxr-xr-x 5 root admin 170 4 2 14:46 Users
    a. 第一个字符d代表这个文件是目录、文件、或链接文件,即文件类型;
    b. 接下来,三个一组,分别代表着文件所有者、同用户组下其他用户、非本用户组其他用户的权限(r:可读 w:可写 x:可执行,但不一定能执行成功);
    c. 第二列代表有多少文件连接到此节点,第三列、第四列分别代表这个文件的所有者与所属用户组,接着是文件大小(Byte),之后是创建或修改日期,最后是文件名;
    d. r:可读权限(可用数字4表示),对于目录来说表示可以读取目录结构列表的权限(ls -l);
    e. w:可写权限(可用数字2表示),对于文件来说,可以修改,新增,编辑文件内容,但不能删除,而对于目录来说,则可以新建或删除目录与文件,重命名目录与文件;
    f. x:可执行权限(可用数字1表示),对于目录来说,说明能进入此目录下,如果没有 x权限,即使有 r权限,也无法切换到该目录下;

  • 文件属性与权限的修改:
    a, chgrp:改变文件所属用户, eg: chgrp [-R] groupName dirName/FileName;
    b, chown:改变文件的所有者, eg: chown [-R] ownName dirName/FileName;
    c, chmod:改变文件的权限,eg: chmod [-R] premissNum dirName/FileName;
    除了直接用数字,还可以用下面的方式修改文件的权限:chmod u/g/o/a +/-/= r/w/x dirName/FileName ; 其中 u表示文件所有者,g表示文件所在的组,o表示 others, +表示加入,-表示除去,=表示设置,r/w/x 表示相应权限

  • 文件与目录相关的命令:
  • 此层目录. 上层目录.. 目前用户所在的主文件~
  • cd dir: 切换目录 pwd:显示当前目录
  • mkdir [-mp] dirName:新建目录, -m:配置文件权限, -p:递归新建目录
  • rmdir [-p] dirName: 删除空的目录 -p:递归删除空目录
  • echo inof: 打印信息 eg: echo $PATH
  • PATH这个变量是由一堆目录所组成,每个目录中间用冒号(:)隔开
  • ls [-adhl] driName:查看文件与目录, -a:全部文件 ,-d :仅列出目录本身,而不是目录中的文件 ,-h:将文件容量以易读的方式列出来,-l:列出文件的各种属性
  • cp [-irp] source destination:复制文件,-i:若目标文件destination已经存在,在覆盖时会提示, -r:递归持续复制,用于复制目录, -p:连同文件属性一同复制过去。
  • rm [-fir] fileName:删除文件, -f:强制删除,忽略不存在的文件,无警告信息,-i:有提示信息,-r:递归删除,用于目录
  • mv [-fiu] source destination :移动文件或重命名,-f:强制移动,覆盖destination,-i:有提示信息,-u:如果destination存在,只有source比较新时才覆盖
  • cat [-bn] fileName : 由第一行查看文件内容,-b,对非空白行做行号显示,-n,显示所有行号
  • tac fileName :反向查看文件,由最后一行开始
  • nl [-bnw] fileName :添加行号打印
  • more fileName : 向下翻页查看, 空格:下一页, Enter:下一行 ,q:离开, 在输入/后输入你想查询的字符串,按下Enter就会向下查找相关字符串
  • less fileName :翻页查看,与more类似,不过支持向上翻页(PageUp), 支持向上查找:?要查找的字符串 Enter
  • 数据选取head [-n number] fileName:取出前面几行
  • 数据选取 tail [-n number] fileName :取出后面几行
  • od [-t TYPE] fileName:查看非文本文件
    TYPE有以下常用值:
    c:使用 ASSII 字符输出
    x[size]:使用十六进制输出,每个整数占size bytes
  • touch file :创建文件或修改文件时间
  • file fileName : 查看文件类型
  • which [-a] command : 寻找执行文件 -a:将所有 PATH目录中找到的都列出来,而不是仅仅是第一个
  • whereis [-bmsu] fileName : 寻找特定文件,基于数据库(手动更新数据库:updatedb)
  • locate [-ir] keyWord :通过文件名称关键字寻找文件,基于数据库(手动更新数据库:updatedb),-i :忽略大小写
  • find [PATH] [option] [option] :基于硬盘扫瞄的查找,可指定查看路径与查找条件
    eg :find /home -name "*rubin*"
  • 常见压缩命令:
  • 常见压缩文件扩展名:
    1. *.gz :gzip 程序压缩的文件
    2. *.bz2 :bzip2 程序压缩的文件
    3. *.tar :tar 程序打包的文件,但未经压缩
    4. *.tar.gz :tar 程序打包并经gzip 程序压缩的文件
    5. *.tar.bz2 :tar 程序打包并经bzip2 程序压缩的文件
      tar打包可以将多个文件或目录打包成一个文件
  • gzip [-cdv#] fileName :gzip压缩命令,-c:将压缩的数据输出到屏幕上 ; -d :解压缩 ;-v:显示压缩比等参数;-#:压缩等级 -1,最快,但质量差,-9,最慢
    eg: gzip -9 -c man.config > man.config.gz ,加上>newFileName 之后原文件才会被保留,否则原文件会被替换;
    1. zcat fileName.gz : 可以用来读取通过 gzip压缩后的文件而无需解压;
    2. bzip2 [-cdkzv#] : bzip2压缩命令 ,-c:将压缩的数据输出到屏幕上 ; -d :解压缩 , -k:保留原文件;-z:压缩;;-v:显示压缩比等参数;-#:压缩等级 ;
      eg:bzip2 -9 -c man.config > man.config.bz2bzip2 -9 -c -k man.config效果一样;
      1. bzcat file.bz2 :可以用来读取通过 bzip2压缩后的文件而无需解压;
      2. tar -jvc -f fileName.tar.bz2 要被压缩的文件或目录 : tar 打包bzip2压缩
      3. tar -jtv -f fileName.tar.bz2:查询
      4. tar -jxv -f fileName.tar.bz2 -C 欲解压的目录:对tar 打包bzip2压缩的文件进行解压缩
      5. tar -zvc -f fileName.tar.gz 要被压缩的文件或目录 : tar 打包gzip压缩
      6. tar -ztv -f fileName.tar.gz:查询
      7. tar -zxv -f fileName.tar.gz -C 欲解压的目录:对tar 打包gzip压缩的文件进行解压缩
        说明:6~11中的参数 -j:通过 bzip2进行解压缩; -z:通过 gzip进行解压缩; -v:打印正在处理的文件; -c(小写):新建打包文件; -f:要被处理的文件; -t:查看打包压缩文件包含 那些文件;-x:解打包或解压缩; -C(大写):指定在特定目录解压
  • vim 程序编辑器
  • vi的三种模式: 一般模式、编辑模式 、命令行模式
  • 常用功能键说明:

    1. Ctrl f:向下翻页
    2. Ctrl b :向上翻页
    3. n : n代表数字,向右移动这一行的 n个字符
    4. 0 :移动到这一行的最前面
    5. nG:n代表数字,移动到这个文件的第 n行
    6. G:移动到文件的最后一行
    7. gg:移动到文件的第一行,相当于1G
    8. /word :向下寻找一个名称为 word 的字符串
    9. ?word:向上寻找一个名称为 wordr的字符串
    10. n : 代表重复前一个查找的操作
    11. N :代表重复前一个查找的操作,不过方向为反方向
    12. :set nu :设置显示行号
    13. :set nonu:取消行号
      1. 当我们在使用 vim 编辑时,vim 会在被编辑文件的目录下新建一个名为.fileName.swp的文件,我们对文件的操作都会被记录在这个 .swp文件中,当非正常退出 vim(或当前文件在被其他人编辑)时可以用它来恢复数据。如图:
        《Linux私房菜》读书笔记
        从图中可以看出 swp提供了6种操作:
      2. [O] pen Read-Only :以只读的方式打开此文件
      3. (E)dit anyway : 用正常的方式打开你要编辑的文件,丢弃暂存区的内容
      4. (R)evover :加载暂存区的内容
      5. (D)elete : 删除暂存文件
      6. (Q)uit :离开 vim
      7. (A)bort : 忽略这个编辑行为,与 quit 类似,
  • 认识bash:

    1. bash是 linux默认的 shell,而 广义的shell 是指能够操作应用程序的接口,狭义的 shell指的是命令行方面的软件。
    2. [Tab]接在一串命令命令的第一个字后面,则为命令补齐,如果是接在第二个字以后,则为文件名补齐;
    3. type cmd:用来显示这个命令是外部命令还是 bask内置命令,file:表示外部命令,alias:别名,builtin:内置;
    4. \[Enter]表示换行,中间不能有空格(转义)
    5. 变量:
      1. echo $varNameecho ${varName}:可用来显示变量;
      2. varName=varValue :设置变量,=两边不能有空格;变量名称只能是字母或数字,但不能以数字开头;内容如有空格符可用”” 或”将内容组织起来,双引号会保留特殊字符(eg:$)的作用;如果变量需要在其他子进程执行,则要以 export 来使自定义变量(局部变量)变成环境变量(全局变量);
      3. unset varName :取消变量;
      4. read [-pt] varName :从键盘的输入中读取变量值,变量默认为字符串,-p:可以接提示符 , -t:可以接等待时长(秒)
      5. declare [-aixr] varName=varValue :声明变量类型, -a:数组 ; -i: int ; -x :用法与 export一样;-r:声明变量只读;
        eg : declare -a names names[0]=value0 names[1]=value1 echo "${names[0]} , ${names[1]}"
      6. alias aliasName='var/cmd' :别名的设置,=两边不能有空格;unalias aliasName:取消别名;
      7. hsitory [n] [-c]:查询历史命令, n:数字,列出最近的 n条命令,-c :删除历史命令
    6. 命令的查找顺序:
      1. 以相对/绝对路径执行命令;
      2. 由 alias找到该命令来执行;
      3. 由 bash 内置的(builtin)命令来执行;
      4. 通过$PATH 这个变量的顺序找到第一个命令来执行;
    7. /etc/profile :这是系统整体的设置;~/.bash_profile、~/.bash_login 、~/.profile:属于用户自己的设置;
    8. source 配置文件:读入环境配置文件
    9. 数据流重定向:
      1. >:以覆盖的方法将正确的数据输出到文件或设备上;
      2. >>:以累加的方法将正确的数据输出到文件或设备上;
      3. 2>:以覆盖的方法将错误的数据输出到文件或设备上;
      4. 2>>:以累加的方法将错误的数据输出到文件或设备上;
      5. /dev/null :/dev/null可以吃掉任何导向这个设备的信息 eg: ls /dir 2>/dev/null ,忽略错误信息;
      6. < :读取一个文件的内容,eg:cat > catFile < ~./bash_profile ,创建一个 catFile,catFile的内容从~./bash_profile读取;
      7. << :代表结束输入的意思,eg:cat > catFile <<"eof" ,创建一个 catFile,catFile的内容从键盘输入中读取,遇到”eof”结束读取;
    10. 命令执行的判断:
  • cmd1 && cmd2 : 若cm1执行完毕且正确执行(命令回传码$?=0),则开始执行 cmd2 ;否则 cmd2不执行
  • cmd1 || cmd2 : 若cm1执行完毕且正确执行(命令回传码$?=0),则 cmd2不执行 ;否则 cmd2执行

    说明:Linux 的命令是由左往右执行的,eg:cmd1 || cmd2 && cmd3
    如果 cmd1正确执行,那么 cmd2不会执行,cmd1结果传递给 cmd3,cmd3执行;
    如果 cmd1 执行失败,那么 cmd2执行 ,cmd2结果传递给 cmd3;

  • 管道命令:管道命令使用的是”|” 这个界定符,eg: ls -al | less 。管道命令仅会处理 standard output,对于standard err output会忽略,同时管道命令必须要能够接收前一个命令的数据成为standard input 才能继续处理;

    1. 选取命令:
      1. cut -d '分隔字符' -f fields:用于分隔字符, -d:指定以什么字符分隔, -f fields,取出第几段,也可以是个范围
        eg: echo $PATH | cut -d ':' -f 5
        echo $PATH | cut -d ':' -f 1、5
      2. grep [-cinv] '查找的字符串' [fileName] : 以行为单位,将符合条件的行选取出来, -c:计算找到的总行数,-i:忽略大小写,-n:顺便输出行号,-v,反向选择,即找不包含指定字符串的。
        eg: echo $PATH | grep -i 'java'
        grep -ic 'google' etc/hosts
  • wc [-lwm]:统计一个文本有多少行,多少字,-l:仅列出行;-w:仅列出多少个英文单字;-m:多少个字符;

  • 用户身份切换:
    1. su [-lm] [-c cmd] [userName]
    2. sudo [-b] [-u 新用户帐号] :sudo 可以让你让其他用户的身份(通常是 root)来执行命令