学习目标:
了解运维和自动化运维是什么及工作实现方式
记住 shell是什么,说出shell的两分类
知道 shell脚本的特点是什么
这一节,我们从运维定位,工作范围,运维&shell 三个方面来学习。
运维定位
运维是什么,其实就是公司的一种技术岗位
工作范围
以Django项目的运维为例:
职责 | 作用 |
---|---|
规划 | 我们需要多少资源来支持项目的运行 |
管理 | 项目运行过程中的所有内容都管理起来 |
流程规范 | 所有操作都形成制度,提高工作效率 |
平台 | 大幅度提高工作效率 |
监控 | 实时查看项目运行状态指标 |
告警 | 状态指标异常,告知工作人员处理 |
安全 | 网站运营安全措施 |
优化 | 保证用户访问网站体验很好 |
考核 | 权责分配,保证利益 |
运维&shell
自动化运维 :就是将图里面所有的工作都使用自动化的方式来实现,实现自动化的方式很多,常见的方式:工具和脚本.
工作中常见的脚本有哪些呢?shell 脚本和其他开发语言脚本,shell脚本就是shell编程的一种具体实现
这一节,我们从 shell定义,shell分类,使用方式 三个方面来学习。
shell的定义
定义 | 作用 |
---|---|
位于操作系统和应用程序之间的一个命令解释器 | 负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序 |
shell位置图
shell的分类
分类 | 具体 |
---|---|
图形界面shell | 桌面 |
命令行shell | windows系统cmd.exe,linux系统:sh / csh / ksh / bash / … |
我们常说的shell是命令行式的shell,在工作中常用的是linux系统下的bash。
#查看系统shell信息
#查看当前系统的shell类型
echo $SHELL
#查看当前系统环境支持的shell
cat /etc/shells
#/usr/bin/sh
#/usr/bin/bash
#/usr/sbin/nologin
使用方式
shell使用方式主要有两种:手工和脚本
学习目标:
这一节,我们从 创建方式,脚本命名,脚本内容,注释四个方面来学习。
创建方式
创建脚本的常见编辑器是 vi/vim.
set num #显示行号
dd #删除光标这一行
dG #删除所有
u #撤销上一步
/字符 #查找的字符
脚本命名
shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。
脚本内容:
各种可以执行的命令
注释内容:
单行注释:
除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
#!/bin/bash
echo '1'
# echo '2' # 这一行就表示注释
echo '3'
多行注释:
多行注释有两种方法::<
#!/bin/bash
echo '1'
:<<! echo '2'
echo '3'
echo '4'
!
echo '5'
这一节我们从执行方式,开发规范 ,脚本调试,几个方面来学习。
执行方式
常见的几种执行方式 | 具体示例 | |
---|---|---|
bash /path/to/script-name | /bin/bash /path/to/script-name |
脚本文件本身没有可执行权限 或者脚本首行没有命令解释器 时使用的方法 |
/path/to/script-name | ./script-name (当前路径下执行脚本) |
脚本文件具有可执行权限时使用 |
source script-name | . script-name (环境一致性) |
使用source或者. 点号加载shell脚本文件内容使shell脚本内容环 境和当前用户环境一致 |
开发规范
#!/bin/bash
脚本调试
1.基本命令
cat -n test.sh #检查脚本语法错误
/bin/bash -x test.sh # 进入跟踪方式,显示所执行的每一条命令
sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"' #"string" 从strings中读取命令
命令 | 含义 |
---|---|
Ctrl+z |
挂起前台运行的程序 |
fg |
恢复到前台(frontground) |
bg |
恢复到后台(background) |
jobs |
查看当前有多少在后台运行的命令 |
& |
这个用在一个命令的最后,可以把这个命令放到后台执行 |
学习目标:
这一节,我们从 变量定位、变量分类两个方面来学习。
变量定位
变量包括两部分:变量名=变量值,其中变量名是不变的,变量值是变化的,我们一般所说的变量指的是变量名
变量分类
shell 中的变量分为三大类:本地变量、全局变量、内置变量
本地变量:手工方式定义的作用范围小的变量
全局变量:手工|默认方式定义作用范围大的变量
内置变量:bash命令中自带的一些参数变量
这一节,我们从 本地变量,普通变量,命令变量 三个方面来学习
本地变量
本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小
本地变量包含两种:普通变量和命令变量
普通变量
#格式一:变量值必须是一个整体,中间没有特殊字符
变量名=变量值
#格式二:但引号,写什么内容,就输出什么内容
变量名='变量值'
#格式三:双引号(如果变量值范围内,有可以解析的变量A,那么首先解析变量A,将A的结果和其他内容组合成一个整体,重新赋值给变量B)
变量名="变量值"
注意:数字不加引号,其他默认加双引号
命令变量
#格式一
变量名=`命令`
#格式二
变量名=$(命令)
这一节,我们从 定义、查看命令、定义方式 三个方面来学习。
**定义:**在当前系统的所有环境下都能生效的变量
**查看命令:**可以通过命令查看环境变量,env :只显示全局变量
定义方式:export 变量=值
这一节,我们从 查看变量、删除变量 两个方面来学习。
查看变量
#方式一
$变量名
#方式二
"$变量名"
#方式三
${变量名}
#方式四
"${变量名}"
单引号是普通的字符,双引号会解析命令
精确截取
格式:${变量名:起始位置:截取长度}
示例:
${file:0:5} 从第1个字符开始,截取5个字符
${file:5:5} 从第6个字符开始,截取5个字符
${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
默认值
场景一: 变量a如果有内容,那么就输出a的变量值,变量a如果没有内容,那么就输出默认的内容
格式:${变量名:-默认值}
#!/bin/bash
# 套餐选择演示
# 如果我输入的参数为n,那么输出内容是 "您选择的套餐是:套餐 n"
a="$1"
#如果我输入的参数为空,那么输出内容是 "您选择的套餐是:套餐 1"
echo "您选择的套餐是: 套餐 ${a:-1}"
场景二:无论变量a是否有内容,都输出默认值
格式:${变量名+默认值}
#!/bin/bash
# 不管我说国家法定结婚年龄是多少岁,都输出国家法定结婚年龄(男性)是 22 岁
a="$1"
echo "国家法定结婚年龄(男性)是 ${a+22} 岁"
取消变量
unset 变量名
这一节,我们从内置变量、脚本文件、精确获取、默认值 四个方面来学习。
内置变量
我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直接拿过来使用实现某种具体的功能呢?这就是shell内置变量
脚本文件
符号 | 意义 |
---|---|
$0 | 获取当前执行的shell脚本文件名 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1…9,当n为0时表示脚本的文件名,如果n大于9就要用大 括号括起来${10} |
$# | 获取当前shell命令行中参数的总个数 |
$? | 获取执行上一个指令的返回值(0为成功,非0为失败) |
重点内置变量演示效果:
$0 获取脚本的名称,示例:
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0"
$n 获取当前脚本传入的第n个位置的参数 示例:
#!/bin/bash
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"
$# 获取当前脚本传入参数的数量,示例:
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"
$? 获取文件执行或者命令执行的返回状态值 示例:
bash nihao
#bash: nihao: No such file or directory
echo $?
127
ls
#file1.sh num.sh test.sh weizhi.sh
echo $?
#0
学习目标:
了解 常用的两种测试语句
掌握 标准测试语句的格式和特点
说出 常用条件表达式种类
掌握 11种表达式的特点和使用场景
应用 2种计算表达式
应用 数组使用方式
这一节,我们从应用场景,语句格式两个方面来学习。
应用场景
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败。使用专门的测试工具—test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立)
语句格式
#条件成立,状态返回值是0,条件不成立,状态返回值是1
#方式一
test 条件表达式
#方式二:常用格式
[ 条件表达式 ]
括号[ ]与条件表达式两侧至少有一个空格否者不符合规范
这一节,我们从 逻辑表达式,文件表达式,数值表达式,字符串表达式 四个方面来学习。
逻辑表达式
常见的逻辑表达式有:&& 和 ||
&& :命令1 && 命令2
#命令1执行成功,命令2执行
[ 1 = 1 ] && echo "条件成立"
#命令1执行不成功,命令2也不执行
[ 1 = 2 ] && echo "条件成立"
|| :命令1 || 命令2
#命令1执行成功,命令2不执行
[ 1 = 2 ] || echo "条件不成立"
#命令1执行失败,命令2执行
[ 1 = 1 ] || echo "条件不成立"
文件表达式
-f 判断输入内容是否是一个文件,示例:
[ -f weizhi.sh ] && echo "是一个文件"
#是一个文件
[ -f weizhi.sddh ] || echo "不是一个文件"
不是一个文件
-d 判断输入内容是否是一个目录,示例:
[ -d weizhi.sddh ] || echo "不是一个目录"
#不是一个目录
mkdir nihao
[ -d nihao ] && echo "是一个目录"
#是一个目录
-x 判断输入内容是否可执行 示例:
[ -x age.sh ] || echo "文件没有执行权限"
#文件没有执行权限
[ -x test.sh ] && echo "文件有执行权限"
#文件有执行权限
数值操作符
主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于,小于,等于第二个数。常见选项如下:
1 | 2 |
---|---|
n1 -eq n2 | 相等 |
n1 -gt n2 | 大于 |
n1 -lt n2 | 小于 |
n1 -ne n2 | 不等于 |
字符串比较
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
#判断字符是否内容一致
[ a == a ]
echo $? #0
[ a != a ]
echo $? #1
这一节,我们从使用场景,计算格式,计算实践 三个方面来学习。
使用场景
计算表达式,简单来说就是对具体的内容进行算数计算
计算格式
#格式一:$(())中只能用+-*/和()运算符,并且只能做整数运算,表达式范围内,空格不限制
$(( 计算表达式 ))
#格式二:表达式必须是一个整体,中间不能出现空格等特殊字符
let 计算表达式
示例
echo $((100/5)) #20
i=1
let i=i+7
echo $i # 8
这一节,我们从 定义格式、信息查看、增删改 三个方面来学习。
定义格式
用括号来表示数组,数组元素用“空格”符号分割开.定义数组的语法格式: array_name=(value1 … valuen)
#单行定义
array_name=("a" "b" "c")
#多行定义
array_name=("a"
"b"
"c")
#单元素定义
array_name[0]="a"
array_name[1]="b"
#单元素定义的时候,可以不使用连续的下标,而且下标的范围没有限制
#命令定义:就是value的值以命令方式来获取
file_array=($(ls /tmp/))
1.bash支持一维数组(不支持多维数组)
2.数组元素用空格符号分割开
信息查看
基于索引找内容:读取数组元素值可以根据元素的下标值来获取,语法格式如下: ${array_name[index]}
array_name=("a" "b" "c")
#获取索引为1的元素内容
echo ${array_name[1]}
#获取所有的元素内容
echo ${array_name[@]}
#获取所有的元素内容
echo ${array_name[*]}
基于内容找索引:获取数组的所有索引,语法格式如下: ${!array_name[index]}
echo ${!array_name[@]}
#0 1 2
echo ${!array_name[*]}
#0 1 2
获取长度:获取数组长度的方法与获取字符串长度的方法相同,格式如下:${#array_name[index]"
#获取索引为1的值的长度
echo ${#array_name[1]}
#获取所有的元素个数
echo ${#array_name[@]}
echo ${#array_name[*]}
删改查
获取元素:又分为单元素获取,和元素部分内容获取
#单元素获取格式:${array_name[index]}
echo ${array_name[1]}
#元素部分内容的获取格式如下:${array_name[index]:pos:length}
echo ${array_name[2]:0:2}
更改元素
#元素内容替换,array_name[index]=值
array_name[1]=444
#元素部分内容替换,${array_name[index]/原内容/新内容}
echo ${array_name[2]/va/hahhah}
#默认是演示效果,原数组未被修改,如果真要更改需要结合单元素内容替换
删除数组
#删除单元素 unset array_name[index]
unset array_name[1]
#删除整个数组 unset array_name
unset array_name
学习目标:
这一节,我们从 重定向、>符号、>>符号 三个方面来学习。
重定向
在shell脚本中有两种常见的重定向符号 > 和 >>
> 符号
作用:表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
#查看文件内容
cat file.txt
#nihao
#使用重定向符号给文件中增加内容
echo "file1.txt" > file.txt
#再次查看文件内容
cat file.txt
#file1.txt
>> 符号
作用:表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
#查看文件内容
cat file.txt
#file1.txt
#使用重定向符号给文件中增加内容
echo "file2.txt" >> file.txt
cat file.txt
#file1.txt
#file2.txt
这一节,我们从 定义、使用格式、命令演示 三个方面来学习。
定义: 管道符用于传递信息的命令
**使用格式:**命令1 | 命令2
#管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用
env | grep SHEL
#SHELL=/bin/bash
这一节,我们从 后台展示、信息符号、特殊设备 三个方面来学习。
后台展示
定义:& 就是将一个命令从前台转到后台执行
使用格式:命令 &
sleep 4 #界面卡住4秒后消失
sleep 10 & #将一个命令从前台转到后台执行
ps aux | grep sleep
#root 4198 0.0 0.0 9032 808 pts/17 S 21:58 0:00 sleep 10
#root 4200 0.0 0.0 15964 944 pts/17 S+ 21:58 0:00 grep --color=auto sleep
信息符号
符号 | 含义 |
---|---|
1 | 表示正确输出的信息 |
2 | 表示错误输出的信息 |
2>&1 | 代表所有输出的信息 |
#标准正确输出示例
cat nihao.txt 1>> zhengque
#标准错误输出示例
dsfadsfadsfa 2>> errfile
脚本内容
#!/bin/bash
echo '下一条错误命令'
dsfsafsafdsa
脚本执行效果
admin-1@ubuntu:~# bash ceshi.sh
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found
1 和 2 综合演练
admin-1@ubuntu:~# bash ceshi.sh 1>> ceshi-ok 2>> ceshi-err
admin-1@ubuntu:~# cat ceshi-ok
下一条错误命令
admin-1@ubuntu:~# cat ceshi-err
ceshi.sh: line 3: dsfsafsafdsa: command not found
全部信息演练
admin-1@ubuntu:~# bash ceshi.sh >> ceshi-all 2>&1
admin-1@ubuntu:~# cat ceshi-all
下一条错误命令
ceshi.sh: line 3: dsfsafsafdsa: command not found
特殊设备
/dev/null 是linux下的一个设备文件,这个文件类似于一个垃圾桶,特点是:容量无限大
学习目标
这一节,我们从 单分支、双分支、多分支、多分支应用 四个方面来学习。
语法格式
#单分支
if [ 条件 ]
then
指令
fi
#多分支
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
多分支if语句示例
#!/bin/bash
# 多if语句的使用场景
if [ "$1" == "nan" ]
then
echo "您的性别是 男"
elif [ "$1" == "nv" ]
then
echo "您的性别是 女"
else
echo "您的性别,我不知道"
fi
通过传入参数来实现不同的功能
admin-1@ubuntu:/data/scripts/python-n# cat if.sh
#!/bin/bash
# 多if语句的使用场景
if [ "$1" == "start" ]
then
echo "服务启动中..."
elif [ "$1" == "stop" ]
then
echo "服务关闭中..."
elif [ "$1" == "restart" ]
then
echo "服务重启中..."
else
echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
fi
这一节,我们从 语句格式、语句示例 两个方面来学习。
语句格式
case 变量名 in
值1)
指令1
;;
值n)
指令n
;;
esac
# cat case.sh
#!/bin/bash
# case语句使用场景
case "$1" in
"start")
echo "服务启动中..."
;;
"stop")
echo "服务关闭中..."
;;
"restart")
echo "服务重启中..."
;;
*)
echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
;;
esac
- 首行关键字是case,末行关键字esac
- 选择项后面都有 )
- 每个选择的执行语句结尾都有两个分号;
这一节,我们从 for语句、while语句、until语句 三个方面来学习.
for语句
语法格式
for 值 in 列表
do
执行语句
done
示例
#!/bin/bash
# for语句的使用示例
for i in $(ls /root)
do
echo "${i}"
done
while语句
语法格式
#条件的类型:命令,[[ 字符串表达式 ]],(( 数字表达式 ))
while 条件
do
执行语句
done
示例
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ]
do
echo "${a}"
a=$((a+1))
done
until语句
语法格式
#命令、[[ 字符串表达式 ]]、(( 数字表达式 ))
until 条件
do
执行语句
done
#!/bin/bash
# until的示例
a=1
until [ "${a}" -eq 5 ]
do
echo "${a}"
a=$((a+1))
done
这一节,我们从 退出简介、break示例、break n示例、continue示例、exit示例 五个方面来学习。
退出简介
对于某些循环情况,我们需要在特定的条件下退出,主要有以下指令来实现:break、break n、continue
指令详解:
指令 | 含义 |
---|---|
break | 跳出所有循环 |
break n | 跳出第n个循环(由内向外) |
continue | 跳出当前循环 |
exit | 退出当前程序 |
示例 1:脚本进入死循环直至用户输入数字大于5
#!/bin/bash
while :
do
echo -n "输入你的数字,最好在 1 ~ 5: "
read aNum
case $aNum in
1|2|3|4|5)
echo "你的数字是 $aNum!"
;;
*)
echo "你选择的数字没在 1 ~ 5, 退出!"
break
;;
esac
done
效果示例:
~] /bin/bash while.sh
输入你的数字,最好在 1 ~ 5: 1
你的数字是 1!
输入你的数字,最好在 1 ~ 5: 6
你选择的数字没在 1 ~ 5, 退出!
示例2:如果 var1 等于 2,并且 var2 等于 0,就跳出循环
#!/bin/bash
for var1 in {1..5}
do
for var2 in {0..4}
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2
else
echo "$var1 $var2"
fi
done
done
效果示例:
~]# /bin/bash while.sh
输入你的数字,最好在 1 ~ 5: 6
你选择的数字没在 1 ~ 5, 退出!
输入你的数字,最好在 1 ~ 5:
示例3:continue
#!/bin/bash
while :
do
echo -n "输入你的数字,最好在 1 ~ 5: "
read aNum
case $aNum in
1|2|3|4|5)
echo "你的数字是 $aNum!"
;;
*)
echo "你选择的数字没在 1 ~ 5, 退出!"
continue
;;
esac
done
效果显示:
~]# /bin/bash while.sh
输入你的数字,最好在 1 ~ 5: 6
你选择的数字没在 1 ~ 5, 退出!
输入你的数字,最好在 1 ~ 5:
示例4:exit
#!/bin/bash
for var1 in {1..5}
do
for var2 in {0..4}
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
exit
else
echo "$var1 $var2"
fi
done
done
学习目标:
这一节,我们从 四种函数样式 来进行相应的学习。
1.简单函数
1.定义
#1.简单函数格式:
函数名(){
函数体
}
函数名
2.示例
#!/bin/bash
# 函数使用场景一:执行频繁的命令
dayin(){
echo "wo de mingzi shi 111"
}
dayin
2.传参函数
1.定义
函数名(){
函数体 $n
}
函数名 参数
2.示例
#!/bin/bash
# 函数的使用场景二
dayin(){
echo "wo de mingzi shi $1"
}
dayin 111
3.脚本传参,函数调用
1.定义
函数名(){
函数体 $1
}
函数名 $1
/bin/bash 脚本名 参数
2.示例
test.sh
#!/bin/bash
# 函数传参演示
# 定义传参数函数
dayin(){
echo "hello $1"
}
# 函数传参
dayin $1
/bin/bash test.sh jason
4.脚本传参,函数调用(生产用)
1.格式
test.sh
本地变量名 = "$1"
函数名(){
函数体 $1
}
函数名 "${本地变量名}"
/bin/bash test.sh 参数
2.示例
test.sh
#!/bin/bash
# 函数的使用场景二
canshu = "$1"
dayin(){
echo "hello $1"
}
dayin "${canshu}"
/bin/bash test.sh jason
本节学习目标:
掌握 grep 命令的格式和常用参数意义和使用场景
掌握 sed 命令的格式和常用参数意义和使用场景
掌握 awk 命令的格式和常用参数意义和使用场景
掌握 find 命令的格式和常用参数意义和使用场景
命令格式
定义: grep命令是我们常用的一个强大的文本搜索命令
格式: grep 参数 关键字 文件名
grep命令在结合(管道符)使用的情况下,后面的<文件名>是没有的
参数 | 含义 |
---|---|
-c | 只输出匹配行的计数 |
-n | 显示匹配行及行号 |
-v | 显示不包含匹配文本的所有行 |
-d | 指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作 |
-r | –recursive 此参数的效果和指定"-d recurse"参数相同 |
命令实践
root@centos ~]# cat find.txt
nihao aaa
nihao AAA
NiHao bbb
nihao CCC
root@centos ~]# grep -c aaa find.txt
1
root@centos ~]# grep -v ni find.txt
NiHao bbb
精确定位错误代码
grep -nr 错误关键字 目录名/文件名
这一节,我们从 格式详解,查看实践,替换实践,增加实践,删除实践 五个方面来学习。
格式详解
定义:行文件编辑工具,因为它编辑文件是以行为单位的
命令格式:sed [参数] ‘<匹配条件> [动作]’ [文件名]
参数
参数 | 含义 |
---|---|
-n | 取消静默输出 |
-i | 表示对文件进行编辑 |
匹配条件
匹配条件 | 格式 |
---|---|
数字行号 | '1,2p ’ |
关键字匹配 | ‘/关键字/’ |
1.关键字匹配时隔离符号/ 可以更换成 @、#、!等符号,根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可
动作
参数-i是使用如下动作的前提
动作 | 含义 |
---|---|
a | 在匹配到的内容下一行增加内容 |
i | 在匹配到的内容当前行增加内容 |
d | 删除匹配到的内容 |
s | 替换匹配到的内容 |
p | 查看指定内容 |
增加实践
命令格式:
#样式1:在匹配到的内容下一行增加内容
sed -i '行号1,行号2a\增加内容' 文件名
#样式2:在匹配到的内容当前行增加内容
sed -i '行号1,行号2i\增加内容' 文件名
示例1:指定行号增加内容
root@centos ~] sed -i '2a\zengjia-2' sed.txt
root@centos ~] cat sed.txt
nihao SED sed SED
nihao sed SED sed
zengjia-2
nihao SED sed sed
示例2:指定1~3每行都增加内容
root@centos ~] sed -i '1,3a\tongshi-2' sed.txt
root@centos ~] cat sed.txt
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
示例3:
root@centos ~] sed -i '1i\insert-1' sed.txt
root@centos ~] cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao sed SED sed
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
删除实践
命令格式:
#样式1
sed -i '行号1,行号2d' 文件名
示例1:删除第4行内容
root@centos ~] sed -i '4d' sed.txt
root@centos ~] cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
tongshi-2
zengjia-2
tongshi-2
nihao SED sed sed
示例2:删除多行(3-5行)内容
root@centos ~] sed -i '3,5d' sed.txt
root@centos ~] cat sed.txt
insert-1
nihao SED sed SED
tongshi-2
nihao SED sed sed
替换实践
命令格式:
#样式一:指定行号,列号,替换首个匹配内容
sed -i '行号s#原内容#替换后内容#列号' [文件名]
#样式二:替换全部匹配内容:
sed -i 's#原内容#替换后内容#g' [文件名]
#样式三:替换每行首个匹配内容:
sed -i 's#原内容#替换后内容#' 文件名
示例1:替换首每行的第1个sed为SED
root@centos ~] sed -i 's#sed#SED#' sed.txt
root@centos ~] cat sed.txt
nihao SED sed sed
nihao SED sed sed
nihao SED sed sed
示例2:替换全部sed为des
root@centos ~] sed -i 's#sed#SED#g' sed.txt
root@centos ~] cat sed.txt
nihao SED SED SED
nihao SED SED SED
nihao SED SED SED
示例3:替换第2行的首个SED为sed
root@centos ~] sed -i '2s#SED#sed#' sed.txt
root@centos ~] cat sed.txt
nihao SED SED SED
nihao sed SED SED
nihao SED SED SED
示例4:替换每行的第2个SED为sed
root@centos ~] sed -i 's#SED#sed#2' sed.txt
root@centos ~] cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed SED
示例5:替换第3行的第2个SED为sed
root@centos ~] sed -i '3s#SED#sed#2' sed.txt
root@centos ~] cat sed.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed **sed**
查看实践
命令格式:
#样式1
sed -n '行号1,行号2p' 文件名
root@centos ~]# cat sed.txt
nihao sed1 sed2 sed3
nihao sed4 sed5 sed6
nihao sed7 sed8 sed9
查看第2行的内容
root@centos ~]# sed -n '3p' sed.txt
nihao sed7 sed8 sed9
打印2-3行的内容
root@centos ~]# sed -n '2,3p' sed.txt
nihao sed7 sed8 sed9
格式详解
定义: awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件
命令格式: awk [参数] ‘[ 动作]’ [文件名]
参数 | 含义 |
---|---|
-F | 指定列的分隔符 |
-f | 调用脚本 |
-v | 定义变量 |
动作
动作 | 作用 |
---|---|
显示内容 $0:显示当前行所有内容 n : 显 示 当 前 行 的 第 n 列 内 容 , 如 果 存 在 多 个 n:显示当前行的第n列内容,如果存在多个 n:显示当前行的第n列内容,如果存在多个n,它们之间使用逗号(,)隔开 |
BEGIN{ 命令 } #初始代码块,主要和变量相关
/pattern/{ 命令 } #pattern正则匹配、执行代码块
END{ 命令 } #结束代码块,主要和信息输出相关
内置变量
内置变量 | 含义 |
---|---|
FILENAME | 当前输入文件的文件名,该变量是只读的 |
NR | 指定显示行的行号 |
NF | 输出最后一列的内容 |
OFS | 输出格式的列分隔符,缺省是空格 |
FS | 输入文件的列分融符,缺省是连续的空格和Tab |
简单实践
root@centos ~] cat awk.txt
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
示例1:过滤信息,过滤包含nihao的内容
root@centos ~] awk '/nihao/' awk.txt
nihao awk1 awk2 awk3
nihao awk4 awk5 awk6
示例2: 打印指定列内容,打印第1列的内容
root@centos ~] awk '{print $1}' awk.txt
nihao
nihao
示例3:打印行号,打印内容时候打印行号
root@centos ~] awk '{print NR,$1}' awk.txt
1 nihao
2 nihao
示例4:指定行打印内容,打印第一行第1和第3列内容
root@centos ~] awk 'NR==1 {print $1,$3}' awk.txt
nihao awk2
-F参数:指定隔离分隔符,查看内容
root@centos ~] cat linshi.txt
root:x:0:0:root:/root:/bin/bash
root@centos ~] awk -F ':' '{print $1,$7}' linshi.txt
root /bin/bash
-f参数:编写脚本,格式化输出
使用格式: awk -f 脚本文件 内容文件
root@centos ~] cat filename
/ni/{print "第" NR "行:" "内容:" $0}
root@centos ~] awk -f filename awk.txt
第1行:内容:nihao awk1 awk2 awk3
第2行:内容:nihao awk4 awk5 awk6
-v参数:
传入单值
root@centos ~] echo | awk -v var=100 '{print var}'
100
传入多值
root@centos ~] echo | awk '{print v1,v2}' v1=1000 v2=2000
1000 2000
-v的使用,需要结合|符号才可以
格式化输出,设置显示分隔符,显示内容
root@centos ~] awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt
1:nihao awk awk awk
2:nihao awk awk awk
设置输出样式
root@centos ~] awk -F: 'BEGIN {print "----开始了----"} {print NR,$0} END {print "-----结 束了"--}' awk.txt
----开始了----
1 nihao awk1 awk2 awk3
2 nihao awk4 awk5 awk6
-----结束了---
进阶实践
if语句示例
示例1:列出当前目录中大于500字节的信息
root@centos ~] ls -l | awk '{if (($5>=500)) print "\n" "文件: " $9 "\n" "大小: " $5 "B" "\n"}'
文件: anaconda-ks.cfg
大小: 988B
示例2:列出当前目录中大于500字节的普通文件信息
root@centos ~] ls -l | awk '{if (($5>=500 && /^-/ )) print "\n" "文件: " $9 "\n" "大小: " $5 "B" "\n"}'
文件: anaconda-ks.cfg
大小: 988B
for语句示例
示例1:按顺序输出所有的内容
root@centos ~] echo "abcde" | awk -F '' '{for(i=1;i<=NF;i++) print $i}'
a
b
c
d
e
示例2:按输入的倒序输出所有内容
[root@lvs-router ~] echo "abcde" | awk -F '' '{for(i=NF;i>=1;i--) print $i}'
e
d
c
b
a
格式详解
命令格式:find [路径] [参数] [关键字] [动作]
参数
参数 | 含义 |
---|---|
-name | 按照文件名查找文件 |
-user | 按照文件属主来查找文件 |
-group | 按照文件所属的组来查找文件 |
-type | 查找某一类型的文件 b 块设备文件 d 目录 c 字符设备文件 p 管道文件 l 符号链接文件 f 普通文件 |
-size n(K|M|G): [c] | 查找文件长度为n块的文件,带有c时表示文件长度以字节计 |
-perm (/|-)权限 | 按照文件权限来查找文件, /表示有一个权限匹配即可,-表示相反权限匹配才可 |
-mtime (-|+)n | 查找n天数(内|外)修改的文件 |
ctime (-|+)n | 查找n天数(内|外)改变的文件 |
-atime(-|+)n | 查找n天数(内|外)访问的文件 |
-depth | 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找 |
-mindepth n | 在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找 |
-path “子目录” | 在指定目录的子目录下查找,一般与-prune使用 |
-prune | 在查找文件时,忽略指定的内容,不能和-depth共用,否则会自动忽视prune |
-newer | 查找比指定文件新的文件 |
–regex | 正则 |
! : 表示取反
动作
参数 | |
---|---|
默认选项,显示名称,-o -print 表示不仅仅显示目录名,还显示目录里面的文件名 | |
-ls | 显示文件属性 |
-exec | 命令 {} ; 使用命令对查找结果处理,查找结果使用"{}"来表示 |
实践
基本实践
在当前系统中查找一个叫awk的文件
root@centos ~] sudo find /home/admin-1/ -name "awk.txt"
/home/admin-1/awk.txt
在当前系统中查找文件类型为普通文件的文件
root@centos ~] find /tmp -type f
/tmp/.X0-lock
/tmp/vgauthsvclog.txt.0
/tmp/unity_support_test.0
/tmp/config-err-4igbXW
根目录下查找5日以内更改的文件
find / -mtime -5
在/tmp/目录下查找3日以前更改的文件,可以用:
find /tmp/ -mtime +3
在目录下查找不包含backup子目录
find /data/scripts -path "/data/scripts/backup" -prune -o -print
忽略多个文件夹
find . \( -path "./backup" -o -path "./backup2" \) -prune -o -print
动作实践
以列表方式查看查找到的文件
find /etc -perm -640 -ls
对查找到的文件进行改名
find ./ -perm -002 -exec mv {} {}.old \;
查找到的文件删除
find . -name .svn | xargs rm -rf
查找磁盘中大于3M的文件
find . -size +3000k -exec ls -ld {} ;