1、vi和vim编辑器
所有的Linux系统都会内建vi文本编辑器。
vim具有程序编辑的能力,可以看做是vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
1.1、vi和vim常用的三种模式
1.1.1、正常模式
以vim打开一个档案就直接进入正常模式了(这是默认的模式)。在这个模式中,你可以使用“上下左右”按键来移动光标,你可以使用“删除字符”或“删除整行”来处理档案内容,也可以使用“复制、粘贴”来处理你的文件数据。
1.1.2、插入模式
很多新手进入插入模式都只是用i。这样当然可以进入插入模式,但通常不是那么合适,因为 VIM 提供了很多进入插入模式的命令。下面是常用的一些:
i:在当前字符的左边插入
I:在当前行首插入
a:在当前字符的右边插入
A:在当前行尾插入
o:在当前行下面插入一个新行
O:在当前行上面插入一个新行
1.1.3、命令行模式
在这个模式中,可以提供你相关指令,完成读取、存盘、替换、离开vim、显示行号等的动作,则是在此模式中实现的。
1.2、正常模式下的快捷键
1)拷贝当前行:yy
2)粘贴:p
3)使用快捷键到文档的末行[G]和首行[gg]
4)删除当前行:dd
5)清空文件所有内容:
步:执行gg,这里是跳至文件首行
第二部:执行dG,这样就清空了整个文件
6)在文件中查找某个单词:/关键字 →回车查找 →输入n就是查找下一个
7)设置文件的行号,取消文件的行号:命令行下:set nu 和 :set nonu
8)撤销前一个动作[u]
9)将光标移动到指定行(例如第20行):
步:显示行号:set nu
第二步:输入行号20
第三步:输入shift+g
1.3、跳转到文件头
vim 文件名
输入冒号(:),这是打开命令输入框
输入命令1,这是数字1
1.4、跳转到文件尾
vim 文件名
输入冒号(:),这是打开命令输入框
输入命令$
1.5、在vim上查找字符串
vim 文件名
输入冒号(:),这是打开命令输入框
输入命令/要搜索的字符串或者字符;或者输入?要搜索的字符串或者字符
/与?两者的区别是前者是从上往下搜索,后者是从下往上搜索。
按下回车之后,可以看到vim已经把光标移动到该字符处和高亮了匹配的字符串(vi没高亮,因为它没有颜色)。
按下n (按n查找下一个匹配单词,按N查找上一个匹配单词。)
1.6、在vim上关闭高亮
vim 文件名
输入冒号(:),这是打开命令输入框
输入:nohlsearch 备注:nohlsearch是(no highlight search缩写)。
也可以输入:set nohlsearch
还可以输入缩写:noh
2、开机&重启命令
shutdown命令:
shutdown -h now:表示立即关机
shutdown -h 1:表示1分钟后关机
shutdown -r now:表示立即重启
halt:直接使用,效果等价于关机
reboot:直接使用,效果等价于重启
sync:把内存的数据同步到磁盘
注意:当我们关机或者重启时,都应该先执行一下sync命令,把内存的数据写入磁盘,防止数据丢失。
3、useradd添加用户
Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
基本语法:useradd 用户名
创建用户时直接加上组:useradd -g 用户组 用户名
注意:当创建用户成功后,会自动的创建和用户同名的家目录。
也可以通过useradd -d 指定目录 新用户名,给新创建的用户指定家目录。
指定或修改用户密码的指令:passwd 用户名
4、userdel删除用户
基本语法:userdel 用户名
userdel 用户名:在删除用户时,是保留用户的家目录。
userdel -r 用户名:在删除用户时,同时把用户的家目录删除。
注意:必须用root用户删除。
一般情况下,只删除用户,不删除用户家目录。
5、查询用户信息指令
基本语法:id 用户名
注意:当用户不存在时,返回无此用户。
6、切换用户
在操作Linux中,如果当前用户的权限不够,可以通过su - 指令,切换到高权限用户,比如root。
基本语法:su - 用户名
注意:从权限高的用户切换到权限低的用户,不需要输入密码,反之需要。
当需要返回到原来用户时,使用exit指令。
7、查看当前用户/登录用户
基本语法:whoami
或者who am i
8、用户组
类似于角色,系统可以对有共性的多个用户进行统一的管理。
创建用户组指令:groupadd 组名
删除用户组指令:groupdel 组名
修改用户组指令:usermod -g 用户组 用户名
9、用户和组的相关文件
9.1、/etc/passwd文件
用户(user)的配置文件,记录用户的各种信息。
每行的含义:用户名:口令:用户标识号:组标识号:注释性描述:家目录:登录Shell
9.2、/etc/shadow文件
口令的配置文件(密码和登录信息,是加密的)。
每行的含义:登录名:加密口令:后一次修改时间:小时间间隔:大时间间隔:警告时间:不活动时间:失效时间:标志
9.3、/etc/group文件
组(group)的配置文件,记录Linux包含的组的信息。
每行含义:组名:口令:组标识号:组内用户列表。
一般情况下,组内用户列表是看不到的。
10、指定运行级别
10.1、运行级别说明
0:关机
1:单用户【找回丢失密码】
2:多用户状态没有网络服务
3:多用户状态有网络服务
4:系统未使用保留给用户
5:图形界面
6:系统重启
常用的运行级别是3和5。
10.2、修改默认的运行级别
CentOS7系统下:
1)查看/etc/inittab文件
2)由文件说明可以看出,centos只有两种启动模式:
multi-user.target: analogous to runlevel 3 #命令行模式
graphical.target: analogous to runlevel 5 #图形模式
3)通过systemctl get-default 命令获取当前模式:
4)设置系统启动默认是按照图形模式还是命令行模式加载,修改启动模式:
systemctl set-default multi-user.target //设置成命令模式
systemctl set-default graphical.target //设置成图形模式
10.3、如何找回丢失的root密码
思路:进入单用户模式,然后修改root密码。因为进入单用户模式,root不需要密码就可以登录。
具体步骤:开机→在引导时输入 回车键→看到一个界面输入e →看到一个新的界面,选中第二行(编辑内核),再输入e →在命令行输入1 再输入回车键→再次输入b,这时就会进入到单用户模式。然后使用passwd指令来修改root密码。
注意:这种找回root密码的方式,需要服务器在人身边。
11、帮助指令
man [命令或配置文件] (功能描述:获得帮助信息)
例如:man ls
help [命令] (功能描述:获得shell内置命令的帮助信息)
例如:help cd
12、touch指令
touch指令创建空文件。
基本语法:touch 文件名称
13、more指令
more指令是一个机遇vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。
基本语法:more 要查看的文件
14、less指令
less指令用来分屏查看文件内容,它的功能与more指令类似。但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率。
基本语法:less 要查看的文件
15、ln指令
软链接也叫符号链接,类似于Windows系统里的快捷方式,主要存放了链接其他文件的路径。
功能描述:给原文件创建一个软链接。
基本语法:ln -s [原目录或文件] [软链接名]
例如:ln -s /root linkTOroot
删除软链接命令:rm -rf 软链接名
在删除软链接时,不要带/,否则提示资源忙。
注意:当我们使用pwd指令查看目录时,仍然显示的是软链接所在目录。
16、history指令
查看已经执行过的历史命令。
基本语法:history
显示近使用过的10个指令:history 10
执行历史编号为5的指令:!5
17、find指令
find指令将从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端。
基本语法:find [搜索范围] [选项]
常用选项:
-name <文件名>:按照指定的文件名查找文件
-user <用户名>:查找属于指定用户名的所有文件
-size <文件大小>:按照指定的文件大小查找文件
-maxdepth: 指定遍历搜索的大深度
-mindepth: 指定开始遍历搜索的小深度
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
size选项说明:+n是大于;-n是小于;n是等于
按时间查找
find . -mtime 1 #查找当前目录及子目录下前一天修改的文件find . -mtime +1 #查找当前目录及子目录下一天前修改的文件find . -mtime -1 #查找当前目录及子目录下一天内修改的文件
时间选项如下:
时间类型 描述
-atime 以文件/文件夹访问时间(天)查找
-mtime 以文件/文件夹修改时间(天)查找
-ctime 以文件/文件夹数据元(如权限等)修改时间(天)查找
-atime 以文件/文件夹访问时间(分钟)查找
-mtime 以文件/文件夹修改时间(分钟)查找
-ctime 以文件/文件夹数据元(如权限等)修改时间(分钟)查找
-newer file 以file文件为条件,查找比其新的文件/文件夹
-not -newer file 以file文件为条件,查找比其老的文件/文件夹
例如:find /home -name hello.txt
find /home -maxdepth 1 -name hello.txt
find /opt -user root
find / -size +20M
find / -size +200k
18、locate指令
locate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名称及路径的locate数据库,实现快速定位给定的文件。locate命令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate数据库。
基本语法:locate 搜索文件
注意:由于locate指令基于数据库进行查询,所以次运行前,必须使用updatedb指令创建locate数据库。
19、grep指令和管道符号|
grep过滤查找,默认区分大小写。
管道符“|”,表示将前一个命令的处理结果输出传递给后面的命令处理。
基本语法:grep [选项] 查找内容 源文件
常用选项:
-n 显示匹配行及行号
-I 忽略字母大小写
例如:cat hello.txt | grep -ni yes
20、gzip/gunzip指令
gzip用于压缩文件。gunzip用于解压文件。
基本语法:
gzip 文件 (功能描述:压缩文件,只能将文件压缩为*.gz文件)
gunzip 文件.gz (功能描述:解压文件)
注意:当我们使用gzip对文件进行压缩后,不会保留原来的文件。
21、zip/unzip指令
zip用于压缩文件。unzip用于解压文件。
基本语法:
zip [选项] xxx.zip 要压缩的内容 (功能描述:压缩文件和目录的命令)
unzip [选项] xxx.zip (功能描述:解压缩文件)
zip常用选项:
-r:递归压缩,即压缩目录
unzip常用选项:
-d <目录>:指定压缩后文件的存放目录
例如:zip -r mypackage.zip /home/
unzip -d /opt/tmp/ mypackage.zip
22、tar指令
tar指令是打包指令,打包后的文件是.tar.gz的文件
基本语法:
tar [选项] xxx.tar.gz 打包的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)
选项说明:
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名,切记,这个参数是后一个参数,后面只能接档案名。
-z 打包同时压缩
-x 解包.tar文件
-C 转到指定目录(注意:这个目录必须是已经存在的,否则会报错。)
例如1:tar -zcvf a.tar.gz a1.txt a2.txt
tar -zcvf myhome.tar.gz /home/
tar -zxvf a.tar.gz
tar -zxvf myhome.tar.gz -C /opt/tmp2/
例如2:tar -zxvf /usr/local/java/jdk-*.tar.gz -C /usr/local/java --strip-components 1
解压jdk-*到指定目录,-C是转到指定的目录,--strip-components 1是去除解压文件名前1层路径。/jdk1.8.0_131/bin/java去掉前1层路径为/bin/java 。
23、chown指令
修改文件所有者。
基本语法:chown 用户名 文件名
例如:chown tom a1.txt
24、ls指令
查看文件/目录所在组。
基本语法:ls -ahl
25、chgrp指令
修改文件所在的组。
基本语法:chgrp 组名 文件名
-R 如果是目录,则使其下所有子文件或目录递归生效
例如:chgrp police orange.txt
26、usermod指令
在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变猴哥用户所在的组。
改变用户所在组:
1)usrmod -g 组名 -G 附加组组名 用户名
2)usermod -d 目录名 用户名 (改变该用户登录的初始目录)
例如:usermod -g bandit tom
27、权限的基本介绍
ls -l中显示的内容如下:
-rw-r--r--. 1 root root 296 9月 30 06:12 hosts
0-9位说明:
1)第0位确定文件类型(d代表目录;-代表普通文件;l代表软链接;c代表字符设备【键盘、鼠标】;b代表块文件【硬盘】)
2)第1-3位确定所有者(该文件的所有者)拥有该文件的权限---User
3)第4-6位确定所属组(同用户组的)拥有该文件的权限---Group
4)第7-9位确定其他用户拥有该文件的权限---Other
28、rwx权限详解
rwx作用到文件:
1)[r]代表可读(read):可以读取、查看
2)[w]代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件。
3)[x]代表可执行(execute):可以被执行
rwx作用到目录:
1)[r] 代表可读(read):可以读取,ls查看目录内容
2)[w] 代表可写(write):可以修改,目录内创建+删除+重命名目录
3)[x] 代表可执行(execute):可以进入该目录
可用数字表示为:r=4,w=2,x=1。
因此rwx=4+2+1=7
29、修改权限-chmod指令
通过chmod指令,可以修改文件或者目录的权限
种方式:+、-、=变更权限
u:所有者
g:所有组
o:其他人
a:所有人(u、g、o的总和)
1)chmod u=rwx,g=rx,o=x 文件目录名
2)chmod o+w 文件目录名
3)chmod a-x 文件目录名
第二种方式:通过数字变更权限
r=4,w=2,x=1
chmod u=rwx,g=rx,o=x 文件目录名
相当于:chmod 751 文件目录名
30、修改文件所有者-chown指令
基本语法:
chown newowner file 改变文件的所有者
chown newowner:newgroup file 改变文件的所有者和所有组
-R 如果是目录,则使其下所有子文件或目录递归生效
31、crond任务调度
任务调度:是指系统在某个时间执行的特定的命令或程序。
任务调度分类:
1)系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等。
2)个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。
基本语法:crontab [选项]
常用选项:
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
如果只是简单的任务,可以不用写脚本,直接在crontab中加入任务即可。
对于比较复杂的任务,需要写shell脚本。
例如:通过crond文件加入ntpdate命令,让客户端周期性向服务器同步时间。
编辑vi /etc/crontab
追加内容如下:
0 1 * * * root ntpdate 192.168.4.183; hwclock -w
追加内容说明:每天凌晨1点从ntp服务器192.168.4.183同步时间。
参数详细说明:
5个占位符的说明:
注意事项:
1)*表示任何时候都匹配
2)"a,b,c" 表示a 或者 b 或者c 执行命令
3)"a-b" 表示a到b 之间 执行命令
4)"*/a" 表示每 a分钟(小时等) 执行一次
5)crontab 不能编辑系统级的 任务
6)环境变量的值,在crontab 文件中获取不到,所以要注意,可以写脚本
7)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%
crond相关命令:
1)crontab -r:终止任务调度
2)crontab -l:列出当前有哪些任务调度
3)systemctl restart crond:重启任务调度
32、lsblk指令
lsblk列出所有的块设备,而且还能显示他们之间的依赖关系。
基本语法:lsblk [选项]
常用选项:
-a 显示所有设备
-f 显示文件系统信息
-l 使用列表格式显示
-r 使用原始格式显示
-t 显示拓扑结构信息
注意:lsblk命令默认情况下,将以树状列出所有块设备。
lsblk默认选项不会列出所有空设备。要查看这些空设备使用-a选项。
33、如何增加一块硬盘
1)虚拟机添加硬盘
2)分区:fdisk /dev/sdb
3)格式化:mkfs -t ext4 /dev/sdb1
4)挂载
先创建一个目录mkdir /home/newdisk
挂载mount /dev/sdb1 /home/newdisk
5)设置可以自动挂载(挂载:通过修改/etc/fstab实现。)
在末尾加入下列行到vim /etc/fstab
/dev/sdb1 /home/newdisk ext4 defaults 0 0
添加完成后,执行mount -a即可生效。
或者重启服务器。
卸载:umount /dev/sdb1 或者 umount /home/newdisk
34、查询系统整体磁盘使用情况df
df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
基本语法:df -h
选项:
-a或--all:包含全部的文件系统;
-B --block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息。
实例:
df -h //检查磁盘空间使用率
df -ih //检查磁盘inode使用率
35、查询指定目录的磁盘使用情况du
du命令也是查看使用空间的,但是与df命令不同的是:du命令是查看当前指定文件或目录(会递归显示子目录)占用磁盘空间大小,还是和df命令有一些区别的。
基本语法:du [选项][目录或文件]
常用选项:
-s 指定目录占用大小汇总
-h 带计量单位
-a 含文件
--max-depth=1 指定查询子目录深度
-c列出明细的同时,增加汇总值
例如:du -s -h 文件夹名称
du -ach --max-depth=1 /opt
36、ls指令
1)统计/home文件夹下的文件个数
ls -l /home | grep "^-" | wc -l
2)统计/home文件夹下目录的个数
ls -l /home | grep "^d" | wc -l
3)统计/home文件夹下文件的个数,包括子文件夹里的
ls -lR /home | grep "^-" | wc -l
4)统计/home文件夹下目录的个数,包含子文件夹里的
ls -lR /home | grep "^d" | wc -l
5)以树状显示目录结构
tree
37、显示系统执行的进程
37.1、查看进程ps
ps命令是用来查看目前系统中正在执行的进程,一般使用的参数是ps -aux
ps -a:显示当前终端的所有进程信息
ps -u:以用户的格式显示进程信息
ps -x:显示后台进程运行的参数
ps显示的信息选项:
USER:用户名称
PID:进程号
%CPU:进程占用CPU的百分比
%MEM:进程占用物理内存的百分比
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
TTY:终端名称,缩写
STAT:进程状态,其中S-休眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等
STARTED:进程的启动时间
TIME:进程占用CPU的总时间
COMMAND:启动进程所用的命令和参数,如果过长会被截断显示
ps -ef是以全格式显示当前所有进程,可以查看进程的父进程。显示信息中的PPID就是父进程号。
-e:显示所有进程
-f:全格式
查看进程:ps -aux或者ps -ef
杀死进程:kill -9 PID
37.2、ps的查询结果通过管道给grep查找包含特定字符串的进程
管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。
查看进程:ps -ef | grep gds(这是进程名称)
杀死进程:kill -9 进程ID
37.3、使用pgrep
一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程ID查询的grep。
查看进程:pgrep gds(这是进程名称)
杀死进程:kill -9 进程ID
37.4、使用pidof
看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。
进程ID(英语:processID)、PID)是大多数操作系统的内核用于标识进程的一个数值。
和pgrep相比稍显不足的是,pidof必须给出进程的全名。
查看进程:pidof gds(这是进程全名)
杀死进程:kill -9 进程ID
37.5、使用pgrep和xargs
ps -ef | grep gds | grep -v grep | cut -c 9-15 | xargs kill -9
说明:
“grep gds”的输出结果是,所有含有关键字“gds”的进程。
“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。
“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
“xargs kill -9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -9”命令的参数,并执行该命令。“kill -9”会强行杀掉指定进程。
上述命令的缩写方式:
pgrep gds | xargs kill -9
或者kill -9 `pgrep gds`
37.6、使用pkill
看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。
pkill -9 gds(这是进程名称)
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。
pkill或者pgrep只要给出进程名的一部分就可以终止进程。
killall -9 gds(这是进程名称)
38、终止进程kill和killall
若某个进程执行一半需要停止时,或是已消耗了很大的系统资源时,此时可以考虑停止该进程。使用kill命令来完成此项任务。
基本语法:
kill [选项] 进程号 (功能描述:通过进程号杀死进程)
killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
常用选项:
-9:表示强迫进程立即停止
39、查看进程树pstree
基本语法:
pstree [选项] (功能描述:可以更加直观的查看进程信息)
常用选项:
-p:显示进程的PID
-u:显示进程的所属用户
40、服务(service)管理
40.1、服务(service)管理
服务(service)的本质就是进程,但是运行在后台中,通常都会监听某个端口,等待其它程序的请求,比如(mysql、sshd、防火墙等),因此我们又称为守护进程,是Linux中非常重要的知识点。
基本语法:
service 服务名 [start | stop | restart | reload | status]
在CentOS7.0以后,不再使用service,而是systemctl
注意:
1)关闭或者启用服务,这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
2)如果希望设置某个服务自启动或者关闭生效,要使用chkconfig指令。
40.2、查看服务名
ls -l /etc/init.d (功能描述:列出系统有哪些服务)
40.3、服务的运行级别(runlevel)
查看或者修改默认级别:vi /etc/inittab
Linux系统有7种运行级别(runlevel):常用的是级别3和5
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登录
运行级别2:多用户状态(没有NFS),不支持网络
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
开机的流程说明:
开机→BIOS→/boot→init进程→运行级别→运行级别对应的服务
40.4、chkconfig指令
通过chkconfig命令可以给每个服务的各个运行级别设置自启动/关闭。
基本语法:
1)查看服务 chkconfig --list | grep xxx
2)chkconfig 服务名 --list
例如:chkconfig iptables --list
3)chkconfig --level 5 服务名 on/off
注意:chkconfig重新设置服务自启动或关闭,需要重启系统reboot才能生效。
41、动态监控进程top
通过top命令检查CPU和内存使用率。
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。
基本语法:top [选项]
选项:
-b:以批处理模式操作;
-c:显示完整的治命令;
-d 秒数:屏幕刷新间隔时间;
-I:忽略失效过程;
-s:保密模式;
-S:累积模式;
-i<时间>:设置间隔时间;
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
-n<次数>:循环显示的次数。
top交互命令:
在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了-s选项, 其中一些命令可能会被屏蔽。
h:显示帮助画面,给出一些简短的命令总结说明;
H:show threads查看线程;
k:终止一个进程;
i:忽略闲置和僵死进程,这是一个开关式命令;
q:退出程序;
r:重新安排一个进程的优先级别;
S:切换到累计模式;
s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;
f或者F:从当前显示中添加或者删除项目;
o或者O:改变显示项目的顺序;
l:切换显示平均负载和启动时间信息;
m:切换显示内存信息;
t:切换显示进程和CPU状态信息;
c:切换显示命令名称和完整命令行;
M:根据驻留内存大小进行排序;
P:根据CPU使用百分比大小进行排序;
T:根据时间/累计时间进行排序;
w:将当前设置写入~/.toprc文件中。
实例:运行top命令监控CPU和内存使用率。
在top命令的显示窗口,我们还可以输入字母c,进行交互。用途是:切换显示命令名称和完整命令行。
检查完后,按“q”键退出查询。
42、查看系统网络情况netstat
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。
netstat -anp | more (功能描述:查看所有的网络服务)
netstat -anp | grep PID号
netstat -tunlp
语法:netstat [选项]
常用选项:
-a (all)显示所有选项,netstat默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。(重要)
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名(macOS中表示协议 -p protocol)
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计 (重要)
-c 每隔一个固定时间,执行该netstat命令。
例如:netstat -anp | grep sshd
42.1、查找被占用的端口netstat
netstat -tunlp
netstat -tunlp | grep 8888
备注:netstat -tunlp查看计算机端口使用情况,而netstat -tunlp | grep 8888 则是只查看端口8888的使用情况。
42.2、查看端口属于哪个程序?端口被哪个进程占用
lsof -i :8888
当结果出现大量CLOSE_WAIT状态的连接时,需要修改web服务器连接超时时间,数据库连接超时时间,服务器本身的连接超时时间。
43、rpm包的管理
43.1、rpm介绍
一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似Windows的setup.exe,这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。
43.2、查询软件是否安装
43.2.1、查询rpm包
rpm包安装的,可以用rpm -qa看到,如果要查找某软件包是否安装,用 rpm -qa | grep “软件或者包的名字”。
rpm -q 软件包名:查询软件包是否安装
rpm -qi 软件包名:查询软件包信息
rpm -ql 软件包名:查询软件包中的文件
rpm -qf 文件全路径名:查询文件所属的软件包
43.2.2、查询yum安装包
yum方法安装的,可以用yum list installed查找,如果是查找指定包,命令后加 | grep “软件名或者包名”;
[root@hexuweb102 ~] yum list installed | grep ruby
43.2.3、查询deb安装包
以deb包安装的,可以用dpkg -l能看到。
如果是查找指定软件包,用dpkg -l | grep “软件或者包的名字”;
[root@hexuweb102 ~] dpkg -l | grep ruby
43.2.4、以源码包自己编译安装
如果是以源码包自己编译安装的,例如.tar.gz或者tar.bz2形式的,这个只能看可执行文件是否存在了,
上面两种方法都看不到这种源码形式安装的包。如果是以root用户安装的,可执行程序通常都在/sbin:/usr/bin目录下。
说明:其中rpm yum 是Redhat系列linux的软件包管理命令;dpkg 是debian系列的软件包管理命令
43.3、卸载rpm包
基本语法:rpm -e 软件包名
注意:
1)如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
2)如果我们就是要删除这个rpm包,可以增加参数--nodeps,就可以强制删除,但是一般不推荐这么做,因为依赖于该软件包的程序可能无法运行。
例如:rpm -e --nodeps 软件包名
43.4、安装rpm包
基本语法:rpm -ivh 软件包全路径名称
参数说明:
i=install 安装
v=verbose 提示
h=hash 进度条
44、yum包的管理
44.1、yum介绍
Yum是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。使用yum的前提是可以联网。
44.2、yum基本指令
1)查询yum服务器是否有需要安装的软件
yum list | grep 软件包名
2)安装指定的yum包
yum install软件包名
45、监控资源使用率
45.1、通过iostat命令检查磁盘I/O使用率
iostat -xm 1 //1为间隔时间
上述命令执行结果中,有三个重要参数:
“rMB/s”为每秒读取的MB数,
“wMB/s”为每秒写入的MB数,
“%util”为硬盘使用率。
检查完后,按“Ctrl+c”键退出监控。
45.2、通过ifconfig命令检查网络
使用root用户身份登录服务器。
运行ifconfig命令查看服务器网络连接。
上述命令执行结果中,有三个重要参数:
“errors”表示收包错误的总数量。
“dropped”表示数据包已经进入了Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃的总数量。
“overruns”表示Ring Buffer队列中被丢弃的报文数目,由于Ring Buffer(aka Driver Queue)传输的IO大于kernel能够处理的IO导致。
分析时,如果发现上述三个值持续增长,表示网络负载过大或者存在网卡、内存等硬件故障。
45.3、通过sar命令查看网卡流量
使用root用户身份登录服务器。
sar -n DEV 1 //1为间隔时间
上述命令执行结果中,有两个重要参数:
“rxkB/s”为每秒接收的kB数。
“txkB/s”为每秒发送的kB数。
检查完后,按“Ctrl+c”键退出监控。
分析时,请主要关注每个网卡的传输量和是否达到传输上限。
45.4、通过sar命令查看CPU使用情况
使用root用户身份登录服务器。
sar -u 1 //1为间隔时间
输出项说明:
CPU all 表示统计信息为所有 CPU 的平均值。
%user 显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice 显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system 在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait 显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle 显示 CPU 空闲时间占用 CPU 总时间的百分比。
46、查看文件
46.1、查看文件类型file
file命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。
语法:file(选项)(参数)
选项:
-b:列出辨识结果时,不显示文件名称;
-c:详细显示指令执行过程,便于排错或分析程序执行的情形;
-f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
-L:直接显示符号连接所指向的文件类别;
-m<魔法数字文件>:指定魔法数字文件;
-v:显示版本信息;
-z:尝试去解读压缩文件的内容。
参数:
文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。
实例:file 文件名
46.2、统计文件中的行数wc
wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。
语法:wc [选项] 文件名
选项:
-l 统计行数。
-w 统计字数。
-c 统计字节数。
46.3、统计文件夹、文件数量
46.3.1查看当前目录下的文件数量(不包含子目录中的文件)
ls -l |grep "^-"|wc -l
说明:
(1)ls -l:长列表输出该目录下文件信息(注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等)
(2)grep "^-":这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d。即"^d"表示目录,"^-"表示文件。
(3)wc -l:统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于一行信息对应一个文件,所以也就是文件的个数。
46.3.2查看当前目录下的文件数量(包含子目录中的文件)
注意:R,代表子目录。
ls -lR|grep "^-"|wc -l
46.3.3查看当前目录下的文件夹目录个数(不包含子目录中的目录)
ls -l |grep "^d"|wc -l
46.3.4查看当前目录下的文件夹目录个数(包含子目录中的目录)
注意:R,代表子目录。
ls -lR|grep "^d"|wc -l
46.3.5查看指定目录下的文件数量(包含子目录中的文件)
xa 指定目录路径 -type f | wc -l
46.4、查看文件内容
46.4.1 cat命令
cat命令是linux的一个文本输出命令,通常是用于观看某个文件的内容的。cat只能浏览文件,而不能修改文件。
常用选项:-n 显示行号
注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。
为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。
实例:设m1和m2是当前目录下的两个文件。
cat m1 | grep more (在屏幕上显示文件m1的内容)
cat m1 | grep 字段内容 (查找文件m1中的内容)
cat m1 m2 (同时显示文件m1和m2的内容)
cat m1 m2 > file (将文件m1和m2合并后放入文件file中)
46.4.2 tail命令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然就是看档案的结尾。
命令格式:tail [参数] [文件]
命令参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
实例:
tail -f filename 监视filename文件的尾部内容(默认10行),循环刷新显示在屏幕上。退出,按下CTRL+C。
tail -n 20 filename 显示filename后20行。
head filename 显示filename的开头内容(默认10行)。
46.4.3 grep命令
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep -n 字段内容 filename
备注:
-n:输出包含匹配字符串的行数
grep命令的常用格式为:grep [选项] "模式" [文件]
grep家族总共有三个:grep,egrep,fgrep。
常用选项:
-E :开启扩展(Extend)的正则表达式。
-i :忽略大小写(ignore case)。
-v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
-n :显示行号
-w :被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
-c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
-o :只显示被模式匹配到的字符串。
--color :将匹配到的内容以颜色高亮显示。
-A n:显示匹配到的字符串所在的行及其后n行,after
-B n:显示匹配到的字符串所在的行及其前n行,before
-C n:显示匹配到的字符串所在的行及其前后各n行,context
模式部分:
1、直接输入要匹配的字符串,这个可以用fgrep(fast grep)代替来提高查找速度,比如我要匹配一下hello.c文件中printf的个数:grep -c "printf" hello.c
2、使用基本正则表达式,下面谈关于基本正则表达式的使用:
匹配字符:
. :表示任意一个字符。
[abc] :表示匹配一个字符,这个字符必须是abc中的一个。
[a-zA-Z] :表示匹配一个字符,这个字符必须是a-z或A-Z这52个字母中的一个。
[^123] :匹配一个字符,这个字符是除了1、2、3以外的所有字符。
对于一些常用的字符集,系统做了定义:
[A-Za-z] 等价于 [[:alpha:]]
[0-9] 等价于 [[:digit:]]
[A-Za-z0-9] 等价于 [[:alnum:]]
tab,space 等空白字符 [[:space:]]
[A-Z] 等价于 [[:upper:]]
[a-z] 等价于 [[:lower:]]
标点符号 [[:punct:]]
匹配次数:
\{m,n\} :匹配其前面出现的字符至少m次,至多n次。
\? :匹配其前面出现的内容0次或1次,等价于\{0,1\}。
* :匹配其前面出现的内容任意次,等价于\{0,\},所以 ".*" 表述任意字符任意次,即无论什么内容全部匹配。
位置锚定:
^ :锚定行首
$ :锚定行尾。
技巧:"^$"用于匹配空白行。
\b或\<:锚定单词的词首。如"\blike"不会匹配alike,但是会匹配liker
\b或\>:锚定单词的词尾。如"\blike\b"不会匹配alike和liker,只会匹配like
\B :与\b作用相反。
分组及引用:
\(string\) :将string作为一个整体方便后面引用
\1 :引用第1个左括号及其对应的右括号所匹配的内容。
\2 :引用第2个左括号及其对应的右括号所匹配的内容。
\n :引用第n个左括号及其对应的右括号所匹配的内容。
3、扩展的(Extend)正则表达式(注意要使用扩展的正则表达式要加-E选项,或者直接使用egrep):
匹配字符:这部分和基本正则表达式一样
匹配次数:
* :和基本正则表达式一样
? :基本正则表达式是\?,二这里没有\。
{m,n} :相比基本正则表达式也是没有了\。
+ :匹配其前面的字符至少一次,相当于{1,}。
位置锚定:和基本正则表达式一样。
分组及引用:
(string) :相比基本正则表达式也是没有了\。
\1 :引用部分和基本正则表达式一样。
\n :引用部分和基本正则表达式一样。
或者:
a|b :匹配a或b,注意a是指 | 的左边的整体,b也同理。比如 C|cat 表示的是 C或cat,而不是Cat或cat,如果要表示Cat或cat,则应该写为 (C|c)at 。记住(string)除了用于引用还用于分组。
注1:默认情况下,正则表达式的匹配工作在贪婪模式下,也就是说它会尽可能长地去匹配,比如某一行有字符串 abacb,如果搜索内容为 "a.*b" 那么会直接匹配 abacb这个串,而不会只匹配ab或acb。
注2:所有的正则字符,如 [ 、* 、( 等,若要搜索 * ,而不是想把 * 解释为重复先前字符任意次,可以使用 \* 来转义。
46.4.4 sed命令
sed:Stream Editor文本流编辑,sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。
语法:sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行);
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行;
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦。
例如1:使用行号显示文件中的某一行
sed -n '行号p' filename
或者sed -n '(行号+1)p' filename 如果数据源中有表头就需要行号+1。
显示行:sed -n '1p' test.txt
显示行至第五行:sed -n '1,5p' test.txt
显示行和第五行:sed -n '1p;5p' test.txt
显示含有first字符所在的行:sed -n '/first/p' test.txt
例如2:把文件里面的192字符替换为10
sed 's/192/10/g' test.txt
46.5、sed批量替换文本中字符串
命令:
sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`
参数:
-i 直接修改读取的文件内容,而不是输出到终端。会匹配file文件中每一行的个并替换。
s 替换指定字符
g 表示行内全面替换
-r 表示搜索子目录
-l 表示输出匹配的文件名
47、echo命令
echo命令用于字符串的输出。
echo选项列表:
选项
描述
-n
不输出末尾的换行符。
-e
启用反斜线转义。
/b
退格
//
反斜线
/n
新行
/r
回车
/t
水平制表符
/v
垂直制表符
注意: Linux中的选项‘-e‘扮演了转义字符反斜线的翻译器。
例如:
将本行内容渲染为绿色:echo -e '\033[32m------------------------------------------\033[0m'
将本行及本行之后的所有内容渲染为绿色:echo -e '\033[32m------------------------------------------\033[1m'
48、Linux下Shell重定向
48.1、标准输入,标准输出与标准错误输出
Linux下系统打开3个文件,标准输入,标准输出,标准错误输出。
标准输入:从键盘输入数据,即从键盘读入数据。
标准输出:把数据输出到终端上。
标准错误输出:把标准错误输出到终端上。
默认的标准输入指的是键盘,
默认的标准输出与标准错误输出指的是屏幕或者是终端。
系统为这三个文件分配了文件标识符fd(file descripter).
在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。它们的文件标识符,分别为0,1,2.
48.2、重定向
重定向分为输入重定向与输出重定向。
所谓的输入重定向即输入不从键盘读入,而是从文件输入或其它。
所谓的输出重定向即不输出到终端上,而是输出到文件中去或其它。
""<"表示输入重定向运算符,">"表示输出重定向运算符。
"<<"这种输入告诉Shell,当前标准输入来自命令行的一对分隔号的中间内容。
">>",用">"输出时,如果文件不存在会自动建立一个文件,如果第二次输入时,会覆盖前一次的输入内容,而">>"表示把第二次的输出内容追加到文件中去,而不是覆盖。
48.3、Linux下输出重定向的典型分析
(1) a.out > outfile 2>&1
(2) a.out 2> &1 >outfile
分析:
0代表标准输入,1代表标准输出,2代表标准错误输出。其中1(即>=1>)可以省略,默认为标准输出。
(1)首先把a.out重定向到outfile文件中去。然后把 2>&1把标准错误输出重定向到标准输出中去。此时的标准输出已经重定向了,相当于把标准输出与标准错误输出都一起重定向到outfile 中去。 &1代表的是标准输出的文件描述符。1一般放在左边表示标准输出重定向到什么位置,而1放在右边是重定向到标准输出中,所以用&区分一 下,表示标准输出的文件描述符。2>1表示把标准错误重定向到文件1中去,2>&1则表示标准错误重定向到标准输出中去。
(2)首先把标准错误输出重定向到标准输出中,此时标准输出还在终端。因此标准错误也在终端。然后标准输出到outfile中去了。而标准错误还是在终端。
因此,(1)表示标准输出与标准错误都到outfile中去了。
(2)表示标准输出到outfile,但标准错误输出仍然在终端。
ls 1>/dev/null 2>/dev/null
ls >/dev/null 2>&1
/dev/null是一个垃圾箱,是一个无底洞,表示的含义为不显示。
即标准输出与标准错误输出不显示。
以上两个命令表示的含义是相同的。
48.4、举例
48.4.1、输入重定向
[root@localhost ~]# wc</etc/inittab
53 229 1666
wc统计行数,单词数, 字符数
其中wc的输入来自 /etc/inittab
[root@localhost ~]# wc <<aa
> 1
> 11
> 111
> aa
3 3 9
wc统计分隔符aa之间的内容。
48.4.2、输出重定向
[root@localhost ~]# ps -ef >a.txt //把进程的信息输出重定向到a.txt文件中去
[root@localhost ~]# ps -ef> >a.txt //进程信息追加到a.txt的文件中去
其实,所谓的输入输出重定向就是不从键盘输入和屏输出。
48.5、bash shell 重定向的几个特殊文件
文件 说明
/dev/stdin 文件描述符 0 的复制品
/dev/stdout 文件描述符 1 的复制品
/dev/stderr 文件描述符 2 的复制品
/dev/fd/n 文件描述符 n 的复制品
/dev/tcp/host/port Bash 在 port 打开到 host 的 TCP 连接
/dev/udp/host/port Bash 在 port 打开到 host 的 UDP 连接
49、shell条件判断、参数以及变量替换
49.1、test命令
test命令是shell内部命令,它计算作为其参数的表达式是真还是假。
如果表达式为真,则test返回0(注意与C语言0表示false不同),如果表达式为假,返回非0。
shell提供了另外一个调用test命令的方式,就是用方括号[]来代替单词test。
调用test命令的格式为:
test expr1 opr expr2 或是 [ expr1 opr expr2 ]
test opr expr1 或是 [ opr expr1 ]
(注意方括号与表达式之间的空格必须存在)
49.2、逻辑运算符
-a expr1 -a expr2 逻辑与
-o expr1 -o expr2 逻辑或
! !expr1 逻辑非
49.3、数值判断
-eq num1 -eq num2 等于
-ne num1 -ne num2 不等于
-gt num1 -gt num2 大于
-ge num1 -ge num2 大于或等于
-lt num1 -lt num2 小于
-le num1 -le num2 小于或等于
49.4、字符串判断
= str1 = str2 字符串是否相等
!= str1 != str2 字符串是否不等
-n -n str1 字符串长度是否不等于0
-z -z str2 字符串长度是否等于0,即空字符串
49.5、文件判断
-f -f filename 判断文件是否存在
-d -d dirname 判断目录是否存在
-r -r filename 文件是否存在且可读
-w -w filename 文件是否存在且可写
-s -s filename 文件是否存在且长度非0
49.6、命令行参数/位置变量
$0 当前程序的名称
$1, $2, ..., $9 当前程序的第1个到第9个命令行参数
$* 或是 $@ 所有命令行参数(不包括程序本身)
$# 当前程序的参数个数(不包括程序本身)
$? 后一条命令执行完成后的状态,一般返回0表示执行成功。
$$ 正在执行进程的ID(PID)
$UID 当前用户的ID
$PWD 当前所在的目录
给位置变量赋值:
set One Two Three
echo $1 $2 $3
结果显示:One Two Three
49.7、shift命令
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。
这条命令可以对位置参数进行移动,每次调用都会导致:$1=$2、$2=$3、$3=$4....
例如:
until [ $# -eq 0 ]
do
echo "个参数为: $1 参数个数为: $#"
shift
done
执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4
结果显示如下:
个参数为: 1 参数个数为: 4
个参数为: 2 参数个数为: 3
个参数为: 3 参数个数为: 2
个参数为: 4 参数个数为: 1
从上可知 shift 命令每执行一次,变量的个数($#)减一,而变量值提前一位。
49.8、将变量用双引号括起来
当在对变量进行判断时好将变量用双引号括起来,这样可以避免参数包含空格或是TAB带来的问题。
如:"$HOME"、"$#"
49.9、变量替换(赋值)
shell提供了变量替换功能,使用户能够检查变量的值并根据选项改变它的值。
$variable 保存在variable中的值
${variable} 保存在variable中的值
${variable:-string} 如果variable的值非空,则值为variable,否则值为string
${variable:+string} 如果variable的值非空,则值为string,否则值为空
${variable:=string} 如果variable的值非空,则值为variable,否则值为string且variable的值设置为string
${variable:?string} 如果variable的值非空,则值为variable,否则显示string并退出
50、if条件语句
50.1、测试数字大小
#!/bin/bash
NUM1=100
NUM2=200
if (($NUM1 > $NUM2));then
echo "This $NUM1 greate $NUM2 !"
else
echo "This $NUM1 little $NUM2 !"
fi
50.2、测试目录是否存在,不存在则新建
注意:中括号之间必须要空格。
#!/bin/bash
if [ ! -d /data/20140515 ];then
mkdir -p /data/20140515
else
echo "This DIR is exist.Please exit …"
fi
50.3、多个条件测试判断
#!/bin/bash
scores=80
if [[ $scores -gt 85 ]]; then
echo "very good!"
elif [[ $scores -gt 75 ]]; then
echo "good!"
elif [[ $scores -gt 60 ]]; then
echo "pass!"
else
echo "no pass!"
fi
51、for 循环语句
51.1、打印seq数字循环
#!/bin/bash
for i in `seq 15`
do
echo "NUM is $i"
done
51.2、求和1-100的值
#!/bin/bash
j=0
for ((i=1;i<=100;i++))
do
j=`expr $i + $j`
done
echo $j
51.3、找到相关log,然后批量打包
#!/bin/bash
for i in `find /var/log -name "*.log"`
do
tar -czf 2014log.tgz $i
done
51.4、远程主机批量传输文件
#!/bin/bash
for i in `seq 100 200`
do
scp -r /tmp/text.txt root@192.168.1.$i:/data/webapps/www
done
51.5、远程主机批量执行命令
#!/bin/bash
for i in `seq 100 200`
do
ssh -l root 192.168.1.$i 'ls /tmp'
done
52、while 循环语句
52.1、while条件判断数字
#!/bin/bash
i=1
while [[ $i -lt 10 ]]
do
echo $i
((i++))
done
52.2、扩展讲解read命令
read -p "please input number:" input
echo $input
52.3、while逐行读取某个文件
#!/bin/bash
while read line
do
echo $line
done < /etc/hosts
53、until循环语句
53.1、until基本语法
until 条件
do
action
done
直到满足条件,才退出。否则执行action。
53.2、条件判断数字
#!/bin/bash
a=10
until [[ $a -lt 0 ]]
do
echo $a
((a--))
done
54、case选择语句
54.1、case基本语法
case $arg in
pattern1)
语句1
;;
pattern2)
语句2
;;
*)
语句3
;;
esac
54.2、创建选择参数脚本
#!/bin/bash
case $1 in
monitor_log)
monitor_log
;;
archive_log)
archive_log
;;
*)
echo "Usage:{$0 monitor_log | archive_log | help}"
;;
esac
55、select选择语句
select一般用于选择菜单的创建 ,可以配合PS3来做菜单的打印输出信息。
#!/bin/bash
PS3="What you like most of the open source system?"
select i in CentOS RedHat Ubuntu
do
echo "Your Select System:"Si
done
56、一维数组
A=(test1 test2 test3) 定义数组一般以括号的方式来定义,数组的值可以随机定义。
echo ${A[0]} 代表引用个数组变量,结果会显示test1,数组引用从0开始,代表个数组,依次类推。
echo ${A[1]} 代表引用第二个数组变量,结果会显示test2,数组引用也是从0开始计算的。
echo ${A[@]} 显示该数组所有参数test1 test2 test3
echo ${#A[@]} 显示该数组的参数个数3
例如替换第二个test2数组为test5:echo ${A[@]/test2/test5}
例如删除test3数组命令为:unset A[2]; 然后查看效果echo ${A[@]}
57、sort命令
sort命令用于将文本文件内容加以排序。sort可针对文本文件的内容,以行为单位来排序。
语法:
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
参数说明:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
--help 显示帮助。
--version 显示版本信息。
例如:将文件中的数字按照数值降序排序
sort -nr text.txt
58、awk命令
awk是一种可以处理数据、产生格式化报表的语言,功能十分强大。awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个字段的值.
awk '{print $NF}' file-----打印后一个字段。
awk -F "|" '{print $1}' file-----按照新的分隔符“|”进行操作。
awk '/^(no|so)/' test-----打印所有以模式no或so开头的行。
awk '/^[ns]/{print $1}' test-----如果记录以n或s开头,就打印这个记录。
awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果个域以两个数字结束就打印这个记录。
awk '$1 == 100 || $2 < 50' test-----如果个或等于100或者第二个域小于50,则打印该行。
awk '$1 != 10' test-----如果个域不等于10就打印该行。
awk '/test/{print $1 + 10}' test-----如果记录包含正则表达式test,则个域加10并打印出来。
awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。
awk '/^root/,/^mysql/' test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。
59、rsync命令
rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。
强制完全同步(即在目标文件目录中删除不一致的文件):
rsync -aP --delete 源文件目录 目标文件目录
归档模式同步(即在目标文件目录中不删除不一致的文件):
rsync -av 源文件目录 目标文件目录
60、mail命令发送邮件
mail -s "邮件主题" 收信人邮件地址 -c "抄送地址" -b "密送地址" -f "发送人邮件地址" -F "发送人姓名" <发送的邮件内容
61、全量备份和增量备份Linux系统脚本
在Linux中,我们经常需要备份系统重要文件,例如/etc、/boot分区、重要网站数据等等,如果每天都完整备份的话,会占用很大的空间,那么我们该如何备份呢?
这里采用如下方法来备份:每周日进行完整备份,其余每天为增量备份。
那使用什么命令来备份呢,我们使用tar命令:
全量备份:tar -g /tmp/snapshot -czvf /tmp/2014_full_system_data.tar.gz /data/sh/
增量备份:tar -g /tmp/snapshot -czvf /tmp/2014_add01_system_data.tar.gz /data/sh/
年:YEAR=`data +%Y`
月:MONTH=`data +%m`
日:DAY=`data +%d`
星期:week=`data +%u`
sh -n 脚本名 :-n参数是测试脚本能否正常运行(没有真正执行)
sh -x 脚本名 :-x参数可以查看脚本执行的过程
62、自动禁止恶意IP访问
对所有用户开放了22端口,所以每天看/var/log/secure文件里面,是否有恶意攻击的IP。怎么让这些恶意IP尝试4次就拒绝访问22端口了呢?
#!/bin/bash
#定义变量
SEC_FILE=/var/log/secure
#如下为获取secure文件恶意IP远程登录22端口,大于等于4次就写入防火墙,禁止以后再登录服务器的22端口,egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"是匹配IP的意思,[0-9]表示任意一个数,{1,3}表示匹配1~3次。
IP_ADDR=`tail -n 1000 /var/log/secure | grep "Failed password" | egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort -nr | uniq -c | awk '$1>=4 {print S2}'`
IPTABLE_CONF=/etc/sysconfig/iptables
echo
cat <<EOF
+++++++++++++++++++++Welcome to use ssh login drop failed ip+++++++++++++++++++++++
EOF
for I in `echo $IP_ADDR`
do
#查看iptables配置文件是否含有提取的恶意IP信息
cat $IPTABLE_CONF | grep $i >/dev/null
if
[ $? -ne 0 ];then
#判断iptables配置文件里面是否存在已经拒绝的IP,如果不存在,就不再添加相应条目。sed a参数的意思是在匹配行之后加入新的行。
sed -I "/lo/a -A INPUT -s $i -m state --state NEW -m tcp -p tcp --dport 22 -j DROP" $IPTABLE_CONF
else
#如何存在的话,就打印提示信息即可
echo "This is $i is exist in iptables,please exit ……"
fi
done
#后重启iptables生效
/etc/init.d/iptables restart
63、locale命令
locale 命令是将有关当前语言环境或全部公共语言环境的信息写到标准输出上。公共语言环境是所有应用程序可以使用的语言环境。
为了写出每个当前语言环境类别的名字和值,请不要指定任何标志或变量。为了写出所有可用公共语言环境的名字,请指定 -a 标志。为了写出所有可用的字符映射(charmap)文件的名称列表,请指定 -m 标志。这些字符映射文件名是localedef 命令指定的 -f 标志的合适的值。
locale的命名规则:如zh_CN.GBK,zh代表中文, CN代表大陆地区,GBK表示字符集。
“locale相关环境变量”介绍
名称
说明
LC_CTYPE
使用所指定locale的字符集
LC_COLLATE
使用所指定locale的排序规则
LC_TIME
使用所指定locale的日期与时间格式
LC_NUMERIC
使用所指定locale的数字格式
LC_MONETARY
使用所指定locale的货币格式
LC_MESSAGES
使用所指定locale的响应与信息
LC_PAPER
使用所指定locale的的纸张大小
LC_NAME
使用所指定locale的称呼
LC_ADDRESS
使用所指定locale的地址格式
LC_TELEPHONE
使用所指定locale的电话格式
LC_MEASUREMENT
使用所指定locale的度量单位
LC_IDENTIFICATION
使用所指定locale的元数据信息
其中,LC_CTYPE,用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是重要的一个环境变量。
另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。 LANGUAGE参数可同时设置多种语言信息,如LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"。
LANG,LC_*的默认值,是低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。
LC_ALL,它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响。
例1:为了检索当前语言环境的所有环境变量的名称和值,请输入:locale
例2:为了确定当前的字符映射,请输入:locale charmap
例3:为了检索当前语言环境的 decimal_point 定界符的值,请输入:
locale -ck decimal_point
64、systemctl命令
近开始使用systemd,相比于以往使用service命令,或者直接修改/etc/init.d,或者chkconfig这样多种工具搭配来完成一个系统服务的配置,部署,systemd的野心极大,它要让一切都回归统一,redhat系已经将systemd作为了其默认的系统服务管理工具。
1)启动级别配置
由于工作需要,常常会在虚拟机中安装各类linux系统,而绝大部分时间,我们需要的只是一个文字界面,能够通过host ssh到VM中,图形界面没必要起着,白白浪费cpu和内存,通过systemctl命令配置默认进入文字界面,只需一行:
systemctl set-default multi-user.target
如果要切回图形界面,输入命令:
systemctl set-default graphical.target
2)开机启动服务
systemctl enable ***.service
3)停止开机启动服务
systemctl disable ***.service
4)启动/停止/重启服务
systemctl start/stop/restart ***.service
5)查询服务状态
systemctl status ***.service
6)在远程机器上执行命令,类似ssh user@host ""
systemctl -H user@hostname
7)列出系统服务,-t后用tab键可以关联出所有支持的unit类型
systemctl -t service
8)列出所有已经加载的units的状态
systemctl -a
9)列出加载的units/sockets/timers
systemctl list-units [pattern]
systemctl list-sockets [pattern]
systemctl list-timers [pattern]
10)查询某项服务是否active,以sshd.serice为例
systemctl is-active sshd.service
11)直接查看某项服务的配置文件,以sshd.serice为例
systemctl cat sshd.service
12)查看服务的依赖关系,以sshd.serice为例
systemctl list-dependencies sshd.service
13)查看环境变量
systemctl show-environment
systemctl list-unit-files 查看开机启动项
systemctl is-enabled ntpd.service 查看是否开机启动
65、timedatectl命令
在CentOS 6版本,时间设置有date、hwclock命令,
硬件时钟和系统时钟
(1) 硬件时钟
RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。
(2) 系统时钟
一般在服务器启动时复制RTC时间,之后独立运行,保存了时间、时区和夏令时设置。
从CentOS 7开始,使用了一个新的命令timedatectl
timedatectl 命令:
(1) 读取时间
timedatectl //等同于 timedatectl status
(2) 设置时间
timedatectl set-time "YYYY-MM-DD HH:MM:SS"
(3) 列出所有时区
timedatectl list-timezones
(4) 设置时区
timedatectl set-timezone Asia/Shanghai
(5) 是否NTP服务器同步
timedatectl set-ntp yes //yes或者no
(6) 将硬件时钟调整为与目前的系统时钟一致
hwclock --systohc
(7) 将系统时钟调整为与目前的硬件时钟一致
hwclock --hctosys
注意: 硬件时钟默认使用UTC时间,因为硬件时钟不能保存时区和夏令时调整,修改后就无法从硬件时钟中读取出准确标准时间,因此不建议修改。修改后系统会出现下面的警告。
GMT、UTC、CST、DST 时间
(1) UTC
整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。
(2) GMT
格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同,本文中不做区分)
(3) CST
中国标准时间 (China Standard Time)
(4) DST
夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用。(中国不使用)
GMT + 8 = UTC + 8 = CST
66、监控系统资源工具nmon_x86_64_rhel5
cd /opt/(nmon_x86_64_rhel5工具所在路径)
./nmon_x86_64_rhel5
输入c 是CPU监控
输入m 是内存监控
输入d 是磁盘监控
67、查看数据是否下盘watch
watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示。
语法:watch (选项) (参数)
选项:
-n:指定指令执行的间隔时间(秒);
-d:高亮显示指令输出信息不同之处;
-t:不显示标题。
参数:
指令:需要周期性执行的指令。
实例:
watch -n 3 du -h /srv/BigData/hadoop/data*/master*/base/pgsql_tmp
68、exec与xargs区别
区别描述: 两者都是对符合条件的文件执行所给的Linux 命令,而不询问用户是否需要执行该命令。
-exec:参数后面跟的是 command 命令,以;分号表示comman命令的结束。\是转义符,因为分号在命令中还有它用途,所以就用一个\;来限定表示这是一个分号而不是表示其它意思。
{} 花括号代表前面find查找出来的文件名。
注意:exec 选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个\,后是一个分号。
-ok: 和 -exec 的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数所给出的shell给出的这个命令之前,都会给出提示,让用户来确定是否执行。
例如:在当前目录下(包含子目录),删除所有txt文件
find ./ -name "*.txt" -exec rm -rf {} \;
xargs 要结合管道来完成
格式:find [option] express |xargs command
-d选项:默认情况下xargs将其标准输入中的内容以空白(包括空格、Tab、回车换行等)分割成多个之后当作命令行参数传递给其后面的命令,并运行之,我们可以使用 -d 命令指定分隔符。
例如:echo '11@22@33' | xargs -d '@' echo
输出:11 22 33
-p选项:使用该选项之后xargs并不会马上执行其后面的命令,而是输出即将要执行的完整的命令(包括命令以及传递给命令的命令行参数),询问是否执行,输入 y 才继续执行,否则不执行。
-E选项:有的系统的xargs版本可能是-e。该选项指定一个字符串,当xargs解析出多个命令行参数的时候,如果搜索到-e指定的命令行参数,则只会将-e指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令。注意:-E只有在xargs不指定-d的时候有效
例如:echo '11 22 33' | xargs -E '33' echo
输出:11 22
很明显,exec是对每个找到的文件执行一次命令,除非这单个的文件名超过了几k,否则不会出现命令行超长出报错的问题。
而xargs是把所有找到的文件名一股脑的转给命令。当文件很多时,这些文件名组合成的命令行参数很容易超长,导致命令出错。
另外, find | xargs 这种组合在处理有空格字符的文件名时也会出错,因为这时执行的命令已经不知道哪些是分割符、哪些是文件名中的空格! 而用exec则不会有这个问题。
相比之下,也不难看出各自的缺点:
(1)exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;
(2)exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \; 作为命令的结束符,书写不便。
(3)xargs 不能操作文件名有空格的文件;
综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,那么使用 xargs比较方便; 否则,就要用 exec了。
69、linux下Ctrl常用组合键
Ctrl+c 结束正在运行的程序
Ctrl+d 结束输入或退出shell【结束当前命令窗口】
Ctrl+s 暂停屏幕输出【锁住终端】
Ctrl+q 恢复屏幕输出【解锁终端】
Ctrl+l 清屏,【是字母L的小写】等同于Clear
Ctrl+a 切换到命令行开始
Ctrl+e 切换到命令行末尾
Ctrl+u 清除剪切光标之前的内容
Ctrl+k 清除剪切光标及光标之后的内容
Ctrl+y 在光标处粘贴剪切的内容
Ctrl+r 查找历史命令【输入关键字,就能调出以前执行过的命令】
Ctrl+t 调换光标所在处与其之前字符位置,并把光标移到下个字符
Ctrl+x+u 撤销操作
70、linux下&&和;的区别
相似:在前后语句均为true的情况下均可做为and执行。
区别:&&必须前一句成功才会执行下一句 ; 不管前一句是否执行成功均会执行后一句。
结论:&&在前一句报错后不会继续执行下一句命令,;则无论前一句的结果如何均会执行后续的命令。
&&运算符的语法格式:command1 && command2 [&& command3 ...]
(1)命令之间使用 && 连接,实现逻辑与的功能。
(2)只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
(3)只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
||运算符的语法格式:command1 || command2 [&& command3 ...]
(1)命令之间使用 || 连接,实现逻辑或的功能。
(2)只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
(3)只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
71、收集系统信息
确定系统版本、硬件、参数设置及登录用户情况。
(1)“who”命令查看当前在线用户。
(2)“uptime”命令查看服务器从开机启动到现在已经运行了多长时间,同时也包含了从启动到现在服务器的平均负载情况。
(3)“cat /etc/SuSE-release”或“cat /etc/redhat-release”和“uname -a”命令检查系统的版本和内核信息。
(4)“sysctl -a”命令(需要root用户执行)和“cat /etc/sysctl.conf”命令获得系统参数信息。
(5)“cat /proc/cpuinfo”和“cat /proc/meminfo”获得CPU和内存信息。
(6)“top –H”命令查看CPU的使用情况,确定是否因为某个进程导致CPU使用率过高。若存在这种情况,通过gdb或gstack打印该程序堆栈,观察是否该程序处于死循环逻辑。
(7)“iostat -x 1 3”命令查看IO的使用情况,确定是否当前磁盘的IO处于饱和状态。查看当前运行的执行作业情况,决定是否对占用较多IO的执行作业进行处理。
(8)“vmstat 1 3”或“vmstat -t 1 3”命令查看当前系统中内存的消耗情况,结合“top”命令获得哪些进程消耗内存较多,处于超出预期的状态。
(9)以root用户查看操作系统日志信息(/var/log/messages)或dmseg信息,检查是否操作系统发生过异常错误。
72、修改环境变量引起的bash出错
解决方案:
切换到root 然后执行以下命令
/usr/bin/sudo -i
/usr/bin/nano ~/.bashrc
去掉bashrc文件中添加的错误信息
比如我的.bashrc文件中
后一行 export PATH=/opt/program/mx53_smd/out/host/linux-x86/binPATH
把此行去掉,bash功能恢复(需要重启shell客户端软件)。
73、修改hostname有几种方式
/etc/hosts设定用户IP与名字(或域名)的对应解析表。主机名和IP解析,相当于DNS工具(手动维护的)。
/etc/hosts于设置hostname是没直接关系的,仅仅当你要在本机上用新的hostname来访问自己的时候才会用到/etc/hosts文件。两者没有必然的联系。
/etc/sysconfig/network 确实是hostname的配置文件,hostname的值跟该配置文件中的HOSTNAME有一定的关联关系,但是没有必然关系,hostname的值来自内核参数/proc/sys/kernel/hostname,如果我通过命令
sysctl kernel.hostname=Test修改了内核参数,那么hostname就变为了Test了。
修改hostname有几种方式:
1: hostname DB-Server --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
2: echo DB-Server > /proc/sys/kernel/hostname --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
3: sysctl kernel.hostname=DB-Server --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
4: 修改/etc/sysconfig/network下的HOSTNAME变量 --需要重启生效,性修改。