Linux
方便复习
Vim
vim三种模式:编辑模式+命令模式+普通模式
n*yy:复制
n*p:粘贴
u:撤销
n*dd:删除
y$:复制当前位置到末尾
y^:复制当前位置到开头
yw:复制一个词
dw:删除一个词
d$:删除当前位置到最后
shift+x:往前一个一个删除
x:剪切
r:单个字符替换
shift+R:依次替换
w:移动到下一个词
w、b:词语跳动
gg:跳到开头
G、L:移动到最后一行
set nu:显示行号
ZZ:保存退出
i:当前光标前插入
a:当前光标后插入
o:当前行的下一行
/ +要查找的词 用n进行跳转,shift+n往上面跳转
set nonu
:s/old/new:替换当前行匹配到的第一个old为new
:s/old/new/g:替换当前行匹配到的所有old为new
:%s/old/new:替换文档中每一行匹配到的第一个old为new
:%s/old/new/g:替换文档中匹配到的所有old为new
网络配置和系统管理操作
-
VMware提供了三种网络连接模式
- 桥接模式:虚拟机直接连接到外部网络的模式,主机起到了网桥的作用。这种模式下,虚拟机可以直接访问外部网络,并且对外部网络是可见的
- NAT模式(推荐使用):虚拟机和主机构建一个专用网络,并且通过虚拟网络地址转换设备对IP进行转换。虚拟机通过共享主机IP可以访问外部网络,但外部网络无法访问虚拟机
- 仅主机模式:虚拟机只与主机共享一个专用网络,与外部网络无法通信
-
虚拟机设置静态IP:修改子网IP:
vim /etc/sysconfig/network-scripts/ifcfg-ens33dhcp->static IPADDR=XXX.XXX.XXX.XXX GETWAY(网关)=XXX.XXX.XXX.XXX DNS1=XXX.XXX.XXX.XXX service network restart -
修改hostname:
hostnamectl set-hostname xxx -
ssh root@hostname
系统管理
-
服务:启动之后一只存在、常驻内存的进程,一般被称作“服务”
-
命令:
service serviceName start/stop/restart/status -
centos7:
systemctl start/stop/restart/status serviceName /usr/lib/systemd/system -
centos6有七个运行级别,centos7做出简化:
multi-user.target(3)/graphical.target(5) -
查看当前运行级别:
systemctl get-default systemctl set-default xxx -
systemctl status NetworkManager -
systemctl enable/disable NetworkManager -
查看所有:
systemctl list-unit-files -
防火墙:
systemctl status firewalld -
关机:
shutdown shutdown -c # 取消 shutdown now shutodwn 3 shutdown xx:xx # 定时关机 # 关机之前做一个sync操作:将数据由内存同步到硬盘中(预读迟写) sync halt # 停机,关闭系统,但不断电 poweroff # 关机、断电 reboot # 重启,等同于shutdown -r now shutdown -H/-r/ shutdown --halt
命令实操
Shell可以看做是一个命令解释器,为我们提供了交互式的文本控制台界面。我们可以通过终端控制台来输入命令,由shell进行解释并最终交给内核执行。
文件目录类
man 命令
pwd 当前目录
type 命令 # 查看命令类型
cd - # 回到上次的目录
.开头的表示隐藏的
mkdir d d/e d/e/f <=> mkdir -p d/e/f
rmdir b c # 不能删非空的
rmdir -p g/h/i
cp (-r) file newPath #-r 递归复制文件夹
\cp # 直接覆盖
rm file
\rm file # 直接删除
rm -rf dir
mv # 移动、重命名
mv file newPath newName
cat -n
tac -n
more -> 空格/b/f
less -> 空格/b/f/= :/查找# 分页动态加载,对于大型文件具有较高的效率
echo 输出内容到控制台
echo -e "Hello \n wrold"
> 重定向 >> 追加 => file
head -n # 显示文件头部内容
tail -n # 显示文件尾部内容
tail -f 文件 # 实时追踪该文档的所有更新 Ctrl+s 暂停 Ctrl+q 继续
ln 软连接(符号链接)(快捷方式)
ln -s 原文件或目录 软连接名
ln -d 原文件或目录 硬链接名
rm -rf 软链接名/ # 加了/会删除原文件
history n # 查看历史命令
!历史命令编号
history -c #删除历史命令
时间日期类
date
date +%Y
date +%Y-%m-%d-%H:%M:%S
date -d "1 days ago"
date -d "-1 days ago"
date -s "xxxx-xx-xx xx:xx:xx" # 设置时间
ntpdate 服务器 # 获取时间
hwclock -s # 通过硬件时钟配置系统时间
cal # 查看日历
用户权限类
useradd 用户名 # 添加新用户
useradd -g 组名 用户名 # 添加新用户到某个组
# 普通用户在/home下
useradd -d /home/file userName # 用户名是userName,不过是在file下
passwd userName #添加密码
id userName
id root
uid=0(root) gid=0(root) groups=0(root)
cat /etc/passwd #查看当前有哪些用户
su userName # 切换用户 switch user
whoami # 当前是哪个用户
who am i # 查看最外层用户
vim /etc/sudoers
userdel -r userName # 加r删除用户名
groupadd groupName # 新建组
usermod -g gruopName userName
groupadd meifa
cat /etc/group
usermod -g meifa jxl
id jxl
[root@umbrella ~]# id jxl
uid=1001(jxl) gid=1002(meifa) groups=1002(meifa)
groupmod -n newGroupName oldGroupName
groupdel groupName
- 文件
d 目录
l 链接文件
c 设备文件
1-3 属主 user
4-6 同组用户 group
7-9 其他用户 other
1.作用到文件:
r:可读
w:可写,可以修改,不代表可以删除,删除一个文件的前提是对该文件所在的目录有写权限
x:代表可执行(execute):可以被系统执行
2.作用到目录:
r:可以读取,ls查看目录内容
w:可以修改,目录内创建+删除+重命名目录
x:可执行,可以进入该目录
drwxr-xr-x 3 root root 4096 May 29 17:03 go
对于目录,3表示有多少子文件
对于文件,3表示有多少硬链接
chmod ugoa +-= rwx 文件或目录
chmod mode=421 文件或目录(二进制)
chmod -R xxx 目录 # 递归目录下的所有权限
chown 改变所有者(change owner)
chown 选项(-R) 最终用户 文件或目录
chgrp 改变属主
chgrp 最终组 文件或目录
搜索查找类
find 返回 选项
-name
-user
-size
find /xxx -size +2M # 大于2M的
locate #快速定位文件路径
updatedb # 更新db
locate fileName
which 命令
whereis 命令
grep #文本搜索工具
grep 选项 查找内容、文件
grep -n(显示行号) content fileName
ls | grep .d
wc #词频统计
压缩解压类
gzip/gunzip
gzip 文件 #效果有限,只能压缩文件,且不保留原文件
gunzip file.gz
zip/unzip #保留原文件,可以压缩目录
zip -r newPath/newName filePath
tar 打包工具
tar 选项 xxx.tar.gz 将要打包进去的内容
-c 产生.tar打包文件
-v 显示详细信息
-f 指定压缩后的文件名
-z, --gzip, --ungzip 用 gzip 对存档压缩或解压
-x 解压文件
-C 解压到指定目录
tar -zxvf xxx.tar.gz -C targetPath #显示详细信息,解压到目标路径
tar -cvf newName.tar 文件或目录 #打包
tar -zcvf #打包的同时压缩
磁盘管理类
du 选项 目录/文件
-h 以容易阅读的方式显示
-a 不仅查看子目录大小,还要包括文件
-c 显示所有的文件和子目录大小后,显示总和
-s 只显示总和
--max-depth=n 指定统计子目录的深度为第n层
df 查看磁盘空间使用情况
df:disk free
df 选项
-h 容易阅读
free -h 查看内存(物理+虚拟)占用
lsblk # 查看设备挂载情况
-f 查看详细的设备挂载情况,显示文件系统信息
mount/umount 挂载/卸载
mount [-t vfstype] [-0 options] device dir 挂载设备
umount 设备文件名或挂载点
fdisk 分区
fdisk -l 查看磁盘分区详情
fdisk 硬盘设备名 对新增硬盘进行分区操作
硬盘分区:用到的时候再查吧,手边没有环境
mkfs -t xfs /dev/xxx
进程管理类
ps 查看当前系统进程状态
ps aux | grep xxx 查看系统中所有进程
ps aux | less/more
ps -ef | grep xxx 查看父子进程之间的关系
a 列出带有终端的所有用户的进程
x 列出当前用户的所有进程,包括没有终端的进程
u 面向用户友好的显示风格
-e 列出所有进程
-u 列出某个用户关联的所有进程
-f 显示完成格式的进程列表
pid 进程的id号
ppid 父进程id
%MEM 占用内存空间
STAT 进程状态 R:运行状态、S:睡眠状态、T:暂停状态、Z:僵尸状态、s:包含子进程、1:多线程、+:前台显示、<:优先级很高
START:启动时间
TIME:占用cpu运算的时间
COMMAND 调用的命令
VSZ 占用虚拟内存
RSS 占用物理内存
TTY 终端(?表示没有)
查看父子进程ID:ef
查看晋城的CPU占用率和内存占用率:aux
kill 终止进程
kill 选项 进程号 # 通过进程号杀死进程
kill 进程名称 # 通过进程名杀死进程,支持通配符
kill -l
kill -9 pid 强制杀死
killall
pstree 查看进程树
top 实时监控系统状态信息
P 以CPU使用率排序,默认就是此项
M 以内存的占用率排序
N 以pid排序
q 退出top
u 选择user
top
-d 秒数 指定top命令每隔几秒更新,默认是3秒
-i 使top不显示任何闲置或者僵死进程
-p 通过指定监控进程id来仅仅监控某个进程的状态
ifconfig
netstat 显示网络状态和端口占用信息
netstat -anp | grep 进程号 #查看该进程网络信息
netstat -nlp | grep 端口号 #查看网络端口号占用情况
-a 显示所有正在监听和未监听的套接字
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在监听的服务状态
-p 表示显示哪个进程在调用
crontab 系统定时任务
systemctl status crond
crontab 选项
-e 编辑crontab定时任务
-l 查询任务
-r 删除当前用户所有的crontab任务
-e进入编辑界面
***** 执行的任务
第一个* 一小时当中的第几分钟(0-59)
第二个* 一天当中的第几小时(0-23)
第三个* 一个月当中的第几天(1-31)
第四个* 一年当中的第几月(1-12)
第五个* 一周当中的星期几(0-7,0和7都代表星期日)
用到再查吧
软件包管理
ubuntu:apt
红帽系列:rpm(ReHat Package Manager)
rpm包的名称格式
软件名称-版本号-软件运行的硬件平台-文件扩展名
rpm -qa 查询安装所有的软件包
[root@umbrella ~]# rpm -qa | grep tree
tree-1.6.0-10.el7.x86_64
rpm -qi tree # 查看详细信息,i(information)
rpm -e 卸载软件包
rpm -e --nodeps 软件包 卸载软件时,不检查依赖。
-i install,安装
-v --verbose,显示详细信息
-h --hash,显示进度条
--nodeps,安装前不检查依赖
rpm -ivh RPM包全名
yum(Yellow dog Updater,Modified)一个shell前端软件包管理器,能够从指定的服务器自动下载rpm包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
yum 选项 参数
-y 对所有提问都回答yes
install 安装rpm软件包
update 更新rpm软件包
check-update 检查是否有可用的更新rpm软件包
remove 删除指定的rpm软件包
list 显示软件包信息
clean 清理yum过期的缓存
deplist 显示yum软件包的所有依赖关系
Shell编程
- Shell是一个命令行解释器,它接收应用程序、用户命令,然后调用操作系统内核
- Shell是一个功能强大的编程语言,易编写、易调试、灵活性强
- Linux提供多个shell解析器
[root@umbrella yum.repos.d]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
-
Shell第一行:
#!bin/bash -
脚本的常用执行方式
- 采用bash或者sh+脚本的相对路径或绝对路径(不用赋予脚本x权限)(启动一个子Shell执行脚本)
- 采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限)(启动一个子 Shell执行脚本)
- 采用
. 文件或者source(不启用子Shell进程)
-
系统预定义变量
$HOME $PWD $SHELL $USER echo $HOME #查看系统变量 set #显示当前shell中所有变量 env #所有的全局环境变量 printenv -
自定义变量
定义:变量名=变量值(不能有空格) 撤销变量:unset 变量名 声明静态变量:readonly 变量(不能unset) export 变量 变为全局变量 a=$((1+4)) a=$[1+4] 变量之间有空格,需要用单双引号 环境变量名建议大写 -
特殊变量
$n:n为数字,0代表该脚本名称,1-9代表第一到第九个参数,十以上的参数需要用大括号包含${11} $#:获取参数个数 $*:获取所有参数整体 $@:返回所有参数,类似一个数组 $?:返回状态 -
运算符
a=1+2 #不能加空格 echo $a #3 expr 1 + 2 #3必须有空格 $((运算式))或$[运算式] echo $[1+3*3] # 10 a=$((6+4)) a=`expr 4 * 2` # 命令替换 -
流程控制 - 条件判断基本语法:test condition [condition] condition前后要有空格[root@umbrella scripts]# a=hello [root@umbrella scripts]# test $a = hello # 必须加空格 [root@umbrella scripts]# echo $? 捕获返回结果 0 # 代表真,1代表假 [ $a != hello1 ] -eq 等于(equal) -ne 不相等(not equal) -lt 小于(less than) -le 小于等于(less equal) -gt 大于(greater than) -ge 大于等于 按照文件权限进行判断 -r 有读的权限 [ -r hello.sh ] -w 有写的权限 -x 有执行的权限 按照文件类型判断 -e 文件存在 -f 文件存在并且是一个常规的文件(file) -d 文件存在并且是一个目录(directory) -
流程控制 - if单分支if [ 条件判断式 ];then 程序 fi ======================= if [ 条件判断 ] then 程序 fi ======================= if [ 条件判断 ] then 程序 elif [ 条件判断 ] then 程序 else 程序 fi ======================= #! /bin/bash if [ "$1"x = "umbrella"x ] then echo "Hello,umbrella" fi ====================== if [ 30 -gt 18 ] && [ 4 -lt 20 ];then echo ok;fi ====================== if [ 30 -gt 18 -a(这里表示&&,and的意思) 4 -lt 20 ];then echo ok;fi ====================== if [ $2 -lt 18 ] then echo "未成年人" else echo "成年人" fi -
流程控制 - case多分支case $变量名 in "值1") 执行 ;; "值1") 执行 *) 默认情况 ;; esac -
流程控制 - for循环for (( 初始值;循环控制条件;变量变化 )) do 程序 done ================== for (( i=0;i<$3;i++ )) do sum=$[ $sum + $i ] done echo $sum ================== for 变量 in 值1 值2 值3 do 程序 done ================== for os in linux windows macos;do echo $os;done for i in {1..100};do sum=$[ $sum+$i ];done;echo $sum -
$*、$@,不被引号引起来,没什么区别,被双引号引起来,就有区别了 -
流程控制 - while循环while [ 条件判断式 ] do 程序 done ================== a=1 while [ $a -le $4 ] do sum2=$[ $sum2 + $a ] a=$[ $a + 1 ] let sum2+=a let a++ done echo $sum2 -
read读取控制台输入read 选项 参数 -p:指定读取值时的提示符 -t:指定读取值是等待的时间,如果不加-t表示一直等待 ======================================== read -t 10 -p "请输入名字:" name echo "welcome,$name" -
系统函数#!/bin/bash filename="$1"_log_$(date) #$(),括号里面写系统函数,命令替换 echo $filename =============================== dirname/basename 只是对字符串进行截取 =============================== basename [string/pathname][suffix] #basename命令会删除所有的前缀包括最后一个字符('/')字符,然后将字符串显示出来,可以理解为取路径里的文件名称 basename aa.sh .sh 结果:aa basename aa.sh 结果:aa.sh =============================== dirname 文件绝对路径 # 取文件路径的绝对路径名称 -
自定义函数
[function] funcName[()] { Action; [return int;] } 必须在调用函数地方之前,先声明函数,shell脚本是逐行执行 函数返回值,只能通过$?系统变量获得,如果不加return,将以最后一条命令运行结果,作为返回值。 =========================================================================== function add(){ s=$[$1 + $2] # echo "two sum"=$s # return $s echo $s } read -p "请输入第一个正数:" a read -p "请输入第一个正数:" b # add $a $b # echo $? sum=$(add $a $b) echo $sum -
综合应用
#!/bin/bash #首先判断输入参数个数是否为1 if [ $# -ne 1 ] then echo "参数个数错误!应该输入一个参数,作为归档目录名" exit fi # 从参数中获取目录名称 if [ -d $1 ] then echo else # 换一行 echo echo "目录不存在" exit fi DIR_NAME=$(basename $1) DIR_PATH=$(cd $(dirname $1);pwd) # 获取当前日期 DATE=$(date +%y%m%d) # 定义生成的归档文件名称 FILE=umbrella+${DIR_NAME}_DATE.tar.gz DEST=/root/home/$FILE # 开始归档目录文件 echo "开始归档..." echo tar -czf $DEST $DIR_PATH/$DIR_NAME if [ $? -eq 0 ] then echo echo "success!" echo "归档文件为:$DEST" echo else echo "failed" fi exit -
正则表达式
^ 匹配一行的开头 cat /etc/passwd | grep ^a # 匹配所有以a开头的所有行 $ 匹配一行的结束 cat /etc/passwd | grep a$ ^$ 匹配空行 . 匹配一个任意的字符 cat /etc/passwd | grep r.t r和t中间差一个字符,r..t差2个字符的 * 不单独使用,他和上一个字符连用,表示匹配上一个字符出现任意次数 .* 任意匹配 cat /etc/passwd | grep ^a.*in$ a开头,in结尾 =================================== [6,8] 匹配6或8 [0-9] 匹配一个0-9的数字 [0-9]* 匹配任意长度的数字字符串 [a-c,e-f] a-c和e-f之间的 cat /etc/passwd | grep r[a,b]t echo "ratabtaaat" | grep r[a,b]t =============================== \ 表示转义 cat xxx.xx | grep '$' 匹配$,要用单引号引起来 -
文本处理工具cutcut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出 cut [选项参数] fileName -f 列号,提取第几列 -d 分隔符,按照指定分隔符分割列,默认制表符是\t -c 按字符进行分割,后加n表示取几列 =========================================================== [root@umbrella scripts]# cut -d " " -f 1,2 cut.txt dong shen guan zhen wo wo lai lai le le cut -d " " -f 1-4(1-4列)(-4 第四列之前) cut.txt -
文本处理工具awkll /usr/bin | grep awk 一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理 awk [选项参数] 'pattern/action' fileName 选项参数 -F 指定输入文件分隔符,默认是空格 -v 赋值一个用户定义变量 cat /etc/passwd | awk -F ":" '/^root/ {print $7}' # root这一行开头,第一列,第七列 cat /etc/passwd | awk -F ":" '/^root/ {print $1","$7}' BEGIN 在所有数据读取行之前执行,END在所有数据读取行之后执行 cat /etc/passwd | awk -F ":" 'BEGIN{print "user,shell"}{print $1","$7}END{print "end of file"}' ====================================================================================== awk 的内置变量 FILENAME 文件名 NR 已读的记录数(行号) NF 浏览记录的域的个数(切割后,列的个数) awk -F ":" '{print "文件名:" FILENAME "行号:" NR}' /etc/passwd =================================================== ifconfig | grep -n ^$ #查看空行行号 ifconfig | awk '/^$/ {print NR}' # 两个//是模式的意思 9 18
\