中級學習:
一、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
3.2 NetworkManager服務
1.網絡管理器(NetworkManager)是一個動態網絡的控制器與配置系统,它用于当网络设备可用时保持设备和链接开启并激活。
默认情况下,CentOS/RHEL 7已安装网络管理器,并处于启用状态。
查看网络管理程序状态:systemctl status NetworkManager。
查看网络子管理程序的状态:systemctl status network。
查看網絡連接狀態:
命令: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