Linux笔记
系统信息
uname -r #查看系统内核版本(常用)
cat /etc/system-release 或者 cat /etc/os-release #查看系统版本
free -h #查看内存的使用情况
top 查看cpu内存使用率以及进程信息(类似win系统的任务管理器信息)
键入“1”:可以展开/收起所有CPU的使用率信息
键入“M”:可以以内存使用率从高到低展示进程信息
键入“P”:可以以CPU使用率从高到低展示进程信息
uptime #查看系统运行时间
cat /proc/cpuinfo #查看CPU信息
cat /proc/meminfo #查看内存信息
cat /proc/interrupts #查看中断
cat /proc/swaps #查看swap信息
cat /proc/net/dev #查看网络适配器及统计
cat /proc/mounts #查看已加载的文件系统
date +"%Y-%m-%d %H:%M:%S" #以年-月-日 时:分:秒的格式查看时间日期
date +"%Y%m%d" #显示"年月日"格式的信息(如20210611,一般用作备份文件日期变量)
date +%s #将时间转换为秒显示(以格林尼治时间为起点算起)
date -s "20200712 9:30:00" #设置时间日期为2020-07-12的9:30:00(临时生效)
clock -w #将时间更改保存到BIOS(使上面的时间更改永久生效)
系统服务管理 (systemd是CentOS7版本新特性)
语法格式:systemctl [动作] [服务],下面以nginx服务举例
systemctl start nginx #启动nginx服务
systemctl stop nginx #停止nginx服务
systemctl restart nginx #重启nginx服务
systemctl status nginx #查看nginx服务的状态
systemctl enable nginx #设置nginx服务开机自启
systemctl disable nginx #禁止nginx服务开机自启
systemctl list-units #列举所有已启动服务(unit单元)
关机重启
poweroff #立刻将系统关机
shutdown -h now #立刻将系统关机
shutdown -h hours:minutes #定时将系统关机
reboot #立刻重启系统
shutdown -r now #立刻重启系统
shutdown -r hours:minutes #定时重启系统
shutdown -c #取消预定义系统关机或重启设置
exit #退出当前账户
文件和目录
cd /tmp #切换到/tmp目录
cd .. #切换到上一级目录
cd ../.. #切换到上两级目录
cd - #切换到上次所在目录
cd ~ #切换到个人家目录
pwd #查看当前绝对路径
ls #简单的查看目录下的文件
ls -l #查看目录下文件的详细信息(包含文件权限)
ll -t #按日期从新到旧的顺序列出文件
ll -tr #按日期从旧到新的顺序列出文件(r代表反转)
ls -a #查看目录下所有文件(包含隐藏文件)
ls *[0-9]* #显示包含数字的文件名和目录名
tree #查看目录树结构
mkdir dir1 #创建目录dir1
mkdir -p /tmp/dir1/dir2 #递归创建目录
rm -f file1 #强制删除file1文件
rm -rf dir1 #强制删除dir1目录以及其下所有文件
mv file1 /tmp/file2 #移动/重命名一个文件
cp file1 dir1 #把文件file1复制到目录dir1下
cp -r dir1 dir2 #把目录dir1及其下所有文件复制到目录dir2下(要加-r选项)
cp -r dir1/* dir2 #把目录dir1下的所有文件复制到目录dir2下(要加-r选项)
scp a.txt root@192.168.0.10:/tmp #跨主机拷贝文件
ln -s a.txt lnk1 #创建一个指向文件或目录的软链接
ln a.txt lnk1 #创建一个指向文件或目录的硬链接
查看文件内容
cat file1 #常用来查看短文件(常用)
less file1 #常用来查看长文件,可前后翻阅(常用)
head -n5 file1 #查看一个文件的开头5行
tail -n5 file1 #查看一个文件的最后5行
tail -f /var/log/nginx/access.log #实时查看日志文件(常用)
tail -f -n100 /var/log/nginx/access.log #实时查看日志文件最后100行
文件查找
find+查找范围+查找方式
find / -iname a.txt #在 / 范围下以文件名的方式查找文件a.txt(-i表示忽略大小写查找)
find / -iname "*.sh" #在 / 范围下查找以.sh结尾的文件(*代表通配符)
find / -user alick #在 / 目录下查找属于用户 alick 的文件和目录
find /var/log -size +10k -size -10M #在/var/log目录下查找大于10k小于10M的文件
find / -type f -mtime -10 #查找在10天以内被创建或者修改过的文件(-type d表示查找目录)
find /var/log -type f -mtime +30 -print0 | xargs -0 rm -rf #删除30天以上未改动过的文件(xargs结合管道可以将前一个命令的标准输出作为参数传递给下一个命令,这里如果不加xargs指令的话管道符后面的rm -rf是不生效的,加-print0和-0是为了防止查找对有空格的文件名不生效)
硬盘分区及格式化
fdisk -l #查看所有磁盘及其分区信息
lsblk #查看所有设备挂载情况
fdisk /dev/sdb #给/dev/sdb盘创建分区, 回车后还需输入参数 n(添加新区分)、p(选择添加主分区)、分区号, 然后起始扇区直接回车, 结束扇区输入+2G(给2G的大小), 最后w保存退出.
mkfs.xfs sdb1 #格式化分区sdb1为XFS格式的文件系统(输入mkfs后可按Tab补全键查看有哪些文件系统类型)
mkswap /dev/sdb2 #格式化分区sdb2为swap分区
注意: 创建硬盘分区及格式化之后还需要挂载才能使用.
查看磁盘空间
df -h #查看磁盘空间使用情况(-h参数是以容易阅读的方式显示)
du -sh file1 #查看file1占用的空间大小(file1可以是文件或目录)
du -sh dir1/* #查看目录dir1下的所有文件占用空间大小
临时挂载一个文件系统
mount /dev/sda2 /mnt/sda2 #挂载一个叫做sda2的分区文件系统, 确定挂载点目录/mnt/sda2已经存在(没有就先创建) .
umount /dev/sda2 #卸载一个叫做sda2的分区文件系统.
mount /dev/cdrom /mnt/cdrom #将cdrom(光驱)挂载到/mnt/cdrom挂载点目录下(没有就先创建)
swapon /dev/sdb2 #将准备好的swap分区挂载到系统中.
mount -a #重新挂载/etc/fstab下的所有未挂载的文件系统.
永久挂载一个文件系统
先vim /etc/fstab → 然后在文件最后一行添加上"设备文件、挂载点目录、格式类型、权限选项、是否备份、是否自检", 以空格隔开.
/dev/sdb1 /backup XFS defaults 0 0 #将sdb1以XFS格式及默认权限挂载到/backup下, 0代表不备份不自检(1代表备份自检)
/dev/sdb2 swap swap defaults 0 0 #将交换分区sdb2以swap格式及默认权限挂载到系统下
进程管理
ps -ef #查看所有的进程
ps -ef | grep nginx #查看某个指定服务的进程信息(常用)
ps -ef | grep nginx | grep -v grep | wc -l #统计nginx服务的进程数(grep -v是用来去掉包含指定内容的)
kill -9 PID #强制杀死某一单个进程(因为是杀死单个进程,所以后面接的是PID)
pidof httpd #查看httpd服务的pid
killall -9 httpd #强制杀死httpd的所有进程(有时候一个系统服务有多个进程, 一个一个去结束太麻烦)
用户和群组
useradd userName #创建一个新用户
passwd userName #给该用户设置登录密码(若是已经有密码了则是更改密码)
userdel -rf userName #删除一个用户(-rf参数是用于强制删除该用户所有文件)
groupadd groupName #创建一个新用户组
groupdel groupName #删除一个用户组
groupmod -n newName oldName #重命名一个用户组
usermod -g Group1 alan #将用户alan变更到Group1基础用户组(每个用户可以属于一个基础用户组, 多个扩展用户组)
usermod -G Group2 alan #将用户alan变更到Group2扩展用户组
文件目录权限
注: 文件所有者(u), 所属组(g), 其他人(o), →所有人(a) , 读,写,执行权限分别为rwx(八进制数分别为421)
ll file1 #可以查看到file1的权限
chmod u=rwx, g=rw, o=r days #给文件所有者赋予读写执行权限, 给所属组赋予读写权限, 给其他人赋予读权限
chmod ugo=rwx days #等同于 chmod a=rwx days 等同于 chmod 777 days 给所有人赋予days文件的读写执行权限
chmod 755 days #给文件所有者赋予读写执行权限, 给所属组和其他人赋予读和执行权限 ( 常用 )
chmod +x days #给所有人都加上days文件的执行权限(常用)
更改文件所有权
chown alick days #将文件"days"的所有者更改为alick
chgrp workgroup days #将文件"days"的所属组更改为workgroup
chown alick:workgroup days #将文件"days"的所有者更改为alick、所属组更改为workgroup.
注:chmod和chown加-R选项可以同时处理其下所有子目录及文件的权限.
文件的隐藏权限
格式: chattr 选项 file
chattr -i file1 #无法对文件进行修改;若file1是目录,则仅能修改其中的子文件内容而不能新建或删除文件
chattr -a file1 #仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
lsattr file1 #查看文件的隐藏权限
打包和压缩文件
tar -zcvf pac.tgz dir1 dir2 file1 file2 #创建一个名为pac.tgz的gzip格式的压缩包
tar -zxvf pac.tgz #解压一个gzip格式的压缩包到当前目录下
tar -zxvf pac.tgz -C /pacDir #解压到指定目录/pacDir下(pacDir目录没有就需先创建)
zip pac.zip file1 file2 #创建一个名为pac.zip的zip格式的压缩包
unzip pac.zip #解压一个zip格式的压缩包
unzip pac.zip -d /pacDir #解压缩zip包到指定目录/pacDir下
gzip file1 #压缩一个叫file1的文件
gunzip file1.gz #解压一个叫file1.gz的文件
yum软件包管理器
yum install demo #安装demo软件包(可加-y参数避免执行询问)
yum remove demo #删除指定软件包demo
yum list #列出当前yum源的所有可安装软件的清单(可搭配管道符精准查看当前yum源是否有某一个软件的安装包)
yum repolist #查看当前配置了哪些yum源仓库
yum info demo #显示指定软件包demo的信息
yum check-update #列出所有可更新的软件清单
yum update #更新所有软件
yum update demo #更新指定软件demo
yum search <keyword> #查找软件包
yum clean all #清除所有缓存
yum makecache #生成yum缓存
rpm -ivh packge.rpm #直接安装rpm软件包
rpm -Uvh packge.rpm #升级rpm软件包
rpm -qa | grep demo #查看demo是否已经被安装(以rpm -ivh方式安装)
yum list installed | grep demo #查看demo是否已经被安装(以yum方式安装)
网络
ip addr #查看ip地址等网络信息(可简写成ip a)
ip addr show eth0 #查看网卡eth0的信息
ip addr add 192.168.10.10/24 dev eth0 #设置ip地址
ip addr del 192.168.10.10/24 dev eth0 #删除ip地址
ip route show #查看路由表
ip route add default via 192.168.10.1 #更改默认路由
ip link set eth0 up #激活网络接口
ip link set eth0 down #停止网络接口
注:ifconfig已经被ip命令取代了
输入输出重定向
输入:
command < file #将文件的内容作为命令的标准输入
command << -EOF 内容 EOF #从标准输入中读入,直到遇见分界符才停止
command < fileA > fileB #将文件A作为命令的标准输入并将标准输出重定向到文件B
输出:(注意如果重定向目标文件不存在则会自动创建该文件)
command > file #将标准输出重定向到一个文件中(清空原有文件的数据)
command 2> file #将错误输出重定向到一个文件中(清空原有文件的数据)
command >> file #将标准输出重定向到一个文件中(追加到原有内容的后面)
command 2>> file #将错误输出重定向到一个文件中(追加到原有内容的后面)
command &> file #将标准输出与错误输出共同写入到文件中(清空原有文件的数据)
command &>> file #将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
注:输入输出重定向的文件描述符分别为→ 标准输入重定向(0)、标准输出重定向(1)、错误输出重定向(2)
MySQL数据库操作
☆ 本地登录数据库:mysql -u'用户名' -p'密码'
☆ 远程登录数据库:mysql -h'ip' -P'端口' -u'用户名' -p'密码'
☆ 退出数据库登录:exit
☆ 数据库操作:
show databases; # 查看所有数据库, detabase要加复数s
create database demo charset=utf8; # 创建数据库demo
drop database demo; # 删除数据库demo
use demo; # 切换数据库, 要操作数据库得先选择使用一个数据库
select database(); # 查看当前使用的数据库
☆ 表操作:
show tables; # 查看所有的表,查看表也要加s
create table tenant(字段1,字段2,...); # 创建表tenant
实例:create table tenant(id int auto_increment primary_key, name varchar(20));
drop table tenant; # 删除表tenant
desc tenant; # 查看表tenant的表结构
show index from tenant; #查看表tenant的索引
show create table tenant; # 查看创建表tenant所使用的语句
rename table tenant to newtenant; # 将表tenant的表名修改为newtenant
alter table 表名 drop 字段名; # 删除指定字段
drop index 索引名 on 表名; # 删除指定索引
☆ 数据操作:
增:
insert into 表名(字段1,字段2,...) values(值1,值2,...) ; # 插入一条数据
insert into 表名(字段1,字段2,...) values(值1,值2,...), (值1,值2,...) ; # 插入多条数据
insert into 表1(字段1,字段2) select 字段a,字段b from 表2; # 向表1中插入从表2查出来的数据
实例:insert into student(name,age,height) values('Tom',18,175);
实例:insert into student1(name,age) select sname,sage from student2;
删:
delete from 表名 where 条件; # 删除表内数据 (警告:后面不加where条件会将表内数据全部删除)
实例:delete from student where id=4;
delete from 表名; # 清空表
truncate 表名; # 清空表
改:
update 表名 set 字段1=值1, 字段2=值2,... where 条件 ; # 修改表内数据(警告:如果后面不加条件会将所有数据的该字段的值都修改了)
实例:update student set name='tom',age=18 where id=7;
查:
select * from 表名 where 条件; # 查看表内数据(这里的*代表所有的字段, 如果只想查询部分字段可用逗号分隔, 例select name,age from 表名;)
select count(*) from 表名; # 查询某个表里面有多少条数据
select * from 表名 group by 字段1 having count(*)>1; # 查询某个表里面"字段1"相同的数据大于1条的数据
select a.name from tenant as a; # 给tenant表设置别名为a(as可以省略掉,表名和别名用空格隔开)
select * from table1 t1 where t1.id in (select t2.id from table2 t2); # select的嵌套查询(嵌套select一般放在in、from、exists等的后面使用)
☆ 条件查询:
a.语法:select 字段 from 表名 where 条件;
b.比较运算符(=, >, <, >=, <=, !=):
实例: select * from student where id>10;
c.逻辑运算符(and, or, not):
实例:select * from student where id>=3 and gender=0; # 查询id>=3且性别为女的学生
d.模糊查询:
like: %表示多个任意字符、 _表示单个任意字符,必须要有引号
实例: select * from student where name like "alic%"; # 得到结果如alick、alickchen
实例: select * from student where name like "%alick%"; # 查询所有包含alick的数据
实例: select * from student where name like "alic_"; # 得到结果如alick
e.范围查询:
实例: select * from student where id in (2,7,12); # 查询id为2,7,12的学生
实例: select * from student where id between 5 and 10; # 查询id在5-10之间的学生
f.空查询:
实例: select * from student where address is null; # 查询住址为空的学生(非空是is not null)
g.优先级:
小括号 > not > 比较运算符 > 逻辑运算符 ; and > or =>可用()来改变优先级
h.排序:
select * from 表名 order by 字段1 asc/desc, 字段2 asc/desc, ... ; # asc升序,desc降序
i.限制查询:
select * from student limit 3; # 查询前3条数据
☆ 数据库的备份及恢复
a.物理备份(cp):
备份:cp -r /var/lib/mysql/* /bakDir
恢复:cp -r /bakDir/* /var/lib/mysql/
注:mysql数据库文件的存放路径是/var/lib/mysql/*(该目录下的文件一般有employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock)
b.逻辑备份(mysqldump):
单库备份:mysqldump -u'root' -p'123' --databases testDB >/backup/bak.sql #备份单个指定的数据库
多库备份:mysqldump -u'root' -p'123' --databases testDB1 testDB2 >/backup/bak12.sql #备份多个指定的数据库
整库备份:mysqldump -u'root' -p'123' --all-databases >/backup/allbak.sql #备份所有的数据库
恢复还原:mysql -u'root' -p'123' testDB </backup/bak.sql #恢复还原数据库
☆ 表的备份及还原
备份tenant表:create table bak_tenant like tenant; insert into bak_tenant select * from tenant;
还原tenant表:drop table if exists tenant; rename table bak_tenant to tenant;
☆ Navicat工具连接不上mysql数据库的解决方法
MySQL5解决方法:
1、需要登录到mysql所在机器上进行授权才能访问: ./mysql -u'用户名' -p'密码'
2、登录后,执行以下语句进行授权: grant all privileges on *.* to '用户名'@'%' identified by '密码';
MySQL8解决方法:
1、需要登录到mysql所在机器上进行授权才能访问: ./mysql -u'用户名' -p'密码'
2、登录后,执行以下语句进行授权
a、create user '用户名'@'%' identified by '密码';
b、grant all privileges on *.* to '用户名'@'%';
c、flush privileges;
☆ 将select查询结果输出到文件:
a、连接mysql,mysql -h'ip' -P'端口' -u'用户名' -p'密码'
b、切换到目标数据库,use tenant;
b、mysql> select * from user into outfile '/tmp/user.txt';
正则表达式
.:匹配任意单个字符
[]:匹配中括号内的任意一个字符
-:在[ ]中括号内表示字符的范围
^:位于[ ]中括号内的开头,匹配除括号内的字符之外的任意一个字符
?:匹配其前面的字符0次或1次
+:匹配其前面的字符至少1次
*: 匹配其前面的字符任意多次
{N}:匹配其前面的字符N次
{N,}:匹配其前面的字符至少N次
{,M}:匹配其前面的字符最多M次
{N,M}:匹配其前面的字符N到M次
^:匹配行首的位置
$:匹配行尾的位置
\<:匹配单词开头的位置(比如\<ro匹配root或robot)
\>:匹配单词结尾的位置(比如ot\>匹配root或robot)
\<word\>:精准匹配单词word
随笔记
☆ [root@localhost ~]#:表示用户是root、主机是localhost、当前所在目录是~,#表示当前是在root用户下,$表示当前是在普通用户下.
☆ Linux命令的短选项和长选项: 短选项是由单 - 引出, 多个短选项可以合并到一起(例如tar -zcvf), 长选项一般是由双 -- 引出(例如--help).
☆ 在shell脚本中,临时变量名最好用小写字母(避免与大写的环境变量名相同时冲突),函数名最好用小写字母加下划线组合(相比于驼峰命名法更利于阅读).
☆ 代码程序是从前往后顺序执行的,前面的执行完了后面的才会执行.
☆ history 查看历史使用过的命令(!行数, 可以直接使用该行数对应的历史命令)
☆ 切换用户:注意su - alick和su alick是不一样的,如果要想连环境也一起切换过去就得用su - alick
(普通用户免密切换到root用户:sudo -i)
☆ read -p "please input your grade: " GRADE 读取用户输入信息, -p参数用于向用户显示提示信息, GRADE为定义的用于接收用户输入信息的变量(也可以用echo的方式打印提示信息,然后read 变量名,但是如果echo不加-n选项的话会换行)
☆ / 代表根目录(根目录也叫共享目录, 所有用户均可见), ~代表某个用户自己的家目录(用户家目录下的文件才属于私有文件), 注意home目录只是/根目录下的
一个记录所有用户列表信息的普通目录而已.
☆ 执行文件:
1. 解释器执行: 例如bash script.sh, python script.py
2. 路径执行(包括绝对路径执行和相对路径执行): /root/desktop/scripts/sayhello.sh(绝对路径执行) ./sayhello.sh(相对路径执行)
☆ 给普通用户Alick添加sudo权限: 用root用户登录, vim /etc/sudoers修改sudoers配置文件, 在root ALL=(ALL) ALL下面一行添加Alick ALL=(ALL) ALL即可
☆ command &>/dev/null 将输出重定向到黑洞文件/dev/null中, 可以不让结果(包括标准输出和错误输出结果)在屏幕上输出显示出来
☆ echo "内容A" | command 管道符特殊用法, 将管道符左边的内容A作为右边命令enter回车之后要输入的内容, 内容A可以是普通字符串也可以是命令
☆ 硬件设备文件: sda代表磁盘a, sdb3代表磁盘b的分区3,vda代表虚拟磁盘a
☆ >test.txt 清空文件test.txt(将空白重定向到test.txt文件, 可将其完全清空)
☆ file test.txt 查看test.txt的文件类型.
☆ cat test.txt | wc -l 查看test文件有多少行.
☆ dd if=源文件 of=目标文件 dd命令为拷贝文件, 将 if 后的源文件内容拷贝到 of 后的目标文件中.
dd if=/dev/zero of=/testDir/test count=1 bs=100M 创建一个100M的test文件(/dev/zero可以无穷无尽的提供空数据), dd命令可用来测速(测试硬盘性能).
dd if=/dev/sda1 of=/dev/sdb2 将sda1中的数据拷贝到sdb2
☆ mdadm [模式] <RAID设备名称> [选项] [成员设备名称] mdadm命令是用来在linux下组RAID的(若没有需要先安装).
☆ 逻辑卷管理器(LVM)相关命令:
物理卷管理: pvscan pvcreate pvdisplay pvremove
卷组管理: vgscan vgcreate vgdisplay vgremove vgextend vgreduce
逻辑卷管理: lvscan lvcreate lvdisplay lvremove lvextend lvreduce
☆ shell脚本的空格问题: 写赋值语句时不能有空格(例如SUM=0, SUM=SUM+$i), 但是写条件语句时需要有空格(例如[ $I -eq 100 ]).
☆ 绑定两块网卡的作用: 第一,可以提高网络传输速度(提升带宽); 第二,可以增加冗余(防止一块网卡出现故障影响网络服务)
☆ scp /tmp/test.txt root@192.168.0.10:/tmp 将本地主机上的test.txt文件拷贝到远程主机192.168.0.10的root用户的/tmp目录下.
scp -r root@192.168.0.10:/tmp/demoDir /tmp 将远程主机192.168.0.10上的demoDir目录拷贝到本地主机(拷贝目录要加 -r 选项).
注:cp命令可以覆盖掉原来的重名文件或目录,可以用来做文件恢复。
☆ vmware workstation和vmware ESXI的区别:
1. vmware workstation是软件,需要安装在操作系统上,再在软件上创建出虚拟机,然后在虚拟机上安装各种OS,属于个人实验测试用.
2. vmware ESXI本身就是OS,可以直接装在物理裸机上,再在上面创建出虚拟机,然后在虚拟机上安装各种OS,属于企业应用在生产环境上.
☆ wget和curl下载文件:
1. wget http://www.linuxde.net/test.iso # 不用加参数,直接下载文件
2. curl -O http://www.linuxde.net/test.iso # 要加-O参数,O大写,不加参数只是打印内容不会下载
☆ 条件判断
equal:eq(等于) not equal:ne(不等于)
great than:gt(大于) less than:lt(小于)
great equal:ge(大于等于) less equal:le(小于等于)
☆ seq:用来创建一个数字序列
seq 1 10:创建输出序列1~10
seq 1 2 10:以2为步进创建输出序列1,3,5,7,9
☆ 正则表达式:包括字符类、数量限定符、位置限定符
其中,^和$是限定整行的开头和结尾的,
而,\<和\>是限定一行内容里的单词的开头和结尾的,比如\<un和un\>和\<un\>
☆ 正则表达式放的位置:不同的命令用法不同,所以相应的正则表达式放的位置也不一样,比如awk和sed命令中正则表达式是放在双斜杠之间的,在egrep命令中正则表达式是直接写的,而在vim编辑器里正则表达式又是放在单斜杠后面的,但不管正则表达式放在哪里,用法都是一样的,字符类、数量限定符、位置限定符的综合使用.
☆ 命令后台运行:
nohup command & #让command命令在后台运行,关闭终端也不会终止该命令运行
Ctrl C是结束正在运行的命令,Ctrl Z是暂停正在运行的命令并挂起到后台.
jobs -l #查看所有在后台运行的命令及其进程id
fg #将上一个暂停的命令进程调至前台继续运行,fg %n调指定代号为n的后台进程到前台执行.
kill -9 PID #终止进程
☆ 命令排序:&&代表前面为真或者成功才会执行,||代表前面为假或者失败才会执行.
ping -c1 -w1 www.baidu.com && echo "is up" || echo "is down"
cmd1 && cmd2 && cmd3... 多个&&逻辑组合使用,前面成功则往后继续.
cmd1 || cmd2 || cmd3... 多个||逻辑组合使用,前面失败则往后继续.
☆ 子shell:将命令放在小括号里执行表示是在子shell里面执行,比如(cd /etc; ls)这条命令执行完后并不会把当前目录切换到/etc下.
☆ 脚本调试
bash -n test.sh #检测脚本是否有语法错误
bash -vx test.sh #可以显示出脚本的调试过程
☆ 强引用和弱引用:单引号是强引用,双引号是弱引用;比如变量引用以及有特殊含义的字符在单引号下都会失去其特殊含义。
☆ 位置变量(注意: $n在函数里面时是指的函数的位置变量,在函数外面时是指的脚本的位置变量)
$0:代表脚本的名称
$1:代表传入脚本的第一个参数
$2:代表传入脚本的第二个参数
$*:代表传入脚本的所有参数
$#:代表传入脚本的所有参数的个数
$?:代表上一条命令执行后的返回值,执行成功或为真,它的值就为0,否则它的值就是非0.
☆ 数字运算
方法一: 一般用let来做数字运算,比如let num=1+2,比如let i++
方法二: 用$加中括号,比如 $[1+2]
☆ shell数组
数组定义格式: user_list=(Alan Bob Jack Amy Alick )
获取数组中第一个元素的值:${user_list[0]}
获取数组中所有元素的值:${user_list[*]}
获取数组的长度(元素个数):${#user_list[*]}
☆ 多行注释: :<<!被注释内容 !
☆ exit与brake的区别:brake只是跳出当前循环体,而exit是直接退出整个程序.
☆ 查看端口相关信息(ss已经取代了netstat)
ss -anp #列出所有类型的端口信息(a代表展示所有类型的端口信息、n代表以ip形式展示、p代表展示pid)
ss -anp | grep 端口号 # 通过端口号过滤查询
ss -anp | grep 服务名 # 通过服务名称过滤查询
ss -anp | grep PID # 通过进程ID过滤查询
lsof -i:端口号 # 固定格式,通过端口号查询
☆ for和while循环谁更适合逐行处理文件:for循环处理文件的时候是按照空格来获取元素的,而while循环可以逐行来获取文件内容.
while循环逐行获取文件内容的格式为,while read LINE;do 函数体 ;done <ip.txt ,把ip.txt文件的每一行内容读取并存放在变量LINE里面(注意read不仅可以读取用户从键盘输入的内容,还可以用来读取文件的每一行,然后把读取到的内容存放在变量里面).
☆ shell脚本远程批量修改配置
远程登录到某一个主机: ssh 目标主机ip
创建秘钥(公钥): ssh-keygen
主机秘钥(公钥)推送: ssh-copy-id 目标主机ip
解决用户命令交互的问题:可以请expect这个兄弟来shell家里帮一下忙
☆ return: shell中的return也是用来返回函数的返回值的,可用echo $?来查看函数的返回值,但是在shell中return只能返回255以下的值.
☆ 环境变量配置文件
/etc/profile:系统级环境变量配置文件,对所有用户有效.
~/.bashrc:用户级环境变量配置文件,只对当前用户自己有效.
☆ 计算脚本运行时间(把时间转换成秒再计算)
startTime=$(date +%s)
程序主体
endTime=$(date +%s)
echo "use_time: $[$endTime-$startTine]"
☆ vim编辑器在"一般模式"下:
直接输入 /test 可以正向匹配搜索到包含 test 的行(?test可以反向匹配搜索)
/^test可以匹配搜索到以 test 开头的行
/test$可以匹配搜索到以 test 结尾的行
注:n可以向后查找下一个,N可以向前查找下一个.
: set number 显示行号
: 100 快速定位到第100行
G:跳转到文件末尾
gg:跳转到文件开头
dd:删除光标所在的行(可以按住d键不放来连续删除多行)
☆ 设置登录超时断开时间(单位: 秒)
临时生效:执行命令 export TMOUT=600 (TMOUT=0命令可以防止超时退出)
永久生效:vim /etc/profile,如果之前没设置过这个环境变量,那么就在最后加上export TMOUT=600
☆ less的管道用法:在查看命令帮助文档或者查看进程信息等长内容的时候,可以用管道配合less来查看,还可以前后倒退.
例如: ps -ef | less ls --help | less
☆ 查看目录树结构
tree #查看当前目录的树形结构
tree testDir #查看testDir目录的树形结构
☆ 计划任务crond
系统级任务调度: 用/etc/crontab配置文件来设置.
用户级任务调度: 用/var/spool/cron/<username>配置文件来设置(也可用crontab -e命令来编辑配置文件).
配置文件释义: * * * * * command,前面5个字段分别代表"分、时、日、月、周",第6个字段代表要计划执行的命令(系统级任务调度还需要在执行命令前面写上执行用户),也可以是脚本文件,每一行配置代表一个计划任务。
计划任务执行记录日志查看: tail -f /var/log/cron
crond服务命令: systemctl status/start/stop/restart crond
☆ mkpasswd生成随机密码:mkpasswd -l 9 -d 2 -c 3 -C 3 -s 1
☆ 测试端口通不通: telnet ip 端口 (打印connected to ip代表通,打印connection refused代表不通,若无法退出按ctrl+] 然后quit退出)
☆ 抓包工具
tcpdump: linux系统自带的命令行式抓包工具.
wireshark: 支持windows & linux平台,不过一般都是用在windows平台上(图形界面式抓包工具),因为linux系统下就直接用tcpdump就好了.
☆ $()与反引号:这两种方式都可以用来获取一条命令执行后的结果,反引号``是老的用法,$()是新的用法,为了避免产生问题和代码美观,推荐使用$().
☆ war包和jar包的区别:
war包:web应用程序所有文件的集合.
jar包:java类库文件.
☆ xftp传输文件:用xftp传输文件到linux系统一般建议先传输到/tmp目录下再复制到其它目录,因为直接传到其它目录可能会没写入权限。
☆ diff命令:比较两个文件的差异性
用法:diff file1 file2
☆ 清除系统缓存
echo 1 > /proc/sys/vm/drop_caches # 仅清除页面缓存
echo 2 > /proc/sys/vm/drop_caches # 清除目录项和inode
echo 3 > /proc/sys/vm/drop_caches # 清除页面缓存、以及目录项和inode
☆ 写shell脚本时,可以不空格的地方就不要空格,以免语句太长不美观,比如重定向符号前后、管道符号前后、分号后面...
☆ nslookup my.test.com #查询域名绑定的ip地址信息
☆ dev、sit、uat环境的区别:dev(develop)是开发环境,sit(system Integration test)是系统集成测试环境,uat(user acceptance test)是用户验收测试环境。
☆ md5sum file01:查看file01文件的md5值,通常用来比较两个文件是否相等。
☆ 上传下载文件命令
安装文件传输软件: yum install lrzsz
从服务器上下载文件到本地: sz test.txt
从本地上传文件到服务器上: rz
☆ 查看lvs负载均衡成员信息: ipvsadm -l
☆ Nginx常用命令
find / -type f -iname nginx #首先找到名为nginx的可执行文件所在的位置
./nginx -v #查看nginx的版本
./nginx #加载默认配置文件的方式启动nginx服务
./nginx -c /opt/nginx/nginx.conf #加载指定配置文件的方式启动nginx服务
./nginx -s stop #强制立即停止nginx服务
./nginx -s quit #优雅的停止nginx服务(即处理完所有请求后再停止nginx服务)
./nginx -s reload #重新加载配置文件,然后以优雅的方式重启nginx服务
./nginx -t -c /opt/nginx/nginx.conf #检查指定nginx配置文件是否有语法错误
ps -ef | grep nginx #可查看当前nginx服务是否在正常运行
☆ shell睡眠函数sleep:sleep 1s #睡眠1秒钟、sleep 1m #睡眠1分钟、sleep 1h #睡眠1小时、sleep 1d #睡眠1天
☆ shell脚本换行:shell脚本中一行内容太长既不美观也不易于维护,可以在末尾加上反斜杠 \ 来换行,注意反斜杠 \ 后面不能有空格,必须直接回车到下一行.
☆ source命令:通常用于重新执行刚修改的初始化文件,使之立即生效而不必注销重新登录(例如source /etc/profile,source也可用 . 代替)
☆ dos2unix命令:dos2unix test.txt # dos2unix命令是一个Linux下的文本文件转换工具,它的作用是将DOS/Windows格式的文本文件转换为Unix/Linux格式的文本文件
☆ jps命令:jps全称为Java Virtual Machine Process Status Tool,是Java提供的一个查看当前用户有权访问的主机的Java进程情况的工具.