美文网首页前端我爱编程
菜鸟的Linux上手指南-2

菜鸟的Linux上手指南-2

作者: 7091a52ac9e5 | 来源:发表于2017-06-02 00:35 被阅读195次

    Linux的常用操作

    很多人装完系统后第一件事就是装软件,应用部分我们也从软件的安装说起,还是以Ubuntu为例介绍软件的安装和卸载方法:

    软件的安装和卸载

    Linux上软件的安装有四种形式

    • 在线安装
    • 从磁盘安装deb安装包
    • 从二进制软件包安装
    • 从源代码安装

    在线安装

    在线安装命令很简洁,我们先看使用方式,然后叙述每一步的意义:

    $ sudo apt-get install cowsay
    # 如果你在安装一个软件之后,无法立即使用Tab键补全这可命令,使用下述命令刷新
    $ source ~/.zshrc
    

    那么安装的过程究竟发生了什么:

    • 在本地的一个数据库中搜索关于 cowsay 软件的相关信息
    • 根据这些信息在相关的服务器上下载软件安装
    • 安装某个软件时,如果该软件有其它依赖程序,系统会为我们自动安装所以来的程序;
    • 如果本地的数据库不够新,可能就会发生搜索不到的情况,这时候需要我们更新本地的数据库,使用命令sudo apt-get update可执行更新;
    • 软件源镜像服务器可能会有多个,有时候某些特定的软件需要我们添加特定的源;
    apt-get描述

    很可能apt-get会是很长一段时间内,你使用的最多的命令,我们先对其进行详细的描述
    作用:用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包

    apt-get命令后可以接不同的工具实现不同的效果,描述如下:
    工具 说明

    • install 其后加上软件包名,用于安装一个软件包
    • update 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
    • upgrade 升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update
    • dist-upgrade 解决依赖关系并升级(存在一定危险性)
    • remove 移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
    • autoremove 移除之前被其他软件包依赖,但现在不再被使用的软件包
    • purge 与remove相同,但会完全移除软件包,包含其配置文件
    • clean 移除下载到本地的已经安装的软件包,默认保存在/var/cache/apt/archives/
    • autoclean 移除已安装的软件的旧版本软件包

    apt-get后还可以更一些常见的参数,对这些参数的描述如下:

    • -y 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
    • -s 模拟安装
    • -q 静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
    • -f 修复损坏的依赖关系
    • -d 只下载不安装
    • --reinstall 重新安装已经安装但可能存在问题的软件包
    • --install-suggests 同时安装APT给出的建议安装的软件包

    实例

    # 重装
    $ sudo apt-get --reinstall install w3m
    # 更新软件源
    $ sudo apt-get update
    # 升级没有依赖问题的软件包
    $ sudo apt-get upgrade
    # 升级并解决依赖关系
    $ sudo apt-get dist-upgrade
    # 卸载
    $ sudo apt-get remove w3m
    
    # 不保留配置文件的移除
    $ sudo apt-get purge w3m
    # 或者 sudo apt-get --purge remove
    # 移除不再需要的被依赖的软件包
    $ sudo apt-get autoremove
    
    使用apt-cache 命令实现软件搜索

    sudo apt-cache search softname1 softname2 softname3……

    apt-cache 命令则是针对本地数据进行相关操作的工具,search 顾名思义在本地的数据库中寻找有关 softname1 softname2 …… 相关软件的信息

    使用dpkg从本地磁盘安装deb软件包

    有时候我们也需要下载一些安装包安装,比如你想在Ubuntu下使用webstorm,就可以在其官网上下载响应的deb软件包,使用dpkg命令来安装

    dpkg的常见参数

    • -i 安装指定deb包
    • -R 后面加上目录名,用于安装该目录下的所有deb安装包
    • -r remove,移除某个已安装的软件包
    • -I 显示deb包文件的信息
    • -s 显示已安装软件的信息
    • -S 搜索已安装的软件包
      -L 显示已安装软件包的目录信息

    使用实例

    $ cp /var/cache/apt/archives/emacs24_24.3+1-4ubuntu1_amd64.deb ~
    # 安装之前参看deb包的信息
    $ sudo dpkg -I emacs24_24.3+1-4ubuntu1_amd64.deb
    # dpkg并不能为你解决依赖关系
    $ sudo dpkg -i emacs24_24.3+1-4ubuntu1_amd64.deb
    # 修复依赖关系的安装
    $ sudo apt-get -f install
    
    # 查看已安装软件包的安装目录
    $ sudo dpkg -L emacs
    

    从二进制安装

    二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可,如果你不知道该放到什么位置,请重新复习第四节关于 Linux 目录结构的内容。

    说到了环境变量,接下来我们仔细聊聊shell下的变量,并掌握添加环境变量的方法。

    Linux变量

    或许你也有过这样的经历,想通过命令行启动某些操作,比如说使用VSCode时希望通过 在命令行中通过code ./project命令打开相应的文件夹。

    各编程语言中都有变量的概念,Shell中的变量也基本如此,变量有如下特点

    • 不同类型(但不用专门指定类型名)
    • 可以参与运算
    • 有作用域限定

    我们看看在bash中添加变量的方法:

    #使用 declare 命令创建一个变量名为 tmp 的变量
    $ declare tmp:
    
    # 使用 = 号赋值运算符,将变量 tmp 赋值为 God
    $ tmp=God
    
    # 读取变量的值:使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值)
    $ echo $tmp
    # 将输出God
    ➜  ~ 
    

    Shell中的变量类型

    1.自定义变量:当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。

    • 相关命令:set:显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。
    1. Shell 本身内建的变量
    • 相关命令:env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。
    1. 从自定义变量导出的环境变量。
    • 相关命令:export:显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。
    • export temp导出变量temp为环境变量
    • 通常我们习惯将环境变量名设置为大写;

    在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。

    环境变量,可以简单地理解成如果某变量在当前进程的子进程有效则为环境变量,否则不是。(在Shell中输入zsh或者bash其实就是创建了一个子shell)。

    我们也可以安装生存周期划分Shell变量:

    • 永久的:需要修改配置文件,变量永久生效;
    • 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。

    永久变量涉及到两个重要文件 /etc/bashrc(有的 Linux 没有这个文件) 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。 .profile(不是/etc/profile) 只对当前用户永久生效。而写在 /etc/profile 里面的是对所有用户永久生效,所以如果想要添加一个永久生效的环境变量,只需要打开 /etc/profile,在最后加上你想添加的环境变量就好啦。

    添加命令到环境变量

    添加命令到环境变量几乎是每个使用Linux系统的人都会进行的操作:它实现了在 Shell 中输入一个命令,能通过环境变量 PATH 来进行搜索并执行命令,PATH 里面就保存了 Shell 中执行的命令的搜索路径。

    添加自定义路径到"PATH"环境变量的具体方法如下:
    一次性的:

    # 这里一定要使用绝对路径
    $ PATH=$PATH:/home/zhangwang/mybin
    # 给 PATH 环境变量追加了一个路径,它也只是在当前 Shell 有效,我一旦退出终端,再打开就会发现又失效了。
    

    通过上述设置,就可以执行mybin目录下的所有命令了。

    永久的:
    想要永久的添加这类环境变量可以用接下来额方法,每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是 .zshrc,相应 Bash 的配置文件为 .bashrc 。它们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。

    # 可以简单地使用下面命令直接添加内容到 .zshrc 中
    $ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
    

    上述命令中 >> 表示将标准输出以追加的方式重定向到一个文件中
    当然,你用vim等编辑器直接打开对应文件也是可以实现类似的操作的。

    修改和删除已有的变量

    有如下几种方式:

    • ${变量名#匹配字串}: 从头向后开始匹配,删除符合匹配字串的最短数据
    • ${变量名##匹配字串}: 从头向后开始匹配,删除符合匹配字串的最长数据
    • ${变量名%匹配字串}: 从尾向前开始匹配,删除符合匹配字串的最短数据
    • ${变量名%%匹配字串}: 从尾向前开始匹配,删除符合匹配字串的最长数据
    • ${变量名/旧的字串/新的字串}:将符合旧字串的第一个字串替换为新的字串
    • ${变量名//旧的字串/新的字串}: 将符合旧字串的全部字串替换为新的字串

    删除删除

    # 删除变量temp
    $ unset temp
    

    让环境变量理解生效

    有时候修改了环境变量并未马上生效可用下面这种方法使其马上生效:

    # 在修改了.zshrc文件后
    $ source .zshrc
    # source有一个别名叫做.因此可以用下面的方法使得理解生效(第一个点后面有一个空格,且路径需要为绝对路径或者相对路径)
    $ . ./.zshrc
    

    文件的打包和压缩

    文件的打包和压缩是另一种我们可能会常做的操作,比如说你想在服务器上部署一个wiki系统,下载了dokuwiki的压缩文件夹,这时候就需要解压啦。

    常见压缩格式

    • *.zip zip 程序打包压缩的文件
    • *.rar rar 程序压缩的文件
    • *.7z 7zip 程序压缩的文件
    • *.tar tar 程序打包,未压缩的文件
    • *.gz gzip 程序(GNU zip)压缩的文件
    • *.xz xz 程序压缩的文件
    • *.bz2 bzip2 程序压缩的文件
    • *.tar.gz tar 打包,gzip 程序压缩的文件
    • *.tar.xz tar 打包,xz 程序压缩的文件
    • *tar.bz2 tar 打包,bzip2 程序压缩的文件
    • *.tar.7z tar 打包,7z 程序压缩的文件

    使用zip压缩打包程序

    # 代码引用自实验楼相关课程
    $ zip -r -q -o shiyanlou.zip /home/shiyanlou
    # 查看文件大小
    $ du -h shiyanlou.zip
    $ file shiyanlou.zip
    # 设置不同压缩等级
    $ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip
    $ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip
    $ du -h -d 0 *.zip ~ | sort
    # 创建加密
    $ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou
    # 解决windows和linux对换行的不同处理问题
    $ zip -r -l -o shiyanlou.zip /home/shiyanlou
    

    参数说明:

    • -r:表示递归打包包含子目录的全部内容
    • -q:表示为安静模式,即不向屏幕输出信息
    • -o:表示输出文件,需在其后紧跟打包输出文件名
    • -[1-9]:设置压缩等级,1 表示最快压缩但体积大,9 表示体积最小但耗时最久。
    • -x:排除我们上一次创建的 zip 文件,否则又会被打包进这一次的压缩文件中
    • -e:创建加密压缩包
    • -l:将 LF(换行) 转换为 CR+LF(windows 回车加换行)

    使用unzip命令解压缩zip文件

    # 基本使用
    $ unzip shiyanlou.zip
    # 静默且指定解压目录,目录不存在会自动创建
    $ unzip -q shiyanlou.zip -d ziptest
    # 使用 -O(英文字母,大写 o)参数指定编码类型
    $ unzip -O GBK 中文压缩文件.zip
    

    rar打包压缩命令

    # 安装
    $ sudo apt-get update
    $ sudo apt-get install rar unrar
    
    # 基本使用,a(没有`-`) 参数添加一个目录 ~ 到一个归档文件中,如果该文件不存在就会自动创建
    $ rar a shiyanlou.rar .
    
    # 从指定压缩包文件中删除某个文件:
    $ rar d shiyanlou.rar .zshrc
    
    # 查看不解压文件:
    $ rar l shiyanlou.rar
    
    # 全路径解压:
    $ rar l shiyanlou.rar
    
    # 去掉路径解压:
    $ mkdir tmp
    $ unrar e shiyanlou.rar tmp/
    

    tar的使用

    说明:

    tar 原本只是一个打包工具,只是同时还是实现了对 7z、gzip、xz、bzip2 等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩,所以我们也无需再单独去学习其他几个工具,tar 的解压和压缩都是同一个命令,只需参数不同,使用比较方便。

    # 创建一个 tar 包:
    $ tar -cf shiyanlou.tar ~
    # 解压
    $ mkdir tardir
    $ tar -xf shiyanlou.tar -C tardir
    # 查看不解包文件 -t 参数
    $ tar -tf shiyanlou.tar
    # 创建不同格式压缩文件(gzip)
    $ tar -czf shiyanlou.tar.gz ~
    #解压gzip
    $ tar -xzf shiyanlou.tar.gz
    
    • -c:创建一个 tar 包文件
    • -f:指定创建的文件名,文件名必须写在-f参数后
    • -v:以可视的的方式输出打包的文件
    • -P:保留绝对路径符(默认不保留,防止解压到根目录)
    • -x:解压
    • -C:解压到指定路径的已存在目录
    • -z:使用gzip压缩

    其它压缩格式

    • *.tar.gz:-z
    • *.tar.xz:-J
    • *.tar.bz2:-j

    获取帮助

    Linux下的命令非常多,遇到不熟悉的命令的情况很常见,不过在Linux获取相应的帮助的方法也很简单,主要有以下几种方法:

    help

    help 命令是用于显示 shell 内建命令的简要帮助信息。帮助信息中显示有该命令的简要说明以及一些参数的使用以及说明。

    使用:help exit

    man

    man 没有内建与外部命令的区分,因为 man 工具是显示系统手册页中的内容,也就是一本电子版的字典,这些内容大多数都是对命令的解释信息,还有一些相关的描述。通过查看系统文档中的 man 也可以得到程序的更多相关信息和 Linux的更多特性。

    使用:man cowsay

    info

    得到的信息比 man 还要多,info 来自自由软件基金会的 GNU 项目,是 GNU 的超文本帮助系统,能够更完整的显示出 GNU 信息。
    man 和 info 就像两个集合,它们有一个交集部分,但与 man 相比,info 工具可显示更完整的 GNU 工具信息。若 man 页包含的某个工具的概要信息在 info 中也有介绍,那么 man 页中会有“请参考 info 页更详细内容”的字样。

    使用:info ls

    添加计划任务

    crontab 命令常见于 Unix 和类 Unix 的操作系统之中,用于设置周期性被执行的指令。该命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。通常,crontab 储存的指令被守护进程激活,crond 为其守护进程,crond 常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行。

    通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。比如我们需要每天半夜两点钟自动在线更新数据源,用这个命令进行相关设置就可以实现啦。

    crontab命令使用步骤

    1. 启动rsyslog方便查看日志信息:sudo service rsyslog start;
    2. 启动crontabsudo cron -f &;
    3. 添加任务:crontab -e,选择合适的编辑器,这里选择1,最后一排我们可以看到计划任务的格式# m h dom mon dow command;(分 时 日 月 周 命令)
    4. 在文档最后一排添加如下命令:*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)(每分钟添加一个以当前时间日期命名的空白文件)
    5. 使用crontab -l,查看添加了那些任务;
    6. 确定我们的 cron 是否成功的在后台启动,方式1:ps aux | grep cronpgrep cron;
    7. 在日志系统中查看信息反馈:sudo tail -f /var/log/syslog;
    8. 删除任务:crontab -r;
    9. 每个用户使用 crontab -e 添加计划任务,都会在 /var/spool/cron/crontabs 中添加一个该用户自己的任务文档,这样目的是为了隔离。以 sudo 权限编辑 /etc/crontab 文件就可以添加系统级别的定时任务;
    crontab -e 表示为当前用户添加计划任务
    sudo crontab -e 表示为root用户添加计划任务
    
    1. cron 服务监测时间最小单位是分钟,所以 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron/crontabs 里面的內容。

    /etc/cron.daily,目录下的脚本会每天执行一次,在每天的6点25分时运行;

    /etc/cron.hourly,目录下的脚本会每个小时执行一次,在每小时的17分钟时运行;
    /etc/cron.mouthly,目录下的脚本会每月执行一次,在每月1号的6点52分时运行;
    /etc/cron.weekly,目录下的脚本会每周执行一次,在每周第七天的6点47分时运行;

    命令执行顺序的控制

    简单的顺序执行可以安装以下方法,以;分隔众多命令,shell会自动执行:

    $ sudo apt-get update;sudo apt-get install some-tool;some-tool
    

    不过我们也可以有选择的执行命令:
    && 和 ||的使用:

    • &&:表示当前一条命令满足条件时执行后面的语句:
    $ which cowsay>/dev/null && cowsay -f head-in ohch~
    
    • ||:当前的命令不满足条件时执行的后面的语句
    $ which cowsay>/dev/null || echo "cowsay has not been install, please run 'sudo apt-get install cowsay' to install"
    
    • 二者一起使用:
    $ which cowsay>/dev/null && echo "exist" || echo "not exist"
    

    注:使用$?可以获取上一个命令的返回值(成功为0,不成功为1),which命令在前文中有叙述;

    管道

    管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。
    管道又分为匿名管道和具名管道。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的内容中我们已经多次使用到了。具名管道简单的说就是有名字的管道。

    # 获取etc文件下的详细信息,并以less的方式显示
    $ ls -al /etc | less
    

    Shell下的一些其它常用命令

    前面已经讲述了很多Shell下的常用命令,下面在列出一起其它常用的命令

    cut命令,打印每一行的某一字段

    # 打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录:
    $ cut /etc/passwd -d ':' -f 1,6
    
    # 前五个(包含第五个)
    $ cut /etc/passwd -c -5
    # 前五个之后的(包含第五个)
    $ cut /etc/passwd -c 5-
    # 第五个
    $ cut /etc/passwd -c 5
    # 2到5之间的(包含第五个)
    $ cut /etc/passwd -c 2-5
    
    • -d:用来定义分隔符,默认为tab键,一般与-f配合使用(如果分隔符是空格,必须是两个单引号之间确实有一个空格,是一个哦,不是支持多个)
    • -f:需要选取的字段,根据-d切分的字段集选取,下标从1开始
    • -s:表示不包括那些不含分隔符的行,用于去掉注释或者标题一类的信息
    • -c:以字符为单位进行分割,可以选取指定字符
    • -b:以字节为单位进行分割,可以选取指定字节,这些字节位置将忽略多字节字符边界(比如:汉字),除非同时指定了-n参数
    • -n:取消分割多字节字符,只能和-b参数配合使用,即如果字符的最后一个字节落在由-b参数列表指定的范围之内,则该字符将被选出,否则,该字符将被排除。

    grep 命令,在文本中或 stdin 中查找匹配字符串

    grep命令是很强大的,也是相当常用的一个命令,它结合正则表达式可以实现很复杂却很高效的匹配和查找
    查找,按照单引号匹配的内容进行搜索
    grep -n 'a' abc.txt:搜索abc.txt 文件中带a的内容
    - n:表示结果中带有行号。
    - i:忽略大小写
    -v: 取反 grep -v -n 'a' abc.txt:不带a

    使用格式

    grep [命令选项]... 用于匹配的表达式 [文件]...

    # 搜索/home/zhangwang目录下所有包含"zhangwang"的所有文本文件,并显示出现在文本中的行号:
    $ grep -rnI "zhangwang" ~
    

    wc 命令,简单小巧的计数工具

    wc 命令用于统计并输出一个文件中行、单词和字节的数目

    # 输出/etc/passwd文件的统计信息:
    $ wc /etc/passwd
    # 行数
    $ wc -l /etc/passwd
    # 单词数
    $ wc -w /etc/passwd
    # 字节数
    $ wc -c /etc/passwd
    # 字符数
    $ wc -m /etc/passwd
    # 最长行字节数
    $ wc -L /etc/passwd
    

    sort 排序命令

    将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。

    # 字典排序
    $ cat /etc/passswd | sort
    # 反转排序
    $ cat /etc/passwd | sort -r
    # 按特定字段排序
    $ cat /etc/passwd | sort -t':' -k 3
    # 按照数字排序就要加上-n参数
    $ cat /etc/passwd | sort -t':' -k 3 -n
    

    -t参数用于指定字段的分隔符,这里是以":"作为分隔符;-k 字段号用于指定对哪一个字段进行排序

    uniq 去重命令

    uniq命令可以用于过滤或者输出重复行。

    # 让history去掉命令后面的参数然后去掉重复的命令
    $ history | cut -c 8- | cut -d ' ' -f 1 | uniq
    # uniq命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序:
    $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq
    # 输出重复行
    # 输出重复过的行(重复的只输出一个)及重复次数
    $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc
    # 输出所有重复的行
    $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D
    

    shell中的文本处理

    使用vim等编辑器当然可以进行文本处理,不过这里我们要讨论的是使用命令来进行文本处理

    tr命令删除

    使用方法
    tr [option]...SET1 [SET2]

    常用选项
    选项 说明

    • -d 删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配
    • -s 去除set1指定的在输入文本中连续并重复的字符

    实例:

    # 删除 "hello world" 中所有的'o','l','h'
    $ echo 'hello world' | tr -d 'olh'
    # 将"hello" 中的ll,去重为一个l
    $ echo 'hello' | tr -s 'l'
    # 将输入文本,全部转换为大写或小写输出
    $ cat /etc/passwd | tr '[:lower:]' '[:upper:]'
    # 上面的'[:lower:]' '[:upper:]'你也可以简单的写作'[a-z]' '[A-Z]',当然反过来将大写变小写也是可以的
    

    col命令进行转换

    使用方法
    col [option]

    选项
    选项 说明
    -x 将Tab转换为空格
    -h 将空格转换为Tab(默认选项)

    cat命令打印文件内容

    打印文件内容,加重定向可实现复制功能:

    • cat 01.py > laowang.txt,把文件01.py的内容添加到laowang.txt中。
      同时打印多个文件的内容,后面的文件在后面显示
    • cat 01.py 02.py > laozhang.txt: 合并多个文件到某个文件中;

    实例:

    # 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
    $ cat -A /etc/protocols
    # 使用 col -x 将 /etc/protocols 中的 Tab 转换为空格,然后再使用 cat 查看,你发现 ^I 不见了
    $ cat /etc/protocols | col -x | cat -A
    

    join命令合并文件内容

    将两个文件中包含相同内容的那一行合并在一起。
    使用方式:
    join [option]... file1 file2

    选项
    选项 说明
    -t 指定分隔符,默认为空格
    -i 忽略大小写的差异
    -1 指明第一个文件要用哪个字段来对比,,默认对比第一个字段
    -2 指明第二个文件要用哪个字段来对比,,默认对比第一个字段

    paste命令合并文件

    join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。
    使用方法
    paste [option] file...
    常见参数
    -d 指定合并的分隔符,默认为Tab
    -s 不合并到一行,每个文件为一行

    数据流重定向

    还记得在Linux下输入输出也是文件么,数据流重定向的作用就是将原本输出到标准输出的数据重定向到一个文件中.

    对输入输出的描述--三个特殊设备

    • stdin(标准输入,对应于你在终端的输入),0 /dev/stdin 标准输入
    • stdout(标准输出,对应于终端的输出),1 /dev/stdout 标准输出
    • stderr(标准错误输出,对应于终端的输出)2 /dev/stderr 标准错误

    文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

    重定向模式有两种:
    >:将标准输出导向一个文件(如果该文件已经存在,则清空之前的文件)
    >>:将标准输出追加到一个文件中

    使用实例

    ➜  ~ echo 'lalala' > redirect
    ➜  ~ echo 'lalalalala' >> redirect
    ➜  ~ cat redirect                           
    lalala
    lalalalala
    ➜  ~ 
    

    标准错误输出的重定向

    # 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
    $ cat Documents/test.c hello.c >somefile  2>&1
    # 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
    $ cat Documents/test.c hello.c &>somefilehell
    

    使用tee命令同时重定向到多个文件

    将需要将输出重定向到文件之外也需要将信息打印在终端

    ➜  ~ echo 'hello shiyanlou' | tee hello                                                   
    hello shiyanlou
    ➜  ~ cat hello
    hello shiyanlou
    ➜  ~ 
    

    永久重定向exec命令

    可以使用exec命令实现“永久”重定向。exec命令的作用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向:

    # 先开启一个子 Shell
    $ zsh
    # 使用exec替换当前进程的重定向,将标准输出重定向到一个文件
    $ exec 1>somefile
    # 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
    $ ls
    $ exit
    $ cat somefile
    
    Applications
    Calibre 书库
    Desktop
    Documents
    Downloads
    Dropbox
    Git
    

    创建输出文件描述符

    默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符,另外我们还可以使用3-8的文件描述符,只是它们默认没有打开而已

    使用下面命令查看当前 Shell 进程中打开的文件描述符:

    $ cd /dev/fd/;ls -Al
    

    使用exec命令可以创建新的文件描述符

    $ zsh
    $ exec 3>somefile
    # 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录
    $ cd /dev/fd/;ls -Al;cd -
    # 注意下面的命令>与&之间不应该有空格,如果有空格则会出错
    $ echo "this is test" >&3
    $ cat somefile
    $ exit
    
    $ exec 3>&-
    $ cd /dev/fd;ls -Al;cd -
    

    完全屏蔽命令的输出 黑洞

    在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。

    $ cat Documents/test.c nefile 1>/dev/null 2>&1
    

    日志系统

    查看日志可以帮我们了解很多问题

    常见的日志一般存放在 /var/log 中

    日志的分类

    • 系统日志
    • 应用日志

    系统日志主要是存放系统内置程序或系统内核之类的日志信息如 alternatives.log 、btmp 等等,应用日志主要是我们装的第三方应用所产生的日志如 tomcat7 、apache2 等等。

    对不同日志名称及其描述如下:
    日志名称 记录信息

    • alternatives.log 系统的一些更新替代信息记录
    • apport.log 应用程序崩溃信息记录
    • apt/history.log 使用apt-get安装卸载软件的信息记录
    • apt/term.log 使用apt-get时的具体操作,如 package 的下载打开等
    • auth.log 登录认证的信息记录
    • boot.log 系统启动时的程序服务的日志信息
    • btmp 错误登陆的信息记录
    • Consolekit/history 控制台的信息记录
    • dist-upgrade dist-upgrade这种更新方式的信息记录
    • dmesg 启动时,显示屏幕上内核缓冲信息,与硬件有关的信息
    • dpkg.log dpkg命令管理包的日志。
    • faillog 用户登录失败详细信息记录
    • fontconfig.log 与字体配置有关的信息记录
    • kern.log 内核产生的信息记录,在自己修改内核时有很大帮助
    • lastlog 用户的最近信息记录
    • wtmp 登录信息的记录。wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等
    • syslog 系统信息记录

    查看方法
    less auth.log
    当然查看也可以用之前接触到的其它方法morecat等等。

    注:wtmp,lastlog两个日志不能直接用 less、cat、more 这样的工具来查看。其查看方法是使用last 与 lastlog 工具来提取其中的信息

    日志的产生

    • 一种是由软件开发商自己来自定义日志格式然后指定输出日志位置,
      • 还有一种方式就是 Linux 提供的日志服务程序,而我们这里系统日志是通过 syslog 来实现,提供日志管理服务。

    syslog 是一个系统日志记录程序,在早期的大部分 Linux 发行版都是内置 syslog,让其作为系统的默认日志收集工具,虽然时代的进步与发展,syslog 已经年老体衰跟不上时代的需求,所以他被 rsyslog 所代替了,较新的Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具

    # 开启
    sudo service rsyslog start
    
    ps aux | grep syslog
    

    rsyslog 的配置文件有两个,

    • 一个是 /etc/rsyslog.conf :第一个主要是配置的环境,也就是 rsyslog 的加载什么模块,文件的所属者等;
    • 一个是 /etc/rsyslog.d/50-default.conf。而第二个主要是配置的 Filter Conditions;

    rsyslog 主要是由 Input、Output、Parser 这样三个模块构成的,并且了解到数据的简单走向,首先通过 Input module 来收集消息,然后将得到的消息传给 Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。

    参考资料

    又是好长的一篇读书笔记,希望你在看完之后有所收获,希望本文能助你打开Linux的使用大门,附上我觉得比较好shell,Linux学习资料如下:

    多练习总能有所收获,祝学习愉快😝。

    相关文章

      网友评论

        本文标题:菜鸟的Linux上手指南-2

        本文链接:https://www.haomeiwen.com/subject/ljeyfxtx.html