【无标题】

在这里插入图片描述

中級學習:

一、linux下目錄結構:

在这里插入图片描述

1.1 目錄功能介紹:

  • bin :普通用戶使用的命令 /bin/ls , /bin/date
  • sbin : 管理員使用的命令 /sbin/service
  • dev :設備文件 /dev/sda,/dev/sda1
  • root root用戶的Home
  • home 存儲普通用戶家目錄
  • tmp :臨時文件(全局可寫:進程產生的臨時文件)
  • var :存放的是一些變化文件,比如:數據庫,日誌,郵件…

=設備(主要指存儲設備)掛載目錄=

  • media:移動設備默認掛載點
  • mnt :手工掛載設備的掛載點
  • etc :配置文件(系統相關如網絡 /etc/sysconfig/network)
  • proc :虛擬的文件系統,反映出來的是內核,進程信息或實時狀態,硬件的狀態。
  • usr :系統文件,相當於C:\windows
  • /usr/local :軟件安裝的目錄,相當於C:\program
  • boot 存放的系統啟動相關的文件,例如kernel,grub(引導裝載程序)
  • lib 庫文件Glib
  • lib4 庫文件Glibc
  • lost+found fsck修復時,存儲沒有連接的文件或目錄

1.2 文件管理

1.2.1文件管理相關命令

1.創建一個文件: touch 文件名
2.創建目錄:mkdir 路徑和目錄名  【mkdir -p 文件名   #父系,当创建目录没有上一级时,自动创建】
3.創建多個:mkdir /home/a{1,2,3}
4.複製: cp   源文件路径     目标文件夹   # 复制文件
       - cp  -r    源目录    目标目录  # recursion 递归复制整个目录
5.移動: mv 源文件路徑  目標文件路徑
6.強制刪除:rm -rf 文件或目錄的路徑
7.查看文件內容:cat-查看全部;more-翻頁;head-頭部;tail-尾部;grep過濾關鍵字
8.修改文件內容,使用文本編輯器vim,按i編輯,wq保存退出。
相關內容:
VISUAL 可视模式,按V进入,小v光标自己选取,大V直接选取一行,Y复制 p粘贴即可,不要按两次y,可视模式按一次y。按d是删除选中的
ctrl+V,上下选择,然后可以shift+> 进行整体缩进。

命令模式:
hjkL:上下左右
0 $:行首行尾
gg G:頁首頁尾
3G:進入第三行,或:3
/string  查找string (n上一個,N下一個)

文本編輯:
yy  複製
dd  刪除
p   粘貼
u   撤銷

進入其他編輯模式: a   i   o  A


擴展命令模式:
查找替換:
:範圍   s/原內容/新內容/全局
:1,5  s/root/qianfeng/g    #从1-5行的root 替换为qianfeng    s:switch  交换    g:global全局
另存为
:w file9.txt     #另存为 file9.txt

:set nu   # 设置行号 
:set nonu   # 取消设置行号 
:set list  # 显示控制字符

重定向
ls -a > list.txt   # 覆盖文件内容
ls -a >> list.txt  # 追加到原文后

临时文件:vim未正常关闭,产生的临时文件。如源文件是1.txt,临时文件就是.1.txt.swap,在同一目录内,删除该文件即可

1.3用戶管理

1.3.1 用戶/組基本概念

(1)用戶相關代碼:

查看當前登錄的用戶信息:  id
查看文件的owner:ll 文件路徑
查看運行進程的username:ps aux   
查看某個進程:ps aux | grep cpu

(2)用戶組信息存儲的文件

  • 用戶基本信息文件**/etc/passwd文件**
/etc/passwd(冒号分割为7列字段)
      root:x:0:0:root:/root:/bin/bash
      用户名:x:uid:gid:描述:HOME:shell

      - root:用户名:登录系统的名字
      - X:密码占位符:,具体内容不在这里
      - 0:UID: 用户的身份证号

	        - 系统约定: RHEL7
	          uid: 0 特权用户
	          uid: 1~999 系统用户
	          uid: 1000+ 普通用户

				The root user
				. uid is 0
				. all power
				. This user has the power to override normal privileges on the file system
				. installing or removing software and to manage system files and directorie
				. Most devices can only be controlled by root

	- 0:GID:GROUP 组号

		- 每创建一个用户,系统会自动创建同名的组

	- root:描述:比如经理 manager

		- 默认是用户名

	- /root:家目录:登录系统时,所在目录
	- /bin/bash:登录shell:命令解释器,当今用的组多的

 - 不能用vim的方式改这个文件,主要是来观察
  • 用戶密碼信息文件 /etc/shadow
/etc/shadow
/etc/shadow(9)

root:$1$MYG2N:15636:0:99999:7:   :   :
- 加密算法$id$salt$encrypted
	$1: MD5
	$5: SHA-256
	$6: SHA-512

root:$1$MYG2NDG6$a1wtyr5GDM2esAPjug0YP0:15636:0:99999:7:: :

1)“登录名”是与/etc/passwd文件中的登录名相一致的用户账号
2)“口令”字段存放的是加密后的用户口令字,如果为空,则对应用户没有口令,登录时不需要口令;   
	星号*代表帐号被锁定;
	双叹号!!表示这个密码已经过期了。
	$6$开头的,表明是用SHA-512加密的,
	$1$ 表明是用MD5加密的
	$2$ 是用Blowfish加密的
	$5$ 是用 SHA-256加密的。 

3)“最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在SCOLinux中,这个时间起点是1970年1月1日。
4)“最小时间间隔”指的是两次修改口令之间所需的最小天数。0表示随时可改密码,如果是5表示5天才能修改一次密码
5)“最大时间间隔”指的是口令保持有效的最大天数。99999表示永不过期
6)“警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。假如设置7,表示还有7天到期时会警告是否要修改。软限制。
7)“不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。(软限制。到期后多少天就不能用账号了。)可不写。如写28表示代表用户不登录系统,会保留28天,过了28天禁用该用户。只要活跃,就不会禁用
8)“失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。(硬限制。)
9) 保留
  • 組信息處理
/etc/group
root:x:0:
組名:組密碼:組id:組成員
组成员默认为空

1.3.2 用戶/組管理
用戶相關操作

  • 創建用戶【未指定選項】:useradd user01
  • 查看用戶信息:grep user01 /etc/passwd 或者 cat /etc/passwd | grep user01
  • 創建用戶,指定uid :useradd user02 -u 1503
  • 創建用戶,指定家目錄:useradd user03 -d /user03
  • 删除用户:userdel -r user02 # -r 表示删除该用户的家目录,即/home/user02
  • 修改用戶密碼:passwd 用戶名 ,回車輸入新密碼 或者 當前用戶登錄,直接passwd
  • 其他選項管理: usermod -s /sbin/nologin user02 # 修改用户信息,此处是指定user02的shell禁止登录,执行完毕/etc/passwd中会做修改
  • 組成員管理:将用户追加到hr组(即用户有多个附加组)
    语法 usermod -aG 组名 用户名 注:当不带选项 a 时,会修改附加组而非追加,无论原来有几个附加组,都会被重置为此时指定的唯一附加组

用户组操作:

  • 创建一个hr组
 - [root@localhost ~]# groupadd hr
 - 查看

	- [root@localhost ~]# tail -3 /etc/group
	- user03:x:1003:
	- user04:x:1004:
	- hr:x:1005:
	- 说明该组已经 创建,但和任何用户都没有关系。

 - 组名不能只有数字,最好只有字母
  • 创建组net01,并指定gid 1007
[root@localhost ~]# groupadd net01 -g   1007
查看
 [root@localhost ~]# grep 'net01' /etc/group 
	 //查看/etc/group中组net01信息
  • 删除组:
- [root@localhost ~]# groupdel net01 
- 查看

	- [root@localhost ~]# tail -3 /etc/group
	- user03:x:1003:
	- user04:x:1004:
	- hr:x:1005:

基本组

随用户创建,自动创建的同名组,只有一个。从/etc/passwd查看最直接

useradd -g 指定基本组
usermod -g 修改用户基本组
基本组可以改变,多个用户的基本组可以相同

附加组

- 用户加入的其他组。可以有多个
useradd -G 指定附加组

1.3.3 提權

切换用户,切换对方身份时需要对方密码

[user01@localhost ~]$ id user01
uid=1003(user01) gid=1003(user01)=1003(user01)
[user01@localhost ~]$ whoami
user01
[alice@localhost ~]$ useradd u1
bash: /usr/sbin/useradd: 权限不够

[alice@localhost ~]$ su - root
password:
[root@localhost ~]# useradd u1

- 号的作用:带和不带 结果一致。最好带上 ,带 - 会切换环境变量,不带则不会切换环境变量

二、linux軟件安裝方式

Linux下主要有两种方式,主要分在线安装和线下安装。

2.1 在線安裝

1.軟件管理中心暗賬(Ubuntu)

  • 更新源sudo apt-get update
  • 打开软件中心,搜索你要安装的软件,双击安装即可

2.命令行安装方式
1)更新,命令:apt-get update
2)查找你要安装的软件,apt-cache search “软件名”
3)apt-get install 软件名
apt-get相关的有两个重要文件:【需要下載依賴包】
1、是/etc/sources.list,
2、是/var/lib/apt/lists/目录.
当我们执行apt-get update程序分析sources.list看这个文件里是否有对应的Packages/Sources/Release列表文件,如果有更新则下载之,存入/var/lib/apt/lists/目录(其实就是保持与当前系统版本软件源表最新);apt-get install 安装相应的包 ,下载并安装。

注意:这种方式的好处在于:如果你想要加载的应用需要依赖另一个应用程序才能正常工作,apt-get会帮你找到并加载所需的程序库或应用代码,这种方式是比较常用的的。比如我们执行apt-get install mysql-server,可以看到相关的依赖包

2.2線下安裝包

線下安裝言外之意:你要把软件下载到本地去安装。一般我们下载的文件后缀名都是zip、tar.gz等压缩包,解压后会看到rpm、bin、deb、run之类扩展名文件。很多軟件都會提供不同的linux版本的安裝格式。

2.2.1 rpm安裝

常用linux版本:opensuler/turbo/redhat版本。
安裝方法:rpm -ivh 軟件名.rpm

2.2.2 deb安裝包

DEB是Debian軟件包格式的文件擴展名,常用在centos/ubuntu,在蘋果系統裡常用的安裝方式。
安裝方法:dpkg -i 軟件包名.deb

2.2.3 run 安裝包

以QT(一種變成工具)安裝文件為例,
(1)授權: chmod x qt-unified-linux-x64-2.0.2-online.run
(2)執行:./qt-unified-linux-x64-2.0.2-2-online.run即可安装。

2.2.4 bin安裝包

bin包是一个自解压格式的安装包,要想执行它,需要先赋予它可执行的权限
(以安装jdk为例)
#chmod x jdk-6u21-linux-i586.bin
#./jdk-6u21-linux-i586.bin

2.2.5 編譯後安裝方式

举例安装nagios插件(nagios是一种开源的监控软件,需要多种插件支持监控模块)
1)cd /tmp/nagios-plugins-* //先进入目录
2)./configure --with-nagios-user=nagios --with-nagios-group=nagios // 配置,即安装的用户安装的路径都可在此设置,这一步一般用来生成 Makefile,为下一步的编译做准备
3)make //编译过程如果 在 make 过程中出现 error ,你就要记下错误代码,缺少什么包就按照什么包。
4) make install //如果make无问题就可以直接安装了。

三、linux 網絡管理

了解网络的配置,以及IP,学习如何配置一个网络,并且了解怎么访问同网络地址的ip,最终初始化一个服务器。

3.1 查看網卡及其狀態

網卡存儲位置:/etc/sysconfig/network-scripts/,可以去具體某個網卡下面去配置網絡,IP
 ifcfg-ens33是我们的网卡, ifcfg-ens32, ifcfg-ens34等等都是网卡,可以通过自己的机器用该命令进行查看。

3.2 NetworkManager服務

1.網絡管理器(NetworkManager)是一個動態網絡的控制器與配置系统,它用于当网络设备可用时保持设备和链接开启并激活。
默认情况下,CentOS/RHEL 7已安装网络管理器,并处于启用状态。
查看网络管理程序状态:systemctl status NetworkManager。
查看网络子管理程序的状态:systemctl status network。
在Active一行中可以看到NetworkManager程序是运行状态。
查看網絡連接狀態:
命令:nmcli device //查看網絡連接狀態
查看網絡連接狀態
如果沒有這個命令,可以執行安裝:yum -y install NetWorkManager

3.3 編輯網卡配置文件

cp /etc/sysconfig/network-scripts/ifcfg-ens33   /tmp          //将网卡配置文件备份到tmp目录下
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp/none/static   //获取地址的方法手动(none)/静态(static)/自动(DHCP)以后实验都用自动获取。
IPADDR=192.168.10.10
NETMASK=255.255.255.0
DNS=192.168.10.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens33
UUID=dabfc269-89d8-4332-8615-564735eb90bd
DEVICE=ens33
ONBOOT=no

長配置框柱部分
重啟網絡服務:systemctl restart network
查看ip: ip a
啟動/關閉網卡:ifup ens33 ifdown ens33

測試兩台計算機的寫連通性:ping 對方ip

防火墻相關:
systemctl stop firewalld //臨時關閉防火墻😊
systemctl disable firewalld //關閉防火墻開機自啟

3.3.1 網絡測試工具

#ip a         //查看所有IP(ipconfig)
#ip route(r)                  //查看路由,查看网关
#ip neigh  (n)               //另一台计算机ping通,查看邻居
#ping                              //测试连接

3.3.2 ports和services端口服務

安裝httpd: yum -y install httpd
启动httpd服务前,先查看端口:ss -tnl
启动httpd服务(在启动之前一定要确定关闭防火墙)
systemctl status firewalld //查看防火墙状态
systemctl start httpd //启动httpd
systemctl status httpd //查看httpd状态

注意:nginx和httpd可能会冲突,当时关闭了httpd服务,当然在这里如果不关掉nginx进行是无法启动httpd的。
首先使用ps aux | grep nginx 查看nginx的进程号
再使用 kill 进程号 关掉进程
关掉后就可以启动httpd服务了。

初始化服務器操作

1.為服務器配置root密碼

passwd  root
密碼

2.配置ip地址
centos系統:
配置文件:vim /etc/sysconfig-scripts/network-ifcfg-ens33

unbutu系統:

3.配置yum源

4.關閉防火墻

systemctl stop firewalld   //临时关闭
systemctl disable firewalld     //取消开机自启
systemctl status firewalld     //查看防火墙状态

5.selinux,關閉linux自帶的防護

setenforce   0        //临时关闭
vim /etc/sysconfig/selinux             //永久关闭
SELINUX=disabled          

6.安裝常用的程序

yum -y install   lrzsz   sysstat elinks wget net-tools bash-completion

7.開啟xshell,ssh連接
SSH(Secure Shell) 是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能;
在这里插入图片描述

7.1SSH开启、端口号、配置文件

客戶端:
Linux Client: ssh, scp, sftp,slogin
Windows Client: xshell, MobaXterm,putty, securecrt, sshsecureshellclient

服務端:
OpenSSh :是實現SSH協議的開源軟件項目,適用與各种UNIX、 Linux 操作系统。
centos 7 系統默認已安裝openssh相關軟件包,並將sshd服務添加為開機自啟(systemctl start sshd)

SSH服務的開啟
systemctl start sshd 啟動服務

SSH服務的端口號
sshd服務使用的端口號默認是22

SSH服務的配置文件
sshd服務的默認配置文件是 /etc/ssh/sshd_config

ssh_config(客戶端)和sshd_config(服務端)都是ssh服務器的配置文件

服務器名稱:sshd
服務端主程序:/usr/sbin/sshd
服務端配置文件:/etc/ssh/sshd_config
客戶端配置文件:/etc/ssh/ssg_config
7.2配置OpenSSH服務端

1.配置文件中的參數

[root@Kiro .ssh]# vim /etc/ssh/sshd_config   ##进入服务端配置文件
MaxAuthTries 6     ##输入密码次数限制 6代表输错六次就退出
PasswordAuthentication yes    ##打开密钥
PubkeyAuthentication yes      ##开启密码认证

2.登錄
方法一
ssh [遠程主機用戶名]@[遠程服務器主機名或IP 地址] -p port
在这里插入图片描述

方法二
ssh -l [遠程主機用戶名]@[遠程服務器主機名或IP地址] -p port
在这里插入图片描述
3.秘鑰的配置
做了密钥设置之后,服务端远程控制客户端就需要密钥了:
(1)生成秘鑰文件:
[root@Kiro ~]# ssh-keygen -t ecdsa
##需要自定义设置密码,如果不想设置密码就一直回车
(2)將公鑰文件導入對方的用戶
[root@Kiro ~]# cd /root/.ssh
[root@Kiro .ssh]# ls
id_ecdsa id_ecdsa.pub known_hosts

[root@Kiro .ssh]# ssh-copy-id -i /root/.ssh/id_ecdsa.pub root@192.168.61.110
##这一步需要输入对方的密码
(3)再次遠程登錄客戶機
[root@Kiro .ssh]# ssh root@192.168.61.110
Enter passphrase for key ‘/root/.ssh/id_ecdsa’: ##这个时候就需要输入密钥而不是密码了

7.3 使用SSH客戶端程序

命令程序ssh、scp、sftp
(1)ssh程序登錄

[root@pxw /]# ssh kiro@192.168.61.100
kiro@192.168.61.100's password: 
Last login: Fri Apr 15 16:43:30 2022 from 192.168.61.110

##第一次登陆时需要接收来自服务端的密钥 博主的客户端不是第一次登陆了所以不需要
(2)SCP遠程複製
通过scp命令可以利用SSH安全连接与远程主机相互复制文件;接下来我为大家做两个演示,分别是把远程主机的文件复制给本机,还有把本机的文件复制给远程主机:

--------远程主机 >>> 本机-------
[root@Kiro /]# scp root@192.168.61.110:/etc/passwd /opt/kiro  
##将远程主机/etc/passwd 下的文件内容复制到本机/opt/kiro 文件下
Enter passphrase for key '/root/.ssh/id_ecdsa':   ##需要输入密钥 
passwd                                   100% 2349     1.0MB/s   00:00    
##复制的文件名以及进度条 

---------本机 >>> 远程主机-------
[root@Kiro /]# scp /etc/passwd root@192.168.61.110:/opt/pxw
##将本机的/etc/passwd 文件内容复制到远程主机/ opt/pxw文件之下
Enter passphrase for key '/root/.ssh/id_ecdsa':   ##需要输入密钥
passwd                  	            100% 2399   614.2KB/s   00:00       
##复制文件名 和进度条 

(3)sftp安全FTP
通过sftp命令可以利用 SSH安全连接与远程主机上传、下载文件,采用了与FTP类似的登陆过程和交互式环境,便于目录资源管理接下来博主为大家演示一下登录、浏览、上传文件等过程:

[root@Kiro /]# sftp root@192.168.61.110  ##登录
Enter passphrase for key '/root/.ssh/id_ecdsa':   
 ##因为设置了密钥 ,这里输入密码而不是密钥
Connected to 192.168.61.110.

sftp> ls    ##查看一下当前目录下有什么
anaconda-ks.cfg              initial-setup-ks.cfg     
    
sftp> put /boot/config-3.10.0-957.el7.x86_64   ##上传config安装包
Uploading /boot/config-3.10.0-957.el7.x86_64 to /root/config-3.10.0-957.el7.x86_64
/boot/config-3.10.0-957.el7.x86_64                   100%  148KB   1.5MB/s   00:00    

sftp> ls   ##再次查看 config安装包上传成功
anaconda-ks.cfg                            config-3.10.0-957.el7.x86_64               
initial-setup-ks.cfg    
                   
sftp> bye   ##退出登录
[root@Kiro /]#

四、linux系統維護

4.1 查看內存情況

1.查看整體內存使用情況:free -m
在这里插入图片描述
2.查看整體各個進程內存使用情況:top
3.查看某個端口佔用內存
(1)查看某個端口的PID進程:sudo netstat -anp | grep 8001
運行結果如下:
tcp6 0 0 :::8001 ::😗 LISTEN 49850/java

(2)查看佔用內存情況
top -p 49850

4.2 添加yum軟件源

1.添加Docker穩定版本的yum軟件源:

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

2.查看磁盤情況

df  -h

3.查看程序對應的進程號

ps -ef | grep 进程名字

4.查看進程所佔用的端口號

netstat -ntlp | grep 進程號

5.查看端口號所使用的進程號

lsof  -i:端口號
netstat -lnp | grep 端口號

6.查看進程詳情,進程運行路徑

cd  /proc/進程號
ll

7.關鍵字搜索文件

cat 文件名 | grep xxx

8.查看文件

find 路徑 -name  文件名

五、shell編程

Shell 是一个命令行解释器,为用户提供了一个向 Linux 内核发送请求以便于运行程序的界面系统升级程序。

5.1 Shell腳本創建於執行

1.Shell 脚本在执行时有两个格式上的要求:以 #!/bin/bash 开头、必须有可执行权限
(1)創建新目錄shell用於存放shell腳本

mkdir  /root/shell
cd  /root/shell
vi shell.sh  //編輯腳本
#!/bin/bash
echo "heloo wordl!"
chmod +x shell.sh   //添加可執行權限

5.2 shell變量

5.2.1 系統變量和自定義變量

基本語法:

定義變量:變量名稱=值;
撤銷變量:unset 變量名;
定義靜態變量:readonly 變量名稱=值(靜態變量不能撤銷);
輸出變量:$變量

5.2.2 變量的基本規則

在定义变量时变量名称可以由字母、数字和下划线组成,但不能以数字开头;等号的两侧不能有空格;变量名称一般为大写。

5.2.3 設置環境變量

配置文件: /etc/profile

export 變量名=變量值   //將shell變量輸出為環境變量/全局變量
source 配置文件  //讓修改後的配置信息立即生效
echo $變量名     //查詢環境變量的值

5.2.4 位置參數變量

获取到命令行的参数信息,就需要使用到位置参数变量

$n  //n 为数字,$0 代表命令本身,$1-9 代表第 1 到第 9 个参数,10 以上的参数需要用大括号包含如 ${10}
$*  //代表命令行中的所有参数,$* 将所有参数看成一个整体
$@  //这个变量也可以代表命令行中的所有参数,不过 $@ 把每个参数区分对待
$#  //代表命令行中所有参数的个数

5.2.5 預定義變量

预定义变量就是 Shell 的设计者事先定义好的变量,可以直接在 Shell 脚本中使用。

$$  //当前进程的进程号码(PID)
$!  //后台运行的最后一个进程的进程号
$?  //最后一次执行命令的返回状态,如果这个变量的值为0证明上一个命令正确执行,如果不是 0 上一个命令没有正确执行

5.2.6 運算符

(1)“ ( ( 運算符 ) ) ”或“ ((運算符))”或“ ((運算符))[運算式]”或者 expr m + n //expression 表达式
(2)注意expr 運算符間要有空格,如果希望將 expr 的結果賦給某個變量,使用
(3)expr m - n
(4) expr *, /, % 乘,除,取余

5.2.7 条件判断

5.2.7.1 condition

判斷語句:
[ condition ] (注意condition前後有空格)
非空返回true,可使用 $?驗證。(0為true,>1為false)
常用判斷條件
(1)= 字符串比較
(2)兩個整數的比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於
(3)按照文件權限進行判斷
-r 有讀的權限
-w 有寫的權限
-x 有執行的權限
(4)按照文件類型進行判斷
-f 文件存在並且是一個常規的文件
-e 文件存在
-d 文件存在並是一個目錄

5.2.7.2 流程控制

(1)if 判斷【单分支】

if   條件
代碼1
else
代碼2 

if判斷【多分支】

if [ 條件判斷式1 ]
then
代碼1
elif [ 條件判斷式2 ]
then
代碼2
fi

!!!注意:[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2) case語句

        case $變量名 in
            "值 1") 
           如果变量的值等于值 1,则执行程序 1
   ;;
           表示结束第一个语句
   "值 2") 
           如果变量的值等于值 2,则执行程序 2 
   ;;
           …省略其他分支…
   *)
           如果变量的值都不是以上的值,则执行此程序 
   ;;
   esac
           表示结束整个程序[把case反着写]

(3)for循環

for 變量 in 值1 值2  值3..
do
程序/代碼
done
for (( 初始值;循環控制條件;變量變化))
do
程序/代碼
done

(4)while循環

while [ 條件判斷式 ]
do
程序/代碼
done

注意:while 和 [有空格,条件判断式和 [也有空格
(5)read讀取控制台輸入
read (選項) (參數)
選項:
-p :指定讀取值時的提示符
-t : 指定讀取值時等待的時間(秒),如果沒有在指定的時間內輸入,就不再等待啦。

比如:
1.读取控制台输入一个 NUM1 值 
  read -p "请输入一个数 NUM1=" NUM1 
  echo "你输入的 NUM1=$NUM1"  
  [如果一直不输值,程序就会一直卡在那里]

2:读取控制台输入一个 NUM2 值,在 10 秒内输入。
  read -t 10 -p "请输入一个数 NUM2=" NUM2 
  echo "你输入的 NUM2=$NUM2"

5.2.8 函數

5.2.8.1 系統函數

(1)basename :用於返回完整路徑最後 / 的部分,常用于獲取文件名。
代碼:
basename [ pathname ] [ suffix ]
basename [ string ] [ suffix ]
【basename 命令會刪掉所有的前綴包括最後一個(‘/’)字符,然後將字符串顯示出來。】
選項:suffix為後綴,如果suffix被指定,basename會將pathname或者string中的suffix去掉。
例如:

請返回 /home/aaa/test.txt 的 “test.txt”部分,basename  /home/aaa/test.txt
如果輸 basename  /home/aaa/test.txt  .txt ,就返回test

(2)dirname [和basename正好相反]
用於返回完整路勁最後 / 的前面的部分,常用于返回路徑部分。
dirname 文件绝对路径 (从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

 比如:
    请返回 /home/aaa/test.txt 的 /home/aaa 
       dirname /home/aaa/test.txt 
5.2.8.2 自定義函數
  [ function ] funname[()] 
   { 
         Action; 
         [return int;]
    }
    调用直接写函数名:
    funname [] 
比如:
1:计算输入两个参数的和(动态的获取), 函数名: getSum
     function getSum() { 
         SUM=$[$n1+$n2]     #n1和n2是手动输入的数
         echo "和是=$SUM" 
     }
     read -p "请输入一个数 n1=" n1   #输入两个值 
     read -p "请输入一个数 n2=" n2 
     getSum $n1 $n2                #调用自定义函数 

總結:
shell編程綜合案例
(1)每天凌晨2:30備份數據庫 hspedu 到 /home/date(crond)
(2)備份開始個備份結束能夠給出相應的提示信息
(3)備份後的文件要求以備份時間為文件名,並打包成 .tar.gz的形式。比如:2023-02-22_102703.tar.gz
(4)在備份的同時,檢查對否有10天前備份的數據庫文件,如果有就將其刪除。
(5)畫一個思路分析圖
代碼如下:

/usr/sbin/mysql1_db.backup.sh
#備份目錄
BACKUP= /data/backup/db
#當前時間
DATETIME=$(date  +%Y-%m-%d_%H%M%S)
echo $DATETIME
#數據庫地址
HOST=localhost
#數據庫用戶名
DB_USER=ROOT
#數據庫密碼
DB_PW=123456
#備份的數據庫名
DATABASE=hspedu
#創建備份目錄,如果不存在,就創建
[ ! -d "${BACKUP}/${DATETIME}" ]  && mkdir -p "${BACKUP}/${DATETIME}"
#備份數據庫
mysqldump  -u${DB_USER}   -p${DB_PW}  --host=${HOST}  -q  -R  --databases  ${DATABASE}  |  gzip  >  ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#將文件處理成 tar.gz
cd   ${BACKUP}
tar  -zcvf  $DATETIME.tar.gz  ${DATETIME}
#刪除對應的備份目錄
rm  -rf  ${BACKUP}/${DATETIME}
#刪除10天前的備份文件
find ${BACKUP}  -atime +10 -name  "*.tar.gz"  -exec rm -rf {}  echo "備份數據庫${DATEBASE} 成功~"

6.shell編程三劍客

基礎元字符:

\:轉義字符,用於取消特殊符號的含義,如:\!  , \$
^:匹配字符串開始的位置,如: ^root匹配以root開頭的行
$:匹配字符串結束的位置,如:world$ 匹配以world結尾的行
.:匹配除\n外的任何一個字符
*:匹配前面的子表達式0次貨多次
[  ] :匹配[   ]中的一個字符,如:[0-9]匹配任何一個數字
[ ^ ]:匹配不在[  ]中任意一個字符,如:[ ^0-9] 匹配任意一個非數字字符
\{n\ }:匹配前面子表達式n次,如:[0-9]\{2\}匹配兩位數字
\{n,m\}:匹配前面表達式n到m次,如:[a-z]\{2,3\}表示匹配兩位到三位小寫字母
\{n,\}:匹配前面的子表達式不少於n次,如:[0-9]\{2,\}表示兩位及兩位以上數字
\<:匹配以......開頭的行
\>:匹配以.......結尾的行
\<......\>:匹配某一個單詞的行

拓展元字符

+:匹配前一個字符一個或多個,如:go+d,將匹配至少一個o
?:匹配0個或1個字符,如:go?d,將匹配到gd或god
|:或
():將括號中的字符串作為一個整體
{n}:前一個字符重複n次
{n,}:前一個字符至少重複n次
{n,m}:前一個字符出現n-m次

grep+egrep

grep是一種強大的文本搜索工具,他能使用特定模式匹配(包括正則表達式)搜索文本,並默認輸出匹配行。
grep -v "text":過濾掉包括text的內容查看剩下的文件內容
grep "text":查看文件中包含text的行
grep "^q":查看文件中以q開頭的內容
grep "g$":查看文件中以g結束的內容
grep "q*"*代表前面一個字母出現0次或多次
grep -v "^$":過濾掉文件裡的空行
grep "[rR]oot":查找包含root或Root的文件內容
grep  -E "^root|Root$":查找以root開頭或Root結尾的文件內容
grep -E:相當於egrep
grep -c:顯示有幾行
grep -w "text":只找text這個單詞的文件內容
grep -i:忽略大小寫查看文件內容
grep  -o "text":只以行顯示text這個字符

6.1 grep

功能:過濾查找內容
分類:grep
egrep:擴展支持正則,fgrep:不支持正則
返回值出現:
0------表示成功【找到了】
1-------表示在所提供的文件無法找到匹配的pattern【沒有】
2-------找到地兒不對

6.1.2 參數:

grep  -q  靜默
grep   -v 去反

grep  -R  查看目錄下面的文件
```swift
grep -R /home/
匹配到二进制文件 .cache/mozilla/firefox/ro8zkjdr.default-default/cache2/entries/5773F8741C801CA8FA6328E33D4912694A3E2A8A

grep -o 只找到關鍵字就可以

 [root@localhost ~]# grep -o "o"  1.txt
o
o
o   

grep -B2 前兩行
grep -A2 後兩行
grep -C2 上下兩行


egrep -l   只要文件名
```swift
[root@localhost ~]# egrep -l 'root' /etc/passwd
/etc/passwd

egrep -n 帶行號

[root@localhost ~]# egrep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

6.2 sed

6.2.1 基礎

1.概念
sed是一種在線的、非交互式的編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱為“模式空間”,接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。

sed的工作流程主要包括讀取、執行和顯示三個過程。
讀取:sed從輸入流(文件、管道、標準輸入)中讀取一行內容並存儲到臨時的緩衝區中(又稱模式空間,pattern space)
執行:默認情況下,所有的sed命令都在模式空間中順序地執行,除非指定類行的地址,否則sed命令將會在所有的行上執行。
顯示:發送修改後的內容到輸出流。在發送數據後,模式空間將被清空。

常用選項:
-e     進行多次編輯
-n     取消默認輸出
-f      指定 sed文件名
-i      直接在源文件中修改
-r      使用擴展正則表達式

常用操作:
p    打印輸出
d    刪除指定行
c    替換指定行所有內容
s    搜索替換
g    表示只要符合條件,全部進行處理
r     可以將另一個文件內容讀取到文件中
w    可以將另一個 文件內容覆蓋到文件中
i      插入,在當前行上面插入一行或多行
a     插入,在當前行侯建插入一行或多行
y     字符轉換

語法格式:
sed命令+選項    ‘定位+動作+內容’   文件名

2.格式
sed 選項 命令 文件 ----------sed [options] ‘command’ file(s)
sed 選項 -f 腳本 文件--------sed [options] -f scripfile file(s)

3.返回值
(1)都是0,對錯不管
(2)只有當命令存在語法錯誤時,sed的退出狀態才是非0
(3)sed和正則表達式
查找和替換
基本元字符集:^ $ * [] [^] > < () {}
擴展元字符集:? + | ()
使用擴展元字符的方式:+ 轉義 ; sed -r 加r

實例
刪除命令:d 刪除一行中的內容

sed  -r  '/root/d' passwd   删除带有root的行
sed  -r '3d'     passwd      刪除第3行
sed   -r '3{d}'   passwd     刪除第3行
sed -r  ‘3{d;}’  passwd     {存放sed的多個命令}3{h,d}},jh暫存空間
sed -r  '3,$d'   passwd      刪除3到最後一行
sed  -r  '$d'    passwd     刪除最後一行

替換命令: sed -r ‘s/被替換/替換/’

sed  -r  's/root/aofo/'    passwd   #把root替換成aofo
sed  -r  's/^root/aofo/'   passwd    #把以root開頭的行root替換成aofo
sed  -r   '/root/aofo/g'   passwd     #全部把root替換成aofo
sed  -r  's/[0-9][0-9]$/&.5'   passwd    #查找雙數,結尾的詞組&,替換成.5&有查詢結果的含義
sed  -r   's/(mail)/E\1/g'    passwd    #把全部的詞mail換成Eail;( )括號組合字符,\1調用括號

讀取文件命令:r
在當前文件中,讀取其他文件“部分”內容

sed  -r  '$r  1.txt'   passwd   #讀取1.txt文件的內容
sed  -r   '/root/r  1.txt'   passwd  #正則搜尋root,在root後面讀取新文件

寫入文件命令:w

sed  -r  'w  111.txt'   1.txt    #把1.txt全部內容寫入111.txt
sed  -r  '1,5w   123.txt'    passwd    #把passwd的1,5行寫入123.txt文件

追加命令:a

[root@localhost ~]# sed -r 'a123' 1.txt     在文件1.txt内容中每行后面+123
##abc
123
##adc
123
 
# sed -r '2a123' 1.txt        第二行后面,加上123行
##abc
##adc
123

插入命令:i

[root@localhost ~]# sed -r '2iaaaaaaaaaaaaaaa'  1.txt
##abc
aaaaaaaaaaaaaaa        在第二行插入aaaaaaaaaaaaa

替換整行命令:c

sed  -r  '2c3333'    1.txt    把文件1.txt中第二行替換成3333
##abc
3333

獲取下一行命令:n
反向選擇:!
多重編輯:e

 sed -e '1,3d' -e 's/123/1111111111111111111111111/g' 1.txt
    删除1-3行,把1.txt中的123  替换成1111111111111

常用命令:
刪除配置文件中#號注釋行:sed -r ‘/^#/d’ /etc/vsftpd/vsftp.conf

7.awk

7.1 awk概念

awk用於在linux/unix下對文本繪本和數據進行處理。它逐行掃描文件,從第一行到最後一行,寸照匹配的特定模式的行,並在這些行上進行你想要的顯得操作。

7.2 工作原理

#awk -F:‘{print $1,$3}’ /etc/passwd

7.3 語法

命令格式:
awk 選項 ‘模式或條件{操作}’ 文件1 文件2…
awk -f 腳本文件 文件1 文件2
awk [ options] ‘commands’ filename(推薦)

| options | -F定義輸入字段分隔符,默認的分隔符是空格或製表符(tab) |
|command|BEGIN{ }:begin發生在行處理前(注意大寫)
| { } :行處理時,讀一次執行一次
END{ }:行處理後
在这里插入图片描述
AWK常見的內鍵變量(可直接用):
FS:列分隔符。指定每行文本的字段分隔符,默認為空格或製表位。與-F作用相同。
NF:當前處理的行的字段個數。
NR:當前處理的行的行號(序號)
$0:當前處理的行的整行內容。
$n:當前處理行的第n個字段(第n列)
FILENAME:被處理的文件名
RS:行分隔符

7.4格式化輸出print函數

[root@mycat ~]# awk  -F: '{print "username is:" $1 "\t uid is:" $3 }' /etc/passwd |head -1
****打印 文件/etc/passwd第一行,第一列用户名  第三列UID*****
username is:root	 uid is:0

7.5 模式(正則表達式)和動作

概念:任何awk語句都由模式和動作組成。模式部分決定動作語句何時觸發及觸發事件。
模式:可以是條件測試,正則,復合語句
動作:可以是打印,計算等

7.5.1字符串比較

查找字符串
awk ‘/^root/’ /etc/passwd //查找以root開頭的
awk ‘$0 ~/^root/’ /etc/paswd

$0:計算行數
~:模糊查找;
^root:以root開頭
!:取反,反向

7.5.2 數值比較

比較表達式採用文本進行比較,只有當條件為真,財執行指定的動作。比較表達式使用關係運算符,用於比較數字與字符串。
關係運算符:< <= == != > >=
算術運算符:+ - * / ^

7.5.3 多條件

邏輯操作符和復合模式語法:
&&邏輯與,|| 或 !非

實例:
#awk -F: ‘$1~/root/ && $3<=15’ /etc/passwd
#awk -F: ‘$1~/root/ || $3<=15’ /etc/passwd
範圍模式語法:
awk -F: ‘/adm/,/lpd/’ /etc/passwd //從adm到ldp,顯示出來避免匹配重付的字段

7.5.3.1條件&判斷

if 語句
格式:{if (表達式) {語句;語句…}}
實例:
需求:如果$3是0,就說他是管理員
awk -F: ‘{if ($3==0) {print $1 “is administartor.”}}’ /etc/passwd

if…else 語句
格式:{if() {} else{}}
{if (表達式)
{語句;語句;…}
else
{語句;語句;…}
}
實例:
需求:統計管理員和系統用戶數量
實例:
awk -F: ‘{if($3==0){count++}else{i++}} END {print “管理員個數:” count; print "系統用戶數:"i}’ /etc/passwd

if…else if …else語句
格式:{if (表達式1) {語句;語句;…} else if (表達式2){語句;語句;…} else (表達式3) {語句1;語句2;…}}
實例:
顯示三種用戶的信息,管理員:管理員ID為0,內置用戶:用戶ID<1000,普通用戶:

7.5.3.2 循環

while循環
格式:while (條件) 語法
實例:
每行打印10次
awk ‘{i=1; while(i<=10) {print $0;i++}}’ passwd

for循環
格式:for (語法1;條件;語法2)
內容

數組
定義數組
awk -F: ‘{username[++i]=$1} END{print username[1]}’ /etc/passwd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值