命令语法 :
命令 [命令选项] [参数]
命令的分类 :
内部命令 :linux内核自带命令,执行效率高
外部命令 :需要安装才能使用,系统默认安装了很多外部命令
区分命令类型 : type 命令
命令存放
echo $PATH
mv : 移动文件、重命名
cat :查看文件内容
-b : 列出行号
-E : 将结尾断行行字节 $ 显示出来
-n : 列出行号
more / less :查看文件
head : 查看文件内容 (正向)
tail [option] [file]: 查看文件内容(反向)
-n : 制定行数
-f : 追踪文档,时时更新
cp [options] 源文件或目录 目标目录 : 复制文件或目录
vim 文件编辑
tar 打包 :tar -vcf 打包名.tar 被打包的文件A 被打包的文件B 被打包的文件C
c = create : 生成档案文件、创建打包文件
v = verbosely : 报告进度
f = file : 指定档案文件名称,f 后面一定是 .tar文件,必须放在左后
tar 解包 :tar -xvf 打包名.tar -C 解包路径位置
x : 解包
C :更改解压目录,目录必须存在
date : 显示当前时间
date (功能描述:显示当前时间)
date +%Y (功能描述:显示当前年年份)
date +%m (功能描述:显示当前月份)
date +%d (功能描述:显示当前是哪一天)
date +%Y%m%d … (功能描述:显示当前年年月日各种格式 )
date “+%Y-%m-%d %H:%M:%S” 或者单引号也可以 (功能描述:显示时间格式)
设置系统时间 : date -s 字符串时间
日历查看 : cal
cal -3 :查看3个月的日历
find : 查找文件 find path 【options】
find / -atime -2 # 查找在系统中最后48小时访问的文件 (Access Time,文件读取访问时间)
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group susan # 查找在系统中属于group为susan的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件 (modify time)
find / -user susan #查找在系统中属于susan这个用户的文件
find / -size +10000c #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
find / -size -1000k #查找出小于1000KB的文件
find ./ | grep Spring 筛选
locate : 模糊查找
grep 过滤查找、grep 【options】 PATTERN 范围(文件夹或文件)
-c:只输出匹配行的计数
-i:不区分大小写
-n:显示匹配行及行号
-w : 显示整个单词
-r : 递归查询(对文件夹中全部文件进行检索)
-v : 反取
-l : 只给出匹配的文件名
-L : 列出不匹配的文件名
-o : 只列出匹配的内容
-E : 支持扩展的正则表达式
-q : 在标准输出中不输出任何内容,及静默模式
文件内容排序
数据去重
文件颜色含义
绿色文件 :可执行文件,可执行程序
红色文件 :压缩文件或者包文件
d / 蓝色文件 :目录
白色文件 :一般性文件、如文本文件、配置文件、源码文件等、
浅蓝色文件 :链接文件、主要式是使用ln 命令建立的文件
| / 红色闪烁 :表示链接的文件有问题
b / 黄色 :表示设备
灰色 :表示其他文件
用户划分
添加用户 : useradd 用户名 (功能描述:添加新用户)
设置用户密码 :passwd 用户名 (功能描述:设置用户密码)
判断用户是否存在 :id 用户名
切换用户 :su 用户名称 (功能描述:切换用户,只能获得用户的执行行权限,不能获得环境变量)
删除用户 :userdel 用户名 (功能描述:删除用户但保存用户主目录)
修改用户信息 : usermod [选项] 用户名
更改用户密码过期信息 : chage [选项] 用户名
用户密码
查看登陆用户信息
whoami (功能描述:显示自身用户名称)
who am i (功能描述:显示登录用户的用户名)
who (功能描述:看当前有哪些用户登录到了了本台机器器上)
sudo 命令、允许临时管理员权限
查看创建用户、cat /etc/passwd
groups : 列出当前用户的所有分组
adm 分组用于系统监控,比如/var/log中的部分日志就是 adm 分组
sudo 分组用户可以通过 sudo 指令提升权限
新建组 : groupadd 组名
删除组 : groupdel 组名
修改组 :groupmod -n 新组名 老组名
查看全部组 :cat /etc/group
修改用户组 :usermod -g 用户组 用户名
进程查看 :ps -aux (查看系统全部进程)
PID : 进程号
%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源
%MEM:该进程占用物理理内存的百分比,占用越高,进程越耗费资源
VSZ:该进程占用虚拟内存的大小,单位KB
RSS:该进程占用实际物理理内存的大小,单位KB
STAT:进程状态
R (TASK_RUNNING),可执行状态
S (TASK_INTERRUPTIBLE),可中断的睡眠状态
D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态
T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态
Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程
START:该进程的启动时间
TIME:该进程占用CPU的运算时间,注意不是系统时间
COMMAND:产生此进程的命令名
Htop / top -d 【秒数】 :指定top命令每隔几秒更新。默认3秒
Htop / top -i : 使 top 不显示任何闲置或者僵死进程
Htop / top -p : 通过指定监控进程ID来仅仅监控某个进程的状态
状态含义
PID : 进程ID
PPID : 父进程ID
RUSER : 真实用户名
UID : 进程所有者用户ID
USER : 进程所有者用户名
GROUP : 进程所有者组名
TTY : 启动进程的终端名。不是从终端启动的进程则显示为
PR : 优先级
NI : nice值。负值表示高优先级,正值表示低优先级
P : 最后使用CPU,仅在多CPU环境下有意义
%CPU : 上次更新到现在的CPU时间占用百分比
TIME : 进程使用CPU时间总计,单位秒
TIME+ : 进程使用CPU时间总计,单位 1/100秒
%MEM : 进程使用的物理内存百分比
VIRT : 进程使用虚拟内存总量. 单位kb VIRT = SWAP + RES
SWAP : 进程使用的虚拟内存中,被换出的大小,单位 KB
RES : 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE : 可执行代码占用的物理内存大小,单位kb
DATA : 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR : 共享内存大小,单位 kb
nFLT : 页面错误次数
nDRT : 最后一次写入到现在,被修改过的页面数
S : 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
COMMAND : 命令名/命令行
FLags : 任务标志
用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况
netstat 命令
输出结果说明
其他网络命令
查看网络IP
进程与线程的区别 : 进程分配CPU、内存、硬盘, 线程只分配CPU
进程管理命令
进程表记录
描述信息 : 进程在内存中存放位置 、 PID 、当前状态、 内存分配多大、属于哪个用户
资源信息 :进程拥有资源、比如进程和虚拟机内存如何映射,拥有那些文件、使用那些I/O设备
内存分布 :约定操作系统如何使用内存
指令 tasklist / TList
TASKLIST [/S system [/U username [/P [password]]]]
[/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
#参数列表:
/S system 指定连接到的远程系统。
/U [domain\]user 指定应该在哪个用户上下文执行这个命令。
/P [password] 为提供的用户上下文指定密码。如果省略,则提示输入。
/M [module] 列出当前使用所给 exe/dll 名称的所有任务,如果没有指定模块名称,显示所有加载的模块。
/SVC 显示每个进程中主持的服务。
/V 显示详述任务信息。
/FI filter 显示一系列符合筛选器指定的标准的任务。
/FO format 指定输出格式,有效值: "TABLE"、"LIST"、"CSV"。
/NH 指定列标题不应该在输出中显示,只对 "TABLE" 和 "CSV" 格式有效。
线程记录表
进程通信
服务器性能
安装启动(yum)
安装依赖
启动程序
文件结构
安装方式说明
常用命令
配置管理
配置文件路径
配置说明
公共配置
user nginx; #网站运行的用户
worker_processes auto; #设置的进程数
error_log /var/log/nginx/error.log; #错误日志
pid /run/nginx.pid; #进程的id
引入配置
include /usr/share/nginx/modules/*.conf
event : 高效模块
work_connections 1024 # 一个进程可支持1024个链接
HTTP配置
server_tokens off # 隐藏外部服务器信息
sendfile on : 开启缓冲
access_log /var/log/nginx/access.log main # 访问日志
include /etc/nginx/conf.d/*.conf; # 相同端口,不同IP,载入不同域名的对应的服务分发
TLS(SSL)配置
grep是行过滤工具;用于根据关键字进行过滤
# 语法
# grep [选项] '关键字' 文件名
grep --color=auto 'root' passwd
# 别名设置(临时性)
alias grep='grep --color=auto'
# 别名设置配置文件
vim /etc/bashrc
# 文件最后添加即可
alias grep='grep --color=auto'
# 刷新
source /etc/bashrc
# gre -n 添加行号
grep -n 'root' passwd
# grep -ni 添加行号,忽略大小写
grep -ni 'root' passwd
# 过滤出以root开头的行
grep -ni '^root' passwd
# 过滤以root结尾的行
grep -ni 'root$' passwd
# 过滤不包含的行(取反)
grep -ni -v '^root' passwd
grep -nB 3 '^ftp' passwd
常用选项 :OPTIONS :
# -i : 不区分大小写
# -v : 查找不包含所指定的内容的行,反向选择
# -w : 按单词搜索
# -o :打印匹配关键字
# -c : 统计匹配到的次数
# -n : 显示行号
# -r : 逐层遍历目录查找
# -A :显示匹配行及后面多少行
# -B : 显示匹配行前后多少行
# -C : 显示匹配行前后多少行
# -l : 只列出匹配的文件名
# -L :列出不匹配的文件名
# -e :使用正则表达式表示
# -E :使用扩展正则匹配
# ^key : 以关键字开头
# key$ : 以关键字结尾
# ^$ :匹配空行
# --color=autp : 可以将关键字部分自动加上颜色
语法 : cut 选项 文件名
# 列处理工具
# -c : 以字符串为单位进行分割,截取
# -d :自定义分隔符,默认为制表符 \t
# -f : 与-d 一起使用,指定截取哪个区域
举例说明
# 按照分隔符进行截取,指定需要的列
cut -d ':' -f1 passwd
cut -d: -f1 passwd
cut -d: -f1,7 passed
# 截取 1-5 个字符
cut -c1-5 passwd
# 10- 全部截取
cut -c10- passwd
将文件的每一行作为一个单位,从首字符向后,依次按照ASCII值进行比较,最后将他们按照升序输出
-u : 去除重复值
-r : 降序排列,默认为升序
-o : 将排序结果输出到文件中,类似重定向符号 >
-n : 以数字排序,默认是按字符排序
-t : 分隔符
-k : 第 N 列
-b : 忽略前导空行
-R :随机排序,每次运行的结果均不同
cut -d -f
# 冒号分割的第三列用数字进行排序
sort -n -t: -k3 1.txt
sort -nr -t: -k3 1.txt
sort -nr -t: -k3 1.txt -o > 2.txt
去除连续重复的数据
-i : 忽略大小写
-c :统计重复的次数
-d :只显示重复行
从标准输入读取并写入到标准输出的文件,即双向覆盖重定向(屏幕输出 | 文本输入)
echo hello world | tee 11.txt
# 追加
echo hello world | tee -a 11.txt
比较两个文件的不同
语法 :
diff [选项] 文件1 文件2
-b : 不检查空格
-B : 不检查空白行
-i : 不检查大小写
-w :忽略所有空格
-c :上下文格式显示
-u :合并格式显示
--normal :正常格式显示(默认)
用于合并文件行
-d : 自定义间隔符,默认是tab
-s :串行处理,非并行 [第一行是第一个文件、第二行是第二个文件]
paste [file1] [file2]
[root@linux124 test]# cat 11.txt
hello world
hello world
[root@linux124 test]# cat hello.txt
name=hello
mask=nihao
[root@linux124 test]# paste 11.txt hello.txt
hello world name=hello
hello world mask=nihao
搜索替换 :用于字符转换,替换和删除,主要用于删除文件中控制字符或进行字符转化
command | tr 'string1' 'string2'
# -d 删除字符串1中所有输入字符
# -s 删除所有重复初夏字符串序列,只保留第一个,集将重复出现的字符串压缩成一个字符串
tr 'string1' 'string2' < filename
# a-z 替换A-Z
tr 'a-z' 'A-Z' < 1.txt
[root@linux124 test]# cat hello.txt
name=hello
mask=nihao
[root@linux124 test]# tr 'a-z' 'A-Z' < hello.txt
NAME=HELLO
MASK=NIHAO
[root@linux124 test]# cat hello.txt
name=hello
mask=nihao
[root@linux124 test]# tr 'a-z' 'A-Z' < hello.txt > 22.txt
* : 匹配0或多个任意字符
? : 匹配任意单个字符
[list] : 匹配 [list] 中任意单个字符,或者是一组单个字符
[!list] : 匹配除 [list] 中任意单个字符
[root@linux121 ~]# ls file[123].jpg
{string1,string2,....} 匹配string,string2或更多字符串
[root@linux121 ~]# ls file{1,2.3,11,13}.jpg
- 双引号 " " :会把引号的内容当做一个 整体 ,允许通过 $ 符号引用其他变量值
- 单引号 ’ ‘:会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符
- 反撇号 ``: 反撇号与 $() 一样,引用或括号中的命令会优先执行,如果存在嵌套,反撇号不能用
[root@linux121 ~]# date +%F
2022-08-04
[root@linux121 ~]# echo $(date +%F)
2022-08-04
[root@linux121 ~]# echo "$(date +%F)"
2022-08-04
[root@linux121 ~]# echo '$(date +%F)'
$(date +%F)
文件处理三剑客 : grep 、sed、awk 工具使用
[root@linux124 ~]# A=123456
[root@linux124 ~]# echo $A
123456
[root@linux124 ~]# echo ${A}
123456
# {} 形式可切片,直接复制情况不能
[root@linux124 ~]# echo ${A:3:3}
456
让用户自己给变量赋值
语法 : read [选项] 变量名
| 选项 | 释义 | 备注 |
|---|---|---|
| -p | 定义提示 用户的信息 | |
| -n | 定义字符数(限制变量值的长度) | |
| -s | 不显示(不显示用户输入的内容) | |
| -t | 定义超时间,默认单位为秒(限制用户输入变量值的超时时间) |
[root@linux124 ~]# read name
nihao
[root@linux124 ~]# echo $name
nihao
# 用法1 :
[root@linux124 ~]# read -p '请输入你的名字 : ' name
‘请输入你的名字 : ’ jackcat h
[root@linux124 ~]# echo $name
jack
[root@linux124 ~]# read -s -p ‘请输入你的名字 : ’ name
请输入你的名字 :
[root@linux124 ~]# echo $name
nihao
# 用法2 : 变量来自文件
[root@linux124 ~]# read -p ‘请输入你的名字’ name mask < 1.txt
[root@linux124 ~]# echo $name
nihao
[root@linux124 ~]# echo $mask
语法 : declare 选项 变量名=变量值
| 选项 | 释义 | 举例 |
|---|---|---|
| -i | 将变量看成整数 | declare -i A=123 |
| -r | 定义只读变量 | declare -r B=hello |
| -a | 定义普通数组;查看普通数组 | |
| -A | 定义关联数组,查看关联数组 | |
| -x | 将变量通过环境导出 | declare -x AAA=123456 等于 export AAA=123456 |
| 内置变量 | 释义 |
|---|---|
| $? | 验证上一条命名是否成功,如果是0,则成功,其他则有问题 |
| $0 | 当前执行的程序或脚本的名称 |
| $# | 脚本后接的参数的个数 |
| $* | 脚本后所有参数,参数当做一个整体输出,每一个变量参数之间以空格隔开 |
| $@ | 脚本后面的所有参数,参数是独立的,也是全部输出 |
| $1-$9 | 脚本后面的位置参数,$1表示第一个位置 参数,以此类推 |
| 10 − {10}- 10−{n} | 扩展位置参数,第10个位置变量必须大于{}大括号起来{2位数字一行括起来} |
| $! | 后台运行的 最后一个 进程号(当前终端) |
| !$ | 调用最后一条命令历史中的参数 |
| $$ | 当前进程的进程号 |
echo $(( 1 + 1))
echo $[10-5]
echo $[85*74]
expr 1 + 1
expr 10 - 5
expr 10 \* 5 = 50
判断文件类型
# 格式1
test -e ./test1
# 格式2
[ -d ./dir1 ]; echo $?
# 格式3
[[ -d ./dir1 ]]; echo $?
判断文件权限
流程控制语句
# 形式1
if [ condition ] ; then
command
command
fi
# 形式2
if test 条件 ; then
command
command
fi
# 形式3
if [[ 条件 ]] ; then
command
command
fi
# 形式4
if [ condition ] ; then
command
else
command
fi
[条件] && command1 || command2
# 用户自己输入字符串,如果用户输入hello,则打印world,否则打印请输入 hello
#!/bin/env bash
read -p '请输入一个字符串:' str
if ["$str" = 'hello']; then
echo 'world'
else
echo '请输入hello'
fi
read -p '请输入一个字符串:' str
if [ $1 = hello ]; then
echo 'world'
else
echo '请输入hello'
fi
案例
需求 : 判断当前主机是否和远程主机是否ping通
#!/bin/env bash
# 判断当前主机是否和远程主机是否ping通
read -p '请输入你要ping的主机IP:' ip
ping -c3 $ip &>/dev/null
if [$? -eq 0]; then
echo "当前主机和远程主机 $ip 是通的"
else
echo "当前主机和远程主机 $ip 不同的"
fi
案例
判断进程是否存在
#!/bin/env bash
# 判断线程是否存在
ps -ef | grep httpd | grep -v 'grep' &>/dev/null
if [$? -eq 0]; then
echo "线程存在"
else
echo "线程不存在"
fi
#!/bin/env bash
pgrep httpd 'grep' &>/dev/null
if [$? -eq 0]; then
echo "线程存在"
else
echo "线程不存在"
fi
pgrep httpd &>/dev/null
test $? -eq && echo "当前http进程存在" || echo "当前进程不存在"
# pgrep 命令 : 以名称为依据,从运行进程队列中查找进程,并显示查找到的进程id
选项
-o :仅显示查找到的最小(起始)进程号
-n :仅显示查找到的最大(结束)进程号
-l :显示进程名称
-P : 指定父进程号,
-g :指定进程组
-t :指定开启进程的终端
-u :指定进程的有效用户ID
案例
判断服务是否正常
1、判断进程是否存在,用 /etc/init.d/http status判断状态等方法
2、最好的方式是直接去访问一下,通过访问成功或者失败的返回值判断
wget http://www.itheima.com
curl http://www.itheima.com
elinks -dump http://www.itheima.com
#!/bin/env bash
web_server = www.itcase.cn
wget -P /Shell/ $web_server &>/dev/null
[ $? -eq 0 ] && echo "当前服务ok" && rm -f /shell/index.* || echo "当前网站不ok"
案例
判断用户是否存在
输入一个用户,用脚本判断该用户是否存在
#!/bin/env bash
# for ip in 'cat ip.txt'
read -p '请输入你的用户名:' user_name
id $user_name &>/dev/null
if [ $? -eq 0 ]
then
echo "该用户存在"
else
echo "用户不存在"
fi
for循环
# 方式1
for variable in {list}
do
command
command
for variable in a b c
do
command
command
done
# 方式2,后面直接自己添加参加,每个参数执行一次
for variable
do
command
command
done
# 方式3
for ((expr1;expr2;expr3))
do
command
command
done
# expr1 : 定义变量的初始值
# expr2 :决定是否进行循环的条件
# expr3 :决定训话变量如何改变,决定循环什么时候退出
for (( i=1;i<=5;i++ ))
do
echo $i
done
案例
计算 1-100 基数和
# 1. 定义一个变量来保存奇数的和 sum=0
# 2. 找出 1- 100 的奇数,保存到另一个变量中,i = 遍历出来的奇数
# 3. 从 1-200 中找出奇数后,在相加,然后将和赋值给变量,循环变量 FOR
# 4. 遍历完毕,sum 的值打印出来
#!/bin/env bash
# for ip in 'cat ip.txt'
sum=0
for i in {1..100..2}
do
let sum = $sum + $i
done
echo "1-100的奇数和为 :$sum"
案例
质数(素数):筛选质数
#!/bin/env bash
# for ip in 'cat ip.txt'
read -p "请输入一个正整数 :" number
[ $number -eq 1 ] && echo "$number不是质数" && exit
[ $number -eq 1 ] && echo "$number是质数" && exit
for i in `seq 2 $[$number-1]`
do
[ $[$number%$i] - eq 0 ] && echo "$number 不是质数" && exit}
done
echo "$number 是质数" && exit
案例
批量添加5个新用户,以 u1 到 u5 命名,并统一加一个新组,组名以 class,统一改密码为 123
#!/bin/env bash
# 判断 class 组是否存在
grep -w ^class /etc/group &>/dev/null
test $? -ne 0 && groupadd class
# for ip in 'cat ip.txt'
# 循环创建用户
for (( i=1;i<=5;i++ ))
do
useradd -G class u$i
echo 123|passwd --studin u$i
done
# 批量用x新建用户 stu1 - stu5,要求这几个用户的家目录都在/rhome
#!/bin/env bash
# 判断 /rhome 是否存在
[ -f /rhome ] && mv /rhome /rhome.bak
# 文件不在,目录不在,进行创建
test ! -f /rhome -a ! -d /rhome && mkdir /rhome
# [ -f /rhome ] && mv /rhome /rhome.bak || [ ! -d /rhome ] && mkdir /rhome
# for ip in 'cat ip.txt'
# 循环创建用户
for (( i=1;i<=5;i++ ))
do
useradd -d /rhome/stu$i stu$i
echo 123|passwd --studin u$i
done
局域网内检查主机网络通信
把能ping同的IP 和不能ping通的IP分类,并保存到 两个文本文件中
#!/bin/env bash
# 定义变量
ip=10.1.1
# 循环去 ping主机的ip
# for ip in 'cat ip.txt'
for ((i=1;i<=10,i++))
do
ping -c1 $ip.$i &>/dev/null
if [ $? -eq 0 ];then
echo "$ip.$i is ok" >> /tmp/ip_up.txt
else
echo "$ip.$i is down" >> /tmp/ip_down.txt
fi
done
# [ $? -eq 0 ] && echo "$ip.$i is ok" >> /tmp/ip_up.txt || echo "$ip.$i is down" >> /tmp/ip_down.txt
shell脚本并发
并发执行
{程序}& 表示程序放在后台进行执行,如果需要等待执行完毕在进行下面的内容,需要家wait
#!/bin/env bash
# 定义变量
# for ip in 'cat ip.txt'
ip=10.1.1
# 循环去 ping主机的ip
for ((i=1;i<=10,i++))
do
{
ping -c1 $ip.$i &>/dev/null
if [ $? -eq 0 ];then
echo "$ip.$i is ok" >> /tmp/ip_up.txt
else
echo "$ip.$i is down" >> /tmp/ip_down.txt
fi
}&
done
wait
echo "ip is ok..."
# [ $? -eq 0 ] && echo "$ip.$i is ok" >> /tmp/ip_up.txt || echo "$ip.$i is down" >> /tmp/ip_down.txt
while循环语句
while 表达式
do
command
done
while [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
command
done
#!/bin/env bash
sum=0
for (( i=0;i<=50;i+=2))
do
let sum=$sum+$i (let sum=sum+i)
done
echo "1-50的偶数和为 :$sum"报警,
#!/bin/env bash
sum=0
i=2
while [ $i -le 50 ]
do
let sum=sum+i
let i+=2
done
echo "1-50的偶数和为 :$sum"
脚本同步系统时间
30秒同步一次系统时间,时间同步服务器10.1.1.1
如果同步失败,则进行邮件同步,每次失败都进行报警
同步成功,也进行邮件通知,但成功100次通知一次
#!/bin/env bash
NTP_SERVER = 10.1.1.1
count = 0
while true
do
ntpdate $NTP_SERVER &>/dev/null
if [ $? -ne 0 ];then
echo "system date failed " | mail -s "check system data" root@loaclhost
else
let count++
if [$count -eq 100 ];then
echo "system date success " | mail -s "check system data" root@loaclhost
&& count = 0
fi
fi
sleep 30
done
echo "1-50的偶数和为 :$sum"
- sed 将每一行存放在缓存区,对这个副本进行编辑,不会修改源文件
- 分为命令行模式、和脚本模式
sed [options] ‘处理动作’ 文件名
| 选项 | 说明 | 备注 |
|---|---|---|
| -e | 进行多项(多次)编辑 | |
| -n | 取消默认输出 | 不自动打印模式空间 |
| -r | 使用扩展正则表达式 | |
| -i | 原地编辑(修改源文件) | |
| -f | 指定sed脚本的文件名 |
| 动作 | 说明 | 备注 |
|---|---|---|
| ‘p’ | 打印 | |
| ‘i’ | 在指定行之前插入内容 | 类似vim里的大写 O |
| ‘a’ | 在执行行之后插入内容 | 类似vim里的小写 o |
| ‘c’ | 替换指定行所有内容 | |
| ‘d’ | 删除指定行 |
对文件进行增删改查
# sed 选项 '定位+命令' 需要处理的文件
[root@linux124 ~]# sed '' a.txt # 不做处理
[root@linux124 ~]# sed -n 'p' a.txt 打印每一行,并取消默认输出
[root@linux124 ~]# sed -n '1p' a.txt 打印第 1 行
[root@linux124 ~]# sed -n '2p' a.txt 打印第 2 行
[root@linux124 ~]# sed -n '1,,5p' a.txt 打印第 1-5 行
[root@linux124 ~]# sed -n '$p' a.txt 打印最后 1 行
[root@linux124 ~]# sed -n '2ihello world ' a.txt # 第二行插入
[root@linux124 ~]# sed -n 'ihello world ' a.txt # 每一行插入
[root@linux124 ~]# sed -n '3ihello\world ' a.txt # 插入 2 行
[root@linux124 ~]# sed -n 'a9999 ' a.txt # 每一行后插入 9999
[root@linux124 ~]# sed -n '2,3a9999 ' a.txt # 第二行和第三行插入 9999
[root@linux124 ~]# sed -n '$chello world ' a.txt # 最后一行替换为 hello world
[root@linux124 ~]# sed -n '/^adm/citcast ' a.txt # 修改 以adm开头的行
[root@linux124 ~]# sed -n '1,5chello world ' a.txt # 将1-5行压缩为内容
[root@linux124 ~]# sed '4d' a.txt # 删除第四行内容
[root@linux124 ~]# sed '1,4d ' a.txt # 删除 1-4行的内容
[root@linux124 ~]# sed ' d ' a.txt # 都删除
[root@linux124 ~]# sed -n '/[0-9]/d ' a.txt # 删除包含数字的
对文件进行搜索替换操作
语法 : sed 选项 ‘s/搜索的内容/替换的内容/动作’ 需要处理的文件
s 表示 search搜索;斜杠 / 表示分隔符,可以自己定义;动作一般是 打印 p 和全局 替换 g
[root@linux124 ~]# sed -n 's/root/ROOT/p' 1.txt # 搜索小写 root, 替换为ROOT, 打印
[root@linux124 ~]# sed -n 's/root/ROOT/gp' 1.txt # 搜索小写 root, 替换为ROOT, 全局整行替换
[root@linux124 ~]# sed -n 's/^#//gp' 1.txt # 以 # 号开头 ,替换为空,全局替换
[root@linux124 ~]# sed -n 's@/sbin/nologin@itcast@gp' 1.txt # 将 sbin/nologin 替换成 itcast
[root@linux124 ~]# sed -n 's@/\/sbin\/nologin/itcast/gp' 1.txt #
[root@linux124 ~]# sed -n '10s#/sbin\/nologin#itcast#p' a.txt # 第十行 将 sbin/nologin 替换成 itcast
[root@linux124 ~]# sed -n 's@/sbin/nologin@itcastma@p' 1.txt #
[root@linux124 ~]# sed -n '1,5s/^/#/gp' 1.txt # 1-5行 行首加 #
| 命令 | 解释 | 备注 |
|---|---|---|
| r | 从另外文件中读取内容 | |
| w | 内容另存为 | |
| & | 保存查找串以便在替换串中引用 | 和\ ( \ )相同 |
| = | 打印行号 | |
| ! | 对所选行以外的所有行应用命令,放到行数之后 | |
| q | 退出 |