shell编程
2025-12-31 14:00:29 0 举报
AI智能生成
1
作者其他创作
大纲/内容
Linux系统安装
安装rocky系统
在wml中点击文件,新建虚拟机
选择版本
设置名称和保存
选择磁盘大小
完成安装
打开虚拟机
设置密码和安装位置
安装和重启
输入账号和密码
输入指令vi /etc/sysconfig/network-scripts/ifcfg-ens33
子主题
编辑ip
重启,查看IP,并进行ping测试
连接虚拟机
连接成功
目录和文件操作
目录操作
Linux目录结构
树状结构,根节点是/
/
/bin 命令目录
/root 管理员目录
/sur 用户目录
/home 家目录
/mnt 文件挂载目录
/bin 命令目录
/root 管理员目录
/sur 用户目录
/home 家目录
/mnt 文件挂载目录
查看目录
ls
查看目录中的内容
ls 目录路径(查看特定目录)
ls (查看当前目录)
ls -l 目录路径(查看详细文件)
ls -a 目录路径(查看所有文件,包含隐藏文件)
ls (查看当前目录)
ls -l 目录路径(查看详细文件)
ls -a 目录路径(查看所有文件,包含隐藏文件)
示例1:查看根目录下的内容
ls /
ls /bin
ls
ls -l /etc
ls -a / 查看根目录所有文件
ls /
ls /bin
ls
ls -l /etc
ls -a / 查看根目录所有文件
ll
查看目录的详细信息,等价于ls -l
tree
查看目录的树状结构
用法:tree 目录路径
示例:查看/etc的树状结构
tree /etc
tree /etc
目录路径
绝对路径:完整路径,从根目录开始,如/usr/local/bin
相对路径:相当于当前目录的路径,如当前路径为/usr/local,则直接bin
切换目录
修改当前路径的位置
cd 目录路径
示例:切换到usr下的各个目录
pwd 查看当前目录的完整路径
创建目录
mkdir
用法:
mkdir 目录路径(创建一个目录)
mkdir 目录1 目录2(创建多个目录)
mkdir -p 目录1 目录2(创建多级目,-p自动创建上级目录)
mkdir 目录路径(创建一个目录)
mkdir 目录1 目录2(创建多个目录)
mkdir -p 目录1 目录2(创建多级目,-p自动创建上级目录)
示例:在otp中创建hello目录
cd otp
mkdir hello
ls
cd otp
mkdir hello
ls
示例:创建多个目录
mkdir hello1 hello2 hello3 hello4 hello5
或mkdir hello{1..5}
mkdir hello1 hello2 hello3 hello4 hello5
或mkdir hello{1..5}
示例:创建多级目录
mkdir -p aa/bb/cc
mkdir -p aa/bb/cc
删除目录
rm 删除目录或文件
用法:rm [选项】目录或文件路径
-r 递归删除
-f 强制删除
-r 递归删除
-f 强制删除
示例:删除目录
rm -rf test1
rm -rf test1
示例:删除多个目录
rm -rf test{1..5}
rm -rf h*(删除h开头文件)
rm -rf *(删除当前目录所有文件)
rm -rf test{1..5}
rm -rf h*(删除h开头文件)
rm -rf *(删除当前目录所有文件)
复制目录
复制目录或文件
用法:cp 源文件路径 目标文件路径
x选项:复制目录要加 -r 递归复制
x选项:复制目录要加 -r 递归复制
示例:mkdir aaa
cp -r aaa bbb
cp -r aaa bbb
移动目录
mv 移动目录或文件
用法:mv 源文件路径 目标文件路径
示例:给aaa命名为abc
mv aaa abc
mv aaa abc
示例:把bbb移到/mnt下
mv bbb /mnt/
mv bbb /mnt/
文件操作
创建文件
touch 用于创建空文件或修改文件状态(如果文件不存在就创建空文件,在就修改文件状态)
用法:touch 文件路径
示例:创建空文件
ttouch test1
创建多个文件
touch a{1..9}
修改文件状态
ttouch a1
ttouch test1
创建多个文件
touch a{1..9}
修改文件状态
ttouch a1
编辑文件
vi或vim(vi的升级版)
k可用于创建并编辑文件的内容
安装vim yum install -y vim
k可用于创建并编辑文件的内容
安装vim yum install -y vim
三种模式
命令模式(进入后默认的模式,不能编辑,可以复制粘贴,查找,删除)
编辑模式(命令模式按i或a进入)
命令行模式(命令模式下按:进入,可以保存,退出)
基本使用
1.创建文件
vi test1.txt
2.进入命令模式,按i进入编辑模式,进行编辑
3.编辑完成后,按esc退出到命令模式
4.按:进入命令行模式,输入wq保存退出
vi test1.txt
2.进入命令模式,按i进入编辑模式,进行编辑
3.编辑完成后,按esc退出到命令模式
4.按:进入命令行模式,输入wq保存退出
命令行模式的用法
:w保存
:q退出(没有修改时退出)
:q!强制退出(有修改时,不保存退出)
:wq保存退出
:q退出(没有修改时退出)
:q!强制退出(有修改时,不保存退出)
:wq保存退出
高级应用
复制粘贴
命令模式下:复制一行 yy
粘贴 p
复制多行 数字yy
粘贴 p
复制多行 数字yy
删除
删除一行 dd
删除多行 数字dd
查找文字
按/输入文字
按n切换到下一个
按n切换到下一个
撤销
按u
显示行号
输入:set number
粘贴模式
输入:set paste 回车
按i进入编辑模式(显示--IINSERT(paste)--)
将文字复制,按右键粘贴
b保证文字格式和原来文件一致
按i进入编辑模式(显示--IINSERT(paste)--)
将文字复制,按右键粘贴
b保证文字格式和原来文件一致
查看文件
cat
查看文件的所有内容
用法:cat 文件路径
more
分页查看文件的内容
用法:more 文件路径
回车显示下一行
空格显示下一页
a按b显示上一页
a按“显示第一页
按q退出
回车显示下一行
空格显示下一页
a按b显示上一页
a按“显示第一页
按q退出
head
显示文件的头几行
head -数字 文件路径
示例:显示文件的前三行
head -3 test1.txt
head -3 test1.txt
tail
显示文件的后几行
tail -数字 文件路径
示例:显示文件的后两行
tail -2 test1.txt
tail -2 test1.txt
sort
对文件排序
sort 文件名
-r 降序
-r 降序
基本的排序
降序排序
uniq
相邻内容去重
uniq 文件
压缩和解压
tar
压缩和解压文件
压缩包格式:tar/tar.gz/zip
压缩包格式:tar/tar.gz/zip
tar 选项 文件名
选项:
-c 压缩
-x 解压
-v 显示过程
-f 指定文件
-z y压缩格式gz
选项:
-c 压缩
-x 解压
-v 显示过程
-f 指定文件
-z y压缩格式gz
压缩文件
tar -cvf 文件1 文件2....
示例:
touch test{1..5}
tar -cvf test.tar test{1..5}
touch test{1..5}
tar -cvf test.tar test{1..5}
解压文件
tar -xvf 压缩包文件(默认解压到当前目录)
-C 指定解压目录
-C 指定解压目录
示例:
rm -rf test{1..5}
tar -xvf test.tar
解压到/mnt下
tar -xvf test.tar -C /mnt
rm -rf test{1..5}
tar -xvf test.tar
解压到/mnt下
tar -xvf test.tar -C /mnt
zip格式
zip
压缩zip格式包
zip 包名 文件...
zip test.zip test{1..5}
unzip
解压zip格式包
unzip 压缩包名
unzip test,zip
综合案例:安装JDK
1..将JDK安装包上传到/usr/local目录
2.切换到local下,节约安装包
cd /usr/local
tar -xvf jdk-17_linux-x64_bim.tar.gz
cd /usr/local
tar -xvf jdk-17_linux-x64_bim.tar.gz
3.给目录改名为jdk17
mv jdk-17.0.12 jdk17
mv jdk-17.0.12 jdk17
4.配置环境变量,修改profile文件
vi /etc/profile
在末尾加两行
export JAVA_HOME=/usr/local/jdk17
export PATH=$PATH:$JAVA_HOMEbin
vi /etc/profile
在末尾加两行
export JAVA_HOME=/usr/local/jdk17
export PATH=$PATH:$JAVA_HOMEbin
5.让环境变量生效
ssource /etc/profile
ssource /etc/profile
6.查看Java版本
java -version
java -version
文件查找
find
通过多种条件查找文件
用法:find 查找位置 查找条件 值
查找位置
特定位置:/etc
全盘查找:/
当前目录:.
按名称查找
-name "名称" 名称可以带*
示例:在/etc目录查找a开头文件
find /etc -name "a"
示例:全盘查找以.sh结尾的文件
find / -name ".sh"
find /etc -name "a"
示例:全盘查找以.sh结尾的文件
find / -name ".sh"
按大小查找
-size 大小 (大小可以带单位,k,g,m,+大于 -小于)
示例:在/etc目录查找大于10M的文件
find /etc -size +10M
find /etc -size +10M
示例:全盘查找大于500M的文件
find / -size +500M
find / -size +500M
示例:在/etc下查找s开头的,大小在1k到20K之间的文件
find /etc -name "s*" -size +1k -size -20k
find /etc -name "s*" -size +1k -size -20k
按类型查找
- type 类型 f 普通文件 d 目录 l 链接文件 块文件
示例:在/etc下查找n开头的链接文件
find /etc -name "n*"-type l
find /etc -name "n*"-type l
示例:全盘查找a开头,大于1k的普通文件
find / -name "a*" -size +1k -type f
find / -name "a*" -size +1k -type f
按时间查找
-citme 创建时间 -atime 访问时间 -mtime 修改时间
示例:在/usr目录下查找小于10k,三天内创建的文件
find/usr -size -10k -ctime -3
find/usr -size -10k -ctime -3
示例:全盘查找以s开头s结尾,大小在1k到2M之间,创建时间在2天到5天之内的普通文件
find / -name "s*s" -size +1k -size -2M -ctime +2 -ctime -5 -type f
find / -name "s*s" -size +1k -size -2M -ctime +2 -ctime -5 -type f
文件统计
wc
统计文件的行数,字节数,字符数等信息
用法:wc 选项 文件路径
选项:
-l 行数
-m 字符数
-c 字节数
-L最长行的行数
-w 单词数
选项:
-l 行数
-m 字符数
-c 字节数
-L最长行的行数
-w 单词数
示例:统计文件信息
管道符
|
将多个命令依次执行,前面执行的结果,作为后面命令的输入
用法:命令1 | 命令2 | 命令3....
示例:统计磁盘上脚本(以.sh结尾的文件)的数量
find / -mane "*.sh" -type f | wc -l
find / -mane "*.sh" -type f | wc -l
示例:统计文件中不重复的内容数量
cat test1 | sort | uniq | wc -l
cat test1 | sort | uniq | wc -l
显示文件中3行到5行的内容 head tail
cat test1 | head -5 | tail -2
cat test1 | head -5 | tail -2
重定向
读写文件
>
写入文件对原有内容进行覆盖
示例:写入文字到test1中
echo "hello" > test1
echo "hello" > test1
示例:统计磁盘上脚本的数量保存到count中
find / -name "*.sh" -type f | wc -l > count
find / -name "*.sh" -type f | wc -l > count
>>
写入文件,对原有内容进行追加
示例:写入文字到test1中
echo "hello" >> test1
echo "hello" >> test1
<
从文件读取
示例:读取文字
cat < test1
cat < test1
示例:复制文件
cat <test1> test2
cat <test1> test2
<<
从控制台读取文字,遇到结束符停止
读取文字,写入test文件
cat > test <<EOF
...........
...........
EOF
cat > test <<EOF
...........
...........
EOF
用户和权限相关操作
Lunix是多用户多任务的操作系统,不同的用户拥有不同的权限
用户分为
超级管理员 root 最高权限 uid 是 0
系统用户 系统自带uid在1到999
自定义用户 自己创建的 uid>=1000
用户相关文件
/etc/passwd 用户信息
用户名:密码:用户ID:组ID:家目录:解释器类型
/etc/shadow 用户密码
用户名:加密后的密码:密码过期时间
/etc/group 用户组信息
组名:组密码:组ID
用户相关命令
查看用户
id 用户名
显示用户名和组的相关信息
创建用户
useradd 选项 用户名
选项:
-g 设置组
-G 设置附加组
-u 设置uid
-d设置家目录(默认在home)
-m自动创建家目录
选项:
-g 设置组
-G 设置附加组
-u 设置uid
-d设置家目录(默认在home)
-m自动创建家目录
示例
1.创建test用户
useradd test
useradd test
创建用户如果没有设置组,会自动创建和用户同名的组
2.创建test1用户,设置组为test
useradd -g test test1
useradd -g test test1
创建用户设置组,不会创新组
3.创建test2用户,附加组有test和root
uuseradd -G test,root test2
uuseradd -G test,root test2
附加组可以有多个
4.创建test3用户,设置uid为1800
useradd -u 1800 test3
useradd -u 1800 test3
5,创建用户test4,设置家目录为/otp/test4
useradd -d /otp/test5 -m test5
useradd -d /otp/test5 -m test5
设置密码
passwd
交互式
passwd 用户名
非交互式
echo "密码" | passwd 用户 --stdin
切换用户
su
su 用户名(不会修改当前目录,不会加载用户的配置)
su -用户名(切换到用户的家目录,会加重用户的配置)
修改用户
usermod
用法:usermod 选项 用户
选项和usermod相同
选项和usermod相同
示例.修改test的id
usermod -u 2000 test
usermod -u 2000 test
示例.修改用户test的组为root
usermod -g root test
usermod -g root test
删除用户
userdel
用法:userdel 选项 用户
选项:-f 强制删除
-r 删除家目录
选项:-f 强制删除
-r 删除家目录
用户组的操作
查看组
groups 用户
查看用户所属组
查看用户所属组
创建组
groupadd 选项 组名
-g 组id
-g 组id
示例:groupadd hello
groupadd -g 1888 hello1
tail/ect/group
groupadd -g 1888 hello1
tail/ect/group
修改组
groupmod 选项 组名
-g 组id
-n 组名
-g 组id
-n 组名
示例:groupmod -g 1999 hello
groupmod -n hello123 hello1
groupmod -n hello123 hello1
删除组
groupdel 组名
示例:groupdel 组名
权限的相关操作
权限表示形式
字符表示法
权限字符串结构
结构(10字符):文件类型+所有者+同组+其他
文件类型标识
文件类型:-(普通)、d(目录)、l(链接)
权限字符含义
权限字符:r(读)、w(写)、x(执行)、-(无)
数字表示法
换算规则说明
r=4、w=2、x=1、无=0,每组权限为数字和
对应关系:---=0、--x=1、-w-=2、-wx=3
对应关系:r--=4、r-x=5、rw-=6、rwx=7
修改权限(chmod)
数字修改法
格式:chmod 权限数字 文件路径
示例:chmod 666 test.txt、chmod 755 test.txt
字符修改法
分组符号:u(所有者)、g(同组)、o(其他)、a(全部)
权限符号:=(设权限)、+(加权限)、-(删权限)
给所有者加写:chmod u+w test.txt
同组设为读写:chmod g=rw test.txt
删其他执行权:chmod o-x test.txt
所有用户加写:chmod a+w test.txt(或chmod +w test.txt)
Linux系统服务与软件管理
系统服务
由系统进行管理的软件服务,可通过systemctl命令实现全生命周期管理,适用于firewalld、sshd等各类服务。
核心命令格式:systemctl 操作 服务名
常用操作说明:
start :启动指定服务
stop :停止指定服务
restart :重启指定服务
reload :重加载服务配置(不中断服务运行)
enable :启用服务开机自启功能
disable :禁用服务开机自启功能
status :查看服务当前运行状态(含进程、启动情况等)
常用系统服务:
firewalld :系统防火墙服务,管控网络访问权限
sshd :远程登录服务,支持SSH协议连接服务器
二、软件管理
软件安装方式:
源码包
安装步骤相对繁琐,需手动完成配置、编译等流程,但可根据实际需求灵活定制软件功能与安装路径,适合对软件有特殊要求的场景。
在线安装
安装过程简单高效,包管理工具会自动处理依赖关系,配置相对固定,适合快速部署常用软件。不同Linux发行版默认包管理工具不同:
CentOS、Rocky、红帽系统:默认使用yum
Ubuntu系统:默认使用apt
yum包管理工具:
yum基于远程软件仓库工作,可实现软件的搜索、下载、安装、卸载等一站式操作。
为提升下载速度建议优先配置国内镜像源。
为提升下载速度建议优先配置国内镜像源。
备份系统默认源文件:mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载阿里云源文件:curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
列举所有软件:yum list
搜索目标软件:yum search 软件名(示例:yum search vim)
安装指定软件:yum install 软件名(示例:yum install -y nginx,-y表示自动确认)
卸载已装软件:yum remove 软件名(示例:yum remove -y vim)
升级所有软件:yum upgrade
更新指定软件:yum update 软件名(示例:yum update vim)
清理软件缓存:yum clean all
创建新缓存:yum makecache(提升后续操作速度)
综合案例:安装Apache服务器并部署网站:
卸载旧版httpd(若系统中已存在)
执行命令:yum remove -y httpd(-y参数跳过确认步骤,直接卸载)
安装httpd服务
执行命令:yum install -y httpd
启动httpd服务并验证运行状态
启动服务:systemctl start httpd
查看状态:systemctl status httpd(状态显示“active (running)”即为启动正常)
本地测试httpd服务可用性
执行命令:curl localhost,若返回Apache默认页面内容,说明服务正常提供服务
关闭系统防火墙(便于外部访问,生产环境建议配置端口规则而非关闭)
临时停止防火墙:systemctl stop firewalld
禁用防火墙开机自启:systemctl disable firewalld
外部浏览器初步访问测试
在本地浏览器地址栏输入:http://虚拟机的IP地址,此时可看到Apache默认欢迎页面
准备自定义网站页面代码
通过AI生成所需的HTML代码(如个人主页、产品展示页等),复制代码备用
上传自定义页面至Apache根目录
进入Apache默认根目录:cd /var/www/html
创建并编辑首页文件:vim index.html
粘贴模式(避免代码格式错乱):输入:set paste并回车
进入编辑模式:按i键,粘贴准备好的HTML代码
保存并退出:按Esc键,输入:wq后回车
重启httpd服务使配置生效
执行命令:systemctl restart httpd
验证自定义网站效果
shell编程
Shell入门
Shell是什么
Shell是一种命令解释器,能将Linux命令翻译成内核可执行的指令,是用户与系统交互的桥梁。
Shell也是一种编程语言,具备变量、分支、循环等完整语法,可编写脚本实现批量操作。
Shell能做什么
核心作用:将零散的Linux指令整合为脚本,实现自动化运行,适用于自动化运维场景(如软件部署、数据备份等)。
Shell解释器
常见类型
1. /bin/bash:系统默认解释器,功能完善,使用最广泛。
2. /bin/sh:早期版本,功能相对简单,部分系统中是bash的软链接。
3. 其他:perl、python、c等(非传统Shell,可作为脚本解释器)。
相关操作命令
1. 显示当前使用的解释器:echo $SHELL
2. 查看系统支持的所有解释器:cat /etc/shells
3. 切换默认解释器:chsh -s 解释器路径(示例:chsh -s /bin/sh,需重新登录生效)
Shell脚本
命名规则
以.sh结尾,明确标识为Shell脚本;
文件名由字母、数字、下划线组成,使用有意义的单词(如install_httpd.sh);
禁止包含%、$、&等特殊符号,避免解析错误。
执行脚本的方式
1../脚本 (必须有执行权限)
2..脚本 (必须有执行权限)
3.完整路径/脚本 (必须有执行权限)
4. sh 脚本 (不需要执行权限)
5.bash 脚本 (不需要执行权限)
6.source 脚本 (不需要执行权限)
2..脚本 (必须有执行权限)
3.完整路径/脚本 (必须有执行权限)
4. sh 脚本 (不需要执行权限)
5.bash 脚本 (不需要执行权限)
6.source 脚本 (不需要执行权限)
第一个Shell脚本(Hello World)
1.创建脚本文件
cd /otp
vim hello.sh
2.首行添加
#!/bin/bash
指定脚本解释器
3.添加代码
#输出一行文字
echo "hello world"
4.添加执行权限
chmod u+x hello.sh
5.运行
./hello.sh
cd /otp
vim hello.sh
2.首行添加
#!/bin/bash
指定脚本解释器
3.添加代码
#输出一行文字
echo "hello world"
4.添加执行权限
chmod u+x hello.sh
5.运行
./hello.sh
实操案例:自动化部署网站
前期准备:创建网页文件
在/opt目录创建网页文件,粘贴自定义HTML代码
cd /opt
vim index.html
cd /opt
vim index.html
编写自动化部署脚本
创建脚本install_httpd.sh,整合完整部署流程:
vim install_httpd.sh
脚本代码如下:
#!/bin/bash
自动化部署Apache网站脚本
1. 卸载旧版httpd,避免冲突
yum remove -y httpd
2. 安装httpd服务
yum install -y httpd
3. 启动httpd服务
systemctl start httpd
4. 关闭防火墙(便于外部访问,生产环境配置端口)
systemctl stop firewalld
5. 复制网页到Apache根目录
cp index.html /var/www/html/index.html
6. 重启httpd,使配置生效
systemctl restart httpd
7.运行
chmod u+x install_hattp.sh
./install_hattp.sh
vim install_httpd.sh
脚本代码如下:
#!/bin/bash
自动化部署Apache网站脚本
1. 卸载旧版httpd,避免冲突
yum remove -y httpd
2. 安装httpd服务
yum install -y httpd
3. 启动httpd服务
systemctl start httpd
4. 关闭防火墙(便于外部访问,生产环境配置端口)
systemctl stop firewalld
5. 复制网页到Apache根目录
cp index.html /var/www/html/index.html
6. 重启httpd,使配置生效
systemctl restart httpd
7.运行
chmod u+x install_hattp.sh
./install_hattp.sh
shell变量
变量是什么
变量是程序中内存空间,可以存在不同的数据
变量的命名规则
由字母、数字、下划线和$组成
不能由数字开头
不能是命令或关键字
要由有意义的单词组成,如:goods_price
不能由数字开头
不能是命令或关键字
要由有意义的单词组成,如:goods_price
自定义变量
开发者自己定义的变量,用于完成特定业务
定义变量
变量名=值
示例:
name="张三”
age=20
name="张三”
age=20
使用变量
S{变量]
echo ${name)
减少变量使用的歧义
echo ${name)
减少变量使用的歧义
示例:
echo $name
echo ${name}
echo $name
echo ${name}
输出:张三_20_宜昌
echo $name_$age_$address 存在问题,改为:
echo ${name}_${age}_${address]
echo $name_$age_$address 存在问题,改为:
echo ${name}_${age}_${address]
子主题
环境变量
自定义变量属于局部变量,只能在当前的Shell进程中使用,环境变量属于全局变
量,所有Shell进程都可以访问
量,所有Shell进程都可以访问
系统再带的环境变量
$SHELL 当前SHELL解释器
$PATH程序路径
$LANG语言
$RANDOM 随机数
$SHELL 当前SHELL解释器
$PATH程序路径
$LANG语言
$RANDOM 随机数
定义环境变量
export 变量=值
使用环境变量
和普通变量相同$变量名或${变量名}
案例:普通变量和环境变量的区别
在命令行,定义普通变量和环境变量
a=100
export b=200
创建脚本 vim test1.sh
#/bin/bash
echo "a=$a b=$b"
添加执行权限
chmod u+x test1.sh
./test1.sh
在命令行,定义普通变量和环境变量
a=100
export b=200
创建脚本 vim test1.sh
#/bin/bash
echo "a=$a b=$b"
添加执行权限
chmod u+x test1.sh
./test1.sh
位置变量
使用脚本时,可以向脚本传入参数,位置变量可以获取传入的参数
用法
$n n是数字,$1代表第1参数
$@代表所有参数
$#代表参数的数量
$0代表文件名
$@代表所有参数
$#代表参数的数量
$0代表文件名
案例
vim test2.sh
特殊变量
$?
上一个命令的执行结果
0成功>0失败
0成功>0失败
$$
当前Shel进程的边程号
$!
上一个后台进程的进程号
特殊符号
"双引号"
弱引用,在字符串中输出变量的值
"a=$a”---> a=100
"a=$a”---> a=100
"单引号"
强引用,字符串会原样输出
'a=Sa'---> a=$a
'a=Sa'---> a=$a
'反引号‘
可以执行命令,将命令的结果赋值给变量
a='ls -l wc -l'
a='ls -l wc -l'
$()
和反引号作用相同,不容易出现混淆
a=$(ls - l |wc -l)
a=$(ls - l |wc -l)
$(())
变量进行运算
a=1 b=2 c=$((a+b))
a=1 b=2 c=$((a+b))
只读变量
定义后不能修改的变量
readonly 变量=值
readonly pi=3.14
pi=3.15
pi=3.15
变量输入
read 选项 变量名
选项:-p“提示文字
选项:-p“提示文字
示例:
read -p"请输入账号"usemame
read -p"请输入密码"password
echo $username $password
read -p"请输入账号"usemame
read -p"请输入密码"password
echo $username $password
案例:完成脚本,在脚本中输入两个变量的值,交换两个变量
read -p“输入第一个变量的值:"num1
read -p"输入第二个变量的值:"num2
echo"交换前:$num1 $num2"
tmp=$num1
num1=$num2
num2=$tmp
echo"交换后:$num1 $num2"
read -p“输入第一个变量的值:"num1
read -p"输入第二个变量的值:"num2
echo"交换前:$num1 $num2"
tmp=$num1
num1=$num2
num2=$tmp
echo"交换后:$num1 $num2"
shell的运算符
运算符表达式
((表达式1,表达式2))
可以包含多个表达式,从左向右执行,引用变量不加$
可以包含多个表达式,从左向右执行,引用变量不加$
如:((a=1,b=2,c=a+b))
[表达式 ]
包含一个表达式,引用变量要加$
包含一个表达式,引用变量要加$
expr 表达式
包含一个表达式,引用变量要加$,运算符两边要加空格
包含一个表达式,引用变量要加$,运算符两边要加空格
算术运算符
执行数学运算的符号,有:+、-、*、/、%、**、++、--
基本的算术运算
read -p"请输入第一个数:" num1
read -p"请输入第二个数:" num2
echo“$num1 +$num2=$((num1+num2))
echo "$num1 -$num2=$((num1-num2))"
echo "$num1* $num2 =$((num1*num2)
echo“$num1/$num2=$((num1/num2))
echo "$num1 % $num2=$((num1%num2))
echo “$num1 ** $num2 = $((num1**num2))
read -p"请输入第一个数:" num1
read -p"请输入第二个数:" num2
echo“$num1 +$num2=$((num1+num2))
echo "$num1 -$num2=$((num1-num2))"
echo "$num1* $num2 =$((num1*num2)
echo“$num1/$num2=$((num1/num2))
echo "$num1 % $num2=$((num1%num2))
echo “$num1 ** $num2 = $((num1**num2))
自增自减运算
属于一元运算符
变量++
变量--
变量++
变量--
变量++ 后缀
++变量 前缀
++变量 前缀
没有和其他运算一起执行,前缀和后缀没有区别
有其他运算一起执行,前缀是先执行自增或自减,再执行其
他运算,后缀是先执行其他运算,再执行自增或自减
他运算,后缀是先执行其他运算,再执行自增或自减
优先级
11+9-8*4/3%5**2=?
++-->**>*/%>+-
++-->**>*/%>+-
赋值运算符
将表达式的值保存到变量中
变量=表达式 ,从右到左运算,计算右边表达式的值,存入左边的变量
符合赋值运算符,结合算术运算符和赋值运算,有:
+=、-=、*=、/=、%=
a+=5 相当于 a=a+5
+=、-=、*=、/=、%=
a+=5 相当于 a=a+5
关系运算符
用于比较两个数值的大小,结果是真(1)或假(0)
-eq 相等,相当于==,[$a-eg 10]
-ne 不相等,相当于!=,[$a -ne 10]
-gt大于 ,相当于>
-lt 小于,相当于<
-ge 大于等于,相当于>=
-le 小于等于,相当于<=
-ne 不相等,相当于!=,[$a -ne 10]
-gt大于 ,相当于>
-lt 小于,相当于<
-ge 大于等于,相当于>=
-le 小于等于,相当于<=
字符串的比较
相等 =[$name ="张三"]
不相等!=[$name!="张三"]
为空 -z[-z $name]
不为空 -n[-n $name]
相等 =[$name ="张三"]
不相等!=[$name!="张三"]
为空 -z[-z $name]
不为空 -n[-n $name]
逻辑运算符
与 -a[条件1-a条件2] 两个条件必须同时成立,结果为真,否则为假
或 -0[条件1-0 条件2]两个条件有一个成立,结果为真,否则为假
非 -n[-n 条件]条件取反,真变假,假变真
文件测试运算符
-e 判断文件是否存在[-e $file]
-f 判断是否是普通文件[-f $file]
-d 判断是否是目录
-1 判断是否是链接
-b 判断是否是块文件
x 判断是否有执行权限
-w 判断是否有写权限
-r 判断是否有读权限
-f 判断是否是普通文件[-f $file]
-d 判断是否是目录
-1 判断是否是链接
-b 判断是否是块文件
x 判断是否有执行权限
-w 判断是否有写权限
-r 判断是否有读权限
分支语句
按条件进行判断,执行不同的语句
基本if语句
条件成立会执行if后的语句,不成立就不执行
if[条件]
then
语句
fi
then
语句
fi
案例:输入人的年龄,判断是否成年人
read -p"请输入你的年龄”age
if[ $age -ge 18 ]
then
echo"你是成年人"
fi
read -p"请输入你的年龄”age
if[ $age -ge 18 ]
then
echo"你是成年人"
fi
if-else语句
条件成立会执行i后的语句,不成立会执行else后的语句
if[条件]
then
语句
else
语句
fi
then
语句
else
语句
fi
案例:输入人的年龄,判断是否成年人
read -p"请输入你的年龄”age
if[ $age -ge 18]
then
echo"你是成年人"
else
echo"你是未成年人"
fi
read -p"请输入你的年龄”age
if[ $age -ge 18]
then
echo"你是成年人"
else
echo"你是未成年人"
fi
案例:输入一个数,判断是奇数还是偶数
read -p"请输入一个数”num
if[ $[$num%2] -eg 0 ]
hhen
echo"Snum是偶数"
else
echo“Snum是奇数”
fi
read -p"请输入一个数”num
if[ $[$num%2] -eg 0 ]
hhen
echo"Snum是偶数"
else
echo“Snum是奇数”
fi
案例:输入年份,判断是否是闰年(年份能被400整除 或者 年份能被4
整除并且不能被100整除)
read-p"请输入年份:"year
if[ s[$year%400]-8q0-0 $[$year%4]-e9 0 -a $[$year%100]-ne 0 ]
men
echo"syear是闰年"
else
echo"Syear不是闰年”
fi
整除并且不能被100整除)
read-p"请输入年份:"year
if[ s[$year%400]-8q0-0 $[$year%4]-e9 0 -a $[$year%100]-ne 0 ]
men
echo"syear是闰年"
else
echo"Syear不是闰年”
fi
案例:招公务员,条件是籍贯是宜昌,年龄小于等于40岁
read -p"请输入籍贳" addr
read -p"请输入年龄" age
if [ -z $addr]
then
echo“籍贯不能为空"
exit
if[ -z $age ]
then
echo"年龄不能为空"
exit
if[ $addr ="宜昌"-a $age -le 40 ]
then
echo"你可以报名"
else
echo"你没有报名资格"
fi
read -p"请输入籍贳" addr
read -p"请输入年龄" age
if [ -z $addr]
then
echo“籍贯不能为空"
exit
if[ -z $age ]
then
echo"年龄不能为空"
exit
if[ $addr ="宜昌"-a $age -le 40 ]
then
echo"你可以报名"
else
echo"你没有报名资格"
fi
多重if语句
可以判断多个条件,依次判断条件,有一个成立就执行后面的语句,执行后结束
if[条件1]
then
语句
elif[条件2]
then
语句
else
语句
fi
then
语句
elif[条件2]
then
语句
else
语句
fi
案例:输入你的成绩,判断出优良中差
read -p"请输入你的成绩:"score
if[ $score -ge 90 ]
then
echo"你的成绩是优秀"
elif[ $score -ge 80 ]
then
echo"你的成绩是良好"
elif[ $score -ge 60 ]
then
echo"你的成绩是中等”
else
echo"你的成绩是较差”
read -p"请输入你的成绩:"score
if[ $score -ge 90 ]
then
echo"你的成绩是优秀"
elif[ $score -ge 80 ]
then
echo"你的成绩是良好"
elif[ $score -ge 60 ]
then
echo"你的成绩是中等”
else
echo"你的成绩是较差”
案例:输入两个数,输出两个数的大小关系
read -p"请输入第一个数:"num1
read -p"请输入第二个数:"num2
if [ $num1 -gt $num2 ]
then
echo"Snum1大于Snum2'
elif [ Snum1 -lt $num2 ]
then
echo"Snum1小于Snum2'
else
echo"snum1等于$num2'
fi
read -p"请输入第一个数:"num1
read -p"请输入第二个数:"num2
if [ $num1 -gt $num2 ]
then
echo"Snum1大于Snum2'
elif [ Snum1 -lt $num2 ]
then
echo"Snum1小于Snum2'
else
echo"snum1等于$num2'
fi
案例:输入一个文件路径,判断其是普通文件还是目录还是
其他类型的文件,如果是普通文件,则判断是否有写权限,
有的话就往文件写入一段文字
read -p"请输入一个文件路径"file
if[ -e sfile ]
then
echo"sfile文件存在"
else
echo"sfile不存在”
exit
fi
if[ -f sfle ]
then
echo"sfile是普通文件”
if [ -w $fle ]
then
echo "hello" >> Sfile
cat $file
fi
elif [ -d $file ]
then
echo"sfile是目录”
else
echo"sfle是其他类型文件"
fi
其他类型的文件,如果是普通文件,则判断是否有写权限,
有的话就往文件写入一段文字
read -p"请输入一个文件路径"file
if[ -e sfile ]
then
echo"sfile文件存在"
else
echo"sfile不存在”
exit
fi
if[ -f sfle ]
then
echo"sfile是普通文件”
if [ -w $fle ]
then
echo "hello" >> Sfile
cat $file
fi
elif [ -d $file ]
then
echo"sfile是目录”
else
echo"sfle是其他类型文件"
fi
案例:输入一个用户名,判断该用户是否存在,如果不存在则
创建该用户,并为其设置密码
read -p"请输入用户名:"usemame
id Susemame &> idew'null
if[s? -eq 0]
then
echo"$usemame已经存在"
else
echo"创建Susername"
useradd suserame
echo "123"passwd $usemame --stdin
fi
创建该用户,并为其设置密码
read -p"请输入用户名:"usemame
id Susemame &> idew'null
if[s? -eq 0]
then
echo"$usemame已经存在"
else
echo"创建Susername"
useradd suserame
echo "123"passwd $usemame --stdin
fi
case语句
判断表达式的值,如果值能够匹配上,就执行该值后面的语句
case 变量表达式 in
值1)
语句1
;;
值2)
语句2
;;
*)
缺省语句
esac
值1)
语句1
;;
值2)
语句2
;;
*)
缺省语句
esac
案例:向脚本传入三个参数:数字1数字2 运算符
判断运算符执行算术运算
case $3 in
”+“)
echo "s1+ $2 = $(($1+$2))"
;;
"-")
echo"s1-$2= $(($1-52))"
;;
"*")
echo "s1*$2 = $(($1*$2))"
""
"/")
echo"s11$2 = $(($11$2))"
""
"%")
echo 's1 %6 $2 = $(($1%52))"
""
"**")
echo"s1**$2 =$(($1**$2))"
;;
"*")
echo"运算符错误"
;;
esac
判断运算符执行算术运算
case $3 in
”+“)
echo "s1+ $2 = $(($1+$2))"
;;
"-")
echo"s1-$2= $(($1-52))"
;;
"*")
echo "s1*$2 = $(($1*$2))"
""
"/")
echo"s11$2 = $(($11$2))"
""
"%")
echo 's1 %6 $2 = $(($1%52))"
""
"**")
echo"s1**$2 =$(($1**$2))"
;;
"*")
echo"运算符错误"
;;
esac
循环语句
for循环
固定次数循环
循环三个要素:变量初始化,循环条件,变量更新
for((变量=值;循环条件,变量更新))
do
语句
done
do
语句
done
案例:循环10次
for((i=1;i<=10;i++))
do
echo "i=$i"
done
for((i=1;i<=10;i++))
do
echo "i=$i"
done
遍历式循环
案例:循环10次
for i in {1..10}
do
echo "i=$i"
done
案例:遍历任意多个数
fori in 44 33 88 66 99
do
echo "i=$i"
done
案例:脚本传入多个参数,将多个参数值求和
sum=0
for i in $@
do
((sum+=i))
done
echo"参数的和是: $sum"
案例:遍历/opt目录所有文件名
files=$(ls /opt)
for f in $files
do
echo"文件有:$f"
done
可以用于依次访问多个数据(数组,序列..)
for 变量 in $数组 或 序列
do
语句
done
do
语句
done
案例:循环10次
for i in {1..10}
do
echo "i=$i"
done
案例:遍历任意多个数
fori in 44 33 88 66 99
do
echo "i=$i"
done
案例:脚本传入多个参数,将多个参数值求和
sum=0
for i in $@
do
((sum+=i))
done
echo"参数的和是: $sum"
案例:遍历/opt目录所有文件名
files=$(ls /opt)
for f in $files
do
echo"文件有:$f"
done
while循环
先判断循环条件,如果成立就执行循环,不成立就结束循环
while[条件] -->while((条件))
do
语句
done
do
语句
done
案例:循环输出1~10
i=1
while [ $i -le 10 ]
do
echo "i= $i"
((i+))
done
i=1
while [ $i -le 10 ]
do
echo "i= $i"
((i+))
done
案例:假设一张纸是1毫米,问对折多少次后能达到珠峰高度8848米
i=1
count=0
while [ $i -le 8848000 1
do
((i*=2))
((count++))
done
echo"对折$count次”
i=1
count=0
while [ $i -le 8848000 1
do
((i*=2))
((count++))
done
echo"对折$count次”
until循环
先判断循环条件,条件成立就结束循环,否则就执行循环
unti[条件]
do
语句
done
do
语句
done
案例:输出1~10
i=1
until [ $i -gt 10 ]
do
echo "i= $i"
((i++))
done
i=1
until [ $i -gt 10 ]
do
echo "i= $i"
((i++))
done
案例:打印20个斐波拉契数列:112358132134 55
n1=1
n2=1
echo -n "$n1 $n2 "
count=0
until [ $count -ge 9 ]
do
((n1=n1+n2))
((n2=n1+n2))
echo -n "$n1 $n2 "
((count++))
done
n1=1
n2=1
echo -n "$n1 $n2 "
count=0
until [ $count -ge 9 ]
do
((n1=n1+n2))
((n2=n1+n2))
echo -n "$n1 $n2 "
((count++))
done
循环控制
在循环过程中,通过条件判断来决定是否结束循环,或跳过本次循环
break
结束循环
案例:上班365天,到100天中大奖,跟老板提出辞职
for((i=1;i<=365;i++))
do
if[ $i -eg 100 ]
then
echo"哇!我中了大奖!小王,以后我不去了!"
break
echo"我上了$i天班”
done
for((i=1;i<=365;i++))
do
if[ $i -eg 100 ]
then
echo"哇!我中了大奖!小王,以后我不去了!"
break
echo"我上了$i天班”
done
continue
跳过本次循环,执行下一次
跳过本次循环,执行下一次
案例:上班365天,到100天骑车摔了,跟老板请假一天
for((i=1:i<=365:i++))
do
if[$i -eg 100]
then
echo“哇!前面有个坑!王老板,我摔了,今天能不能
请个假?"
continue
fi
echo"我上了$i天班”
done
for((i=1:i<=365:i++))
do
if[$i -eg 100]
then
echo“哇!前面有个坑!王老板,我摔了,今天能不能
请个假?"
continue
fi
echo"我上了$i天班”
done
案例:开发抽奖游戏,产生1~100的随机数,给5次机会输入数,数
字比随机数大或小要进行提示,如果相等就提示中奖并结束循环
rand=$((SRANDOM%100+1))
for((i=1;i<=5:i++))
do
read -p"请输入一个数:" num
if [ $num -gt $rand
then
echo"你猜大了"
elif [ $num -lt $rand ]
then
echo“你猜小了"
else
echo“恭喜你,中奖了!"
break
fi
done
字比随机数大或小要进行提示,如果相等就提示中奖并结束循环
rand=$((SRANDOM%100+1))
for((i=1;i<=5:i++))
do
read -p"请输入一个数:" num
if [ $num -gt $rand
then
echo"你猜大了"
elif [ $num -lt $rand ]
then
echo“你猜小了"
else
echo“恭喜你,中奖了!"
break
fi
done
嵌套循环
在循环内部可以完整嵌套另一个循环,外部循环每执行一次,
内部循环会执行一轮
内部循环会执行一轮
for
for
while
while
for
while
while
案例:打印矩形(内部循环输出多个*,外部循环
控制打印行数)
# 外层循环控制行数
for((i=1:i<=4:i++))
do
# 内层循环控制*数
for((j=1;j<=5;j++))
do
echo -n "* "
done
# 输出换行
echo ""
done
改进:将行数和列数改为参数控制 $1 $2
控制打印行数)
# 外层循环控制行数
for((i=1:i<=4:i++))
do
# 内层循环控制*数
for((j=1;j<=5;j++))
do
echo -n "* "
done
# 输出换行
echo ""
done
改进:将行数和列数改为参数控制 $1 $2
案例:打印正三角型
*
* *
* * *
* * * *
for((i=1;i<=4;i++))
do
for((j=1;j<=i;j++))
do
echo -n "*"
done
echo"
done
*
* *
* * *
* * * *
for((i=1;i<=4;i++))
do
for((j=1;j<=i;j++))
do
echo -n "*"
done
echo"
done
案例:等腰三角形
* 1 3空(4-行) 1*(2*行-1)
* * * 2 2空 3*
* * * * * 3 1空 5*
* * * * * * * 4 0空 7*
for((i=1;i<=4;i++))
do
for((j=1;j<=$((4-i));j++))
do
echo -n " "
for((k=1;k<=$((2*i-1));k++))
do
echo -n "*"
done
echo
done
* 1 3空(4-行) 1*(2*行-1)
* * * 2 2空 3*
* * * * * 3 1空 5*
* * * * * * * 4 0空 7*
for((i=1;i<=4;i++))
do
for((j=1;j<=$((4-i));j++))
do
echo -n " "
for((k=1;k<=$((2*i-1));k++))
do
echo -n "*"
done
echo
done
数组
可以同时保存多个数据,方便运算
定义数组
数组名=(值1 值2 值3 )
如:names=("张三" "李四" "万五")
访问数组
数组元素通过下标来访问的,下标从0开始
修改数组元素
数组名[下标]=值
如:names[0]="刘备"
访问数组元素
${数组名[下标]}
如:echo ${names[0]} ${names[1]} ${names[2]}
访问所有元素
${数组名[@]}
如:echo ${names[@]}
访问数组长度
${#数组名[@]}
如:echo ${#names[@]}
截取数组
${数组名[@]:开始下标:长度}
如:
echo "前三位是:${names[@]:0:3}"
echo "后三位是:${names[@]:3:3}"
echo "前三位是:${names[@]:0:3}"
echo "后三位是:${names[@]:3:3}"
遍历数组
常见for循环
案例:
names=("张三" "李四" "王五" "赵六")
#获得数组的长度
len=${#names[@]}
for((i=0;i<len;i++))
do
echo "第$((i+1))人是:${names[$i]}
done
names=("张三" "李四" "王五" "赵六")
#获得数组的长度
len=${#names[@]}
for((i=0;i<len;i++))
do
echo "第$((i+1))人是:${names[$i]}
done
for-in循环
案例:
nums=(77 88 99 102 802 622)
for n in ${nums[@]}
do
echo "num=${n}"
done
nums=(77 88 99 102 802 622)
for n in ${nums[@]}
do
echo "num=${n}"
done
相关案例
1)输入5个同学的成绩,计算总分和平均分
scores=()
len=5
sum=0
for((i=0;i<len;i++))
do
read -p "请输入第$((i+1))个同学成绩:" scores[$i]
sum=$[$sum+${scores[$i]}]
done
echo "总成绩是:$sum,平均分是:$((sum/len))"
scores=()
len=5
sum=0
for((i=0;i<len;i++))
do
read -p "请输入第$((i+1))个同学成绩:" scores[$i]
sum=$[$sum+${scores[$i]}]
done
echo "总成绩是:$sum,平均分是:$((sum/len))"
2)输入8个人的姓名,输入要查找的姓名,查找该人是否存在
names=()
len=8
for((i=0;i<len;i++))
do
read -p "请输入第$((i+1))个人的姓名:" names[$i]
done
read -p "请输入你要找的姓名:" name
pos=-1
for((i=0;i<len;i++))
do
echo "$name ${names[$i]}"
if [ $name = ${names[$i]} ]
then
pos=$i
break
fi
done
if [ $pos -eq -1 ]
then
echo "没有找到这个人"
else
echo "此人是第$((pos+1))个人"
fi
names=()
len=8
for((i=0;i<len;i++))
do
read -p "请输入第$((i+1))个人的姓名:" names[$i]
done
read -p "请输入你要找的姓名:" name
pos=-1
for((i=0;i<len;i++))
do
echo "$name ${names[$i]}"
if [ $name = ${names[$i]} ]
then
pos=$i
break
fi
done
if [ $pos -eq -1 ]
then
echo "没有找到这个人"
else
echo "此人是第$((pos+1))个人"
fi
3)输入5个数字,进行冒泡排序
nums=()
len=5
for((i=0;i<len;i++))
do
read -p "请输入第$((i+1))个数:" nums[$i]
done
# 外层循环控制比较轮数
for((i=0;i<$[$len-1];i++))
do
# 内层循环控制两两比较
for((j=0;j<$[$len-1-$i];j++))
do
# 前一个数比后一个数大,就交换
if [ ${nums[$j]} -gt ${nums[$[$j+1]]} ]
then
temp=${nums[$j]}
nums[$j]=${nums[$[$j+1]]}
nums[$[$j+1]]=$temp
fi
done
done
# 输出排序后结果
for n in ${nums[@]}
do
echo $n
done
nums=()
len=5
for((i=0;i<len;i++))
do
read -p "请输入第$((i+1))个数:" nums[$i]
done
# 外层循环控制比较轮数
for((i=0;i<$[$len-1];i++))
do
# 内层循环控制两两比较
for((j=0;j<$[$len-1-$i];j++))
do
# 前一个数比后一个数大,就交换
if [ ${nums[$j]} -gt ${nums[$[$j+1]]} ]
then
temp=${nums[$j]}
nums[$j]=${nums[$[$j+1]]}
nums[$[$j+1]]=$temp
fi
done
done
# 输出排序后结果
for n in ${nums[@]}
do
echo $n
done
文件三剑客
1)grep 文件内容的过滤
2)sed 按行查找并编辑文件内容
3)awk 按列处理文件,支持流程控制
2)sed 按行查找并编辑文件内容
3)awk 按列处理文件,支持流程控制
GREP命令
对文件内容进行过滤,支持正则表达式
语法
grep 选项 "内容" 文件路径
grep "root" /etc/passwd
选项
-i 表示忽略过滤信息的大小写
-o 表示只显示匹配到内容
-n 表示过滤信息显示输出行号
-c 表示统计过滤信息的次数
-v 表示对过滤信息进行取反显示
-e 表示多个条件过滤文件
-E 等价于egrep命令,识别扩展正则表达式
-m n 表示匹配前n次后停止匹配
-B n 表示过滤的信息和过滤信息前n行信息一起过滤输出
-A n 表示过滤的信息和过滤信息后n行信息一起过滤输出
-C n 表示过滤的信息和过滤信息前后n行信息一起过滤输出
-i 表示忽略过滤信息的大小写
-o 表示只显示匹配到内容
-n 表示过滤信息显示输出行号
-c 表示统计过滤信息的次数
-v 表示对过滤信息进行取反显示
-e 表示多个条件过滤文件
-E 等价于egrep命令,识别扩展正则表达式
-m n 表示匹配前n次后停止匹配
-B n 表示过滤的信息和过滤信息前n行信息一起过滤输出
-A n 表示过滤的信息和过滤信息后n行信息一起过滤输出
-C n 表示过滤的信息和过滤信息前后n行信息一起过滤输出
案例:
1)忽略大小写,查找root
grep -i "Root" /etc/passwd
1)忽略大小写,查找root
grep -i "Root" /etc/passwd
2)只显示匹配的内容
grep -o "root" /etc/passwd
grep -o "root" /etc/passwd
3)显示行号
grep -o -n "root" /etc/passwd
grep -o -n "root" /etc/passwd
4)统计root出现的行数
grep -c "root" /etc/password
grep -c "root" /etc/password
正则表达式
一些特殊文字符号,能够组合更灵活匹配的匹配字符串
元字符
. 任意一个字符
[ ] 匹配范围内的一个字符
[0-9] 数字
[a-z] 小写字母
[A-Z] 大写字母
[abc] abc中任意一个
[^abc] 不是abc的任意字符
[a-zA-Z0-9] 任意的字母或数字
[ ] 匹配范围内的一个字符
[0-9] 数字
[a-z] 小写字母
[A-Z] 大写字母
[abc] abc中任意一个
[^abc] 不是abc的任意字符
[a-zA-Z0-9] 任意的字母或数字
案例
1)找passwd文件中所有的数字
grep "[0-9]" /etc/passwd
1)找passwd文件中所有的数字
grep "[0-9]" /etc/passwd
位置匹配
^ 匹配开头
$ 匹配结尾
$ 匹配结尾
案例
1)查找root开头的文字
grep "^root" /etc/passwd
grep "^root" /etc/passwd
2)查找login结尾的文字
grep "login$" /etc/passwd
grep "login$" /etc/passwd
3)匹配完整的hello world文字
grep "^hello world$" test
grep "^hello world$" test
4)匹配hello开头的world结尾的文字
grep "^hello.*world$" test
grep "^hello.*world$" test
次数匹配
* 匹配任意长度
以下符号属于扩展正则表达式
+ 匹配一次以上
? 匹配0次或1次
{n} 匹配n次
{n,m} 匹配n到m次数
{n,} 匹配至少n次
{,n} 匹配最多n次
以下符号属于扩展正则表达式
+ 匹配一次以上
? 匹配0次或1次
{n} 匹配n次
{n,m} 匹配n到m次数
{n,} 匹配至少n次
{,n} 匹配最多n次
案例
1)匹配网址 www开头 .com结尾 中间有任意多文字
grep "^www\.[a-zA-Z0-9]*\.com$" test.txt
grep "^www\.[a-zA-Z0-9]*\.com$" test.txt
2)匹配正整数
grep -E "^\+?[0-9]+$" test.txt
grep -E "^\+?[0-9]+$" test.txt
3)匹配4位数字
grep -E "^[0-9]{4}$" test.txt
grep -E "^[0-9]{4}$" test.txt
4)匹配4到6位数字
grep -E "^[0-9]{4,6}$" test.txt
grep -E "^[0-9]{4,6}$" test.txt
5)匹配3位以上数字
grep -E "^[0-9]{3,}$" test.txt
grep -E "^[0-9]{3,}$" test.txt
6)匹配手机号 11位数字 第1位是1 第二位是3~9
grep -E "^1[3-9][0-9]{9}$" test.txt
grep -E "^1[3-9][0-9]{9}$" test.txt
分组
将一系列字符作为整体进行匹配
匹配两个good
good{2} ---> goodd
(good){2} ----> goodgood
匹配两个good
good{2} ---> goodd
(good){2} ----> goodgood
案例
1)匹配连续的两个hello
grep -E "(hello){2}" test.txt
grep -E "(hello){2}" test.txt
2)查找一个hello或world
egrep -e "hello" -e "world" test.txt
egrep "(hello|world)" test.txt
egrep -e "hello" -e "world" test.txt
egrep "(hello|world)" test.txt
3)查找连续的两个三位字母和三位数字 abc454gaw454
egrep "^([a-zA-Z]{3}[0-9]{3}){2}$" test.txt
egrep "^([a-zA-Z]{3}[0-9]{3}){2}$" test.txt
SED命令
流编辑器,按行对文件内容进行处理(增删改查)
用法 : sed 选项 "操作" 文件路径
选项
-n 关闭sed默认的输出
-r 识别扩展正则表达式
-i 可以修改原始文件
-n 关闭sed默认的输出
-r 识别扩展正则表达式
-i 可以修改原始文件
操作
p 打印
c 替换
s 查找+替换
d 删除
i 插入
a 追加
w 写入文件
r 读取文件
p 打印
c 替换
s 查找+替换
d 删除
i 插入
a 追加
w 写入文件
r 读取文件
案例
按行查找
1)输出文件内容
sed -n "p" test.txt
sed -n "p" test.txt
2)输出文件的第5行
sed -n "5p" test.txt
sed -n "5p" test.txt
3)输出文件的5到10行
sed -n "5,10p" test.txt
sed -n "5,10p" test.txt
4)输出5到最后一行
sed -n "5,\$p" test.txt
sed -n '5,$p' test.txt
sed -n "5,\$p" test.txt
sed -n '5,$p' test.txt
5)打印第6到后面3行
sed -n '6,+3p' test.txt
sed -n '6,+3p' test.txt
6)打印奇数行(设置步长 开始行数~步长)
sed -n '1~2p" test.txt
sed -n '1~2p" test.txt
正则表达式
1)查找以hello开头的行sed -n 'ahello/p' test.txt
2)打印第二行到以hello开头的行sed -n '2,/^hello/p' test.txt
3)从hello开头的行打印到world结尾行sed -n'/^helo/p‘test.text
替换
替换整行
行号或正则表达式c替换的内容
案例
1)把第三行改为
替换整行
sed "3c" test.txt
默认sed不改原始文件,必须加-i
sed -i"3c" test.txt
2)修改原始文件同时对文件进行备份-i后缀名
sed -i.bak "5c=================" test.txt
替换整行
sed "3c" test.txt
默认sed不改原始文件,必须加-i
sed -i"3c" test.txt
2)修改原始文件同时对文件进行备份-i后缀名
sed -i.bak "5c=================" test.txt
查找和替换
s/搜索的内容/替换的内容/g g全局替换,默认只替换第一个
s#搜索的内容替的内容#g
s#搜索的内容替的内容#g
案例
1)将文件中的hello替换为nice
sed -i "s/hello/nice/g" test.txt
sed -i "s/hello/nice/g" test.txt
2)修改网络配置文件
cp letc/sysconfig/network-scripts/ifcfg-ens33 /opt/ip.txt
sed -i-r's/^IPADDR=([0-9K1,3}1.{3}[0-9]
{1,3}$/IPADDR=192.168.101.188/g' ip.txt
cp letc/sysconfig/network-scripts/ifcfg-ens33 /opt/ip.txt
sed -i-r's/^IPADDR=([0-9K1,3}1.{3}[0-9]
{1,3}$/IPADDR=192.168.101.188/g' ip.txt
删除
1)删除第二行
sed"3d" test.txt
2)删除3到5行
sed '3,5d' test.txt
3)删除hello开头的行
sed-i'Ahello/d' test.txt
sed"3d" test.txt
2)删除3到5行
sed '3,5d' test.txt
3)删除hello开头的行
sed-i'Ahello/d' test.txt
插入
1)在第行的前面插入6666666666666
sed '3i6666666666666666' test.txt
sed '3i6666666666666666' test.txt
2)在第5行后面插入******************************sed'5a******************************test.txt
3)在nice开头的行后面插入%%%%%%%%%%%%
sed '/#nicela%%%%%%%%%%%%%%%%%%' test.txt
sed '/#nicela%%%%%%%%%%%%%%%%%%' test.txt
AWK命令
是一种脚本语言,支持按列对文件进行统计
用法:awk 选项 '脚本代码' 文件路径
选项
-F 用于设置分隔符,默认是空格
-v 用于定义变量
选项 -f 用于指定脚本文件
-v 用于定义变量
选项 -f 用于指定脚本文件
内容变量
FS 分隔符
内置变量 NF 列数
NR 行数
内置变量 NF 列数
NR 行数
案例
1)基本用法
awk -F: '{print 1,1,3}' /etc/passwd
列引用方式: n \text{如}:n如:1 第一列 0 \text{整行}0整行NF NF是列数 $NF 代表最后一列
awk -F: '{print 1,1,3}' /etc/passwd
列引用方式: n \text{如}:n如:1 第一列 0 \text{整行}0整行NF NF是列数 $NF 代表最后一列
子主题
子主题
子主题
子主题
子主题
子主题
0 条评论
下一页