前端我爱编程

菜鸟的Linux上手指南-2

2017-06-02  本文已影响195人  7091a52ac9e5

Linux的常用操作

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

软件的安装和卸载

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

在线安装

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

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

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

apt-get描述

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

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

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

实例

# 重装
$ 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的常见参数

使用实例

$ 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 中有效。

  1. Shell 本身内建的变量
  1. 从自定义变量导出的环境变量。

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

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

我们也可以安装生存周期划分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 -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

参数说明:

使用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

其它压缩格式

获取帮助

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

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]

常用选项
选项 说明

实例:

# 删除 "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命令打印文件内容

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

实例:

# 查看 /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下输入输出也是文件么,数据流重定向的作用就是将原本输出到标准输出的数据重定向到一个文件中.

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

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

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

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

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

日志的产生

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

# 开启
sudo service rsyslog start

ps aux | grep syslog

rsyslog 的配置文件有两个,

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

参考资料

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

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

上一篇下一篇

猜你喜欢

热点阅读