Linux笔记

72 阅读13分钟

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提供了三种网络连接模式

    1. 桥接模式:虚拟机直接连接到外部网络的模式,主机起到了网桥的作用。这种模式下,虚拟机可以直接访问外部网络,并且对外部网络是可见的
    2. NAT模式(推荐使用):虚拟机和主机构建一个专用网络,并且通过虚拟网络地址转换设备对IP进行转换。虚拟机通过共享主机IP可以访问外部网络,但外部网络无法访问虚拟机
    3. 仅主机模式:虚拟机只与主机共享一个专用网络,与外部网络无法通信
  • 虚拟机设置静态IP:修改子网IP:vim /etc/sysconfig/network-scripts/ifcfg-ens33 dhcp->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,07都代表星期日)
	用到再查吧

软件包管理

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

  • 脚本的常用执行方式

    1. 采用bash或者sh+脚本的相对路径或绝对路径(不用赋予脚本x权限)(启动一个子Shell执行脚本)
    2. 采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限)(启动一个子 Shell执行脚本)
    3. 采用. 文件或者source(不启用子Shell进程)
  • 系统预定义变量

    $HOME $PWD $SHELL $USER
    echo $HOME	#查看系统变量
    set	#显示当前shell中所有变量
    env #所有的全局环境变量
    printenv
    
  • 自定义变量

    定义:变量名=变量值(不能有空格)
    撤销变量:unset 变量名
    声明静态变量:readonly 变量(不能unsetexport 变量 变为全局变量
    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 '$'	匹配$,要用单引号引起来
    
  • 文本处理工具cut

    cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出
    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 
    
  • 文本处理工具awk

    ll /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
    

\