一、文本处理工具
tr命令( 替换)
选项:
压缩-s
删除-d
cut命令(取列)
不能将连续的字符当做分隔符
选项:
-d 分隔符
-f 指定列
-c指定字符
sort命令(排序)
默认不是以数字排序
选项:
-n 数字大小排序
-r倒序显示
uniq( 去重 )
只能将连续的重复去掉
选项:
-c: 显示每行重复出现的次数
-d:仅显示重复过的行
例子:
1.过滤出ifconfig ens33命令结果中本机的ipv4地址
ifconfig ens33 |grep netmask |tr -s ' ' |cut -d ' ' -f3
2.查看访问日志,找出访问前10的用户
cat log |cut -d" " -f1 |sort |uniq -c |sort -nr |head
二、shell脚本
一、shell脚本的组成
1.解释器
2.注释
3.执行的命令
例:
#!/bin/bash
#这是我的第一个脚本
echo"hello world"
二、执行shell脚本的三个方法
1.直接使用 shell程序来使用 ,不需要执行权限
2.使用路径来执行,需要权限
chmod +x /root/host.sh 加权限
./host.sh
#指定相对路径
/root/host.sh
#指定绝对路径
3.source或者 . (点等于source) 不需要权限 (不推荐使用)
注:
用shell程序和路径来执行会自动新建一个bsah桌面来执行shell脚本,不会影响当前bash环境
用source执行会在当前bash桌面执行,会影响当前bash环境
三、重定向
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 鼠标等 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
四、shell脚本变量
常见 Shell 变量的类型包括:
自定义变量:由用户自己定义,修改和使用
预定义变量:Bash中内置的一类变量 shell 不能修改 规定好的变量 放在那里让你使用
环境变量:由系统维护,用于设置工作环境 当前目录 当前主机名啊 $PATH
只读变量:只可以读取不可以更改 只能不能修改 常量
位置变量:通过命令行给脚本传递参数
四大符号
1.{}确定的变量起始结束的范围,只要有变量就加
2.“ ”弱引用可以识别变量
3.‘ ’强引用不识别变量
4.`` $()调用命令执行结果
位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
[root@test1 ~]# vim 1.sh
#!/bin/bash
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 将所有项当成一个值
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数
[root@test1 ~]# ./1.sh {1..10}
1
2
10
10
1 2 3 4 5 6 7 8 9 10
预定义(状态)变量
bash 帮你定义好了 拿来用就可以了
- $*:表示所有位置参数的内容看成一个整体返回 返回所有
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
- $#:表示命令行中位置参数的总个数
- $0:表示当前执行的脚本或程序的名称 当前脚本的名字
- $$:当前bash的进程id
- $!: 后台任务最后一个id
read -p
从键盘输入的内容变成变量
#方法1
read -p "现在的时间是" time
现在的时间是9点
echo $time
9点
#方法2
vim 1.sh
#!/bin/bash
echo -n "请输入你的信息"
read info
echo $info
bash 1.sh
请输入你的信息ky15
ky15
五、条件语句
1.测试
test 测试文件的表达式 是否成立
格式1:test 条件表达式
格式2:[ 条件表达式 ]
若真,则状态码变量 $? 返回0
若假,则状态码变量 $? 返回1
注意[]空格,否则会失败
操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(excute)
-L: 测试是否为软连接文件
例:
[ -d /etc/sysconfig/ ]
#注意前后空格
echo $?
0
[ -f /etc/sysconfig/ ]
echo $?
1
2.比较整数数值
格式:[ 整数1 -操作符 整数2 ] 公式
操作符:
- -eq:第一个数等于(Equal)第二个数
- -ne:第一个数不等于(Not Equal)第二个数
- -gt:第一个数大于(Greater Than)第二个数
- -lt:第一个数小于(Lesser Than)第二个数
- -le:第一个数小于或等于(Lesser or Equal)第二个数
- -ge:第一个数大于或等于(Greater or Equal)第二个数
a=2
b=3
[ $a -eq $b ]
echo $?
1
[ 2 -le 3 ]
echo $?
0
2.1整数的运算
expr只能进行整数的运算
格式1:
expr 变量1 运算符 变量2 [运算符 变量3]
a=1
b=2
expr $a + $b
#加减乘除前后有空格
3
格式2:
echo $[ 变量1 运算符 变量2]
3.字符串比较
常用的测试操作符
- =:字符串内容相同
- !=:字符串内容不同,! 号表示相反的意思
- -z:字符串内容为空
- -n: 字符是否存在
格式
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
str1=wang
str2=zhou
[ $str1 = $str2 ]
echo $?
1
4.逻辑测试(短路运算)
常见条件:
- -a或&&:逻辑与,“而且”的意思全真才为真
- -o或||:逻辑或,“或者”的意思一真即为真
- !:逻辑否
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] …
格式2:命令1 操作符 命令2 …
且运算
第一个要真 第二 个也要真 才能是真
如果第一个为假 ,整个 就为假 不用执行下个操作
cmd1 && cmd2
或运算
一 真即为真
如果第一个 为真 那么 不用执行第二个
第一个为假 ,才需要执行第二个
cmd1 || cmd2
5.双中括号
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;扩展的正则表达式
#通配符
FILE=test.log
[[ "$FILE" == *.log ]]
echo $?
0
FILE=test.txt
[[ "$FILE" == *.log ]]
echo $?
1
[[ "$FILE" != *.log ]]
echo $?
0
[[ $file =~ log$ ]]
#正则表达式以log结尾的文件
6.(){}
(CMD1;CMD2;…)和 { CMD1;CMD2;…; } 都可以将多个命令组合在一起,批量执行
()会开启子shell
{ } 不会开启子shell
( cd /data;ls )
test.log
pwd
/root
7.if语句
单分支格式:
if 判断条件;
then 条件为真的分支代码
fi
双分支格式
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支格式
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3;then
条件3为真的分支代码
...
else
以上条件都为假的分支代码 托底
fi
6.循环语句
echo命令
echo -n 表示不换行输出
echo -e 表示输出转义符
常用的转义符
选项 | 作用 |
---|---|
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入"\"本身转义 |
\b | 表示退格 不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
date命令
date查看当前系统时间
-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间
%F 完整日期格式,等价于 %Y-%m-%d
% T 时间(24小时制)(hh:mm:ss)
例:每周 5 使用 tar 命令备份/var/log 下的所有日志文件
vim /root/logbak.sh
#编写备份脚本,备份后的文件名包含日期标签,防止后面的备份将前面的备份数据覆盖#注意date 命令需要使用反引号括起来,反引号在键盘<tab>键上面
tar -czf log-`date +%Y%m%d`.tar.gz /var/log
# crontab ‐e #编写计划任务,执行备份脚本
00 03 * * 5 /root/logbak.sh
seq命令
seq 1 2 10
#从1 开始 步长为2 到10 为止
for
语法结构
- 列表循环
- 不带列表循环
- 类C风格的for循环
1.列表循环
语法:
for 变量名 in {list}
do
command
done
花括号的用法
花括号{}在for循环的应用:
for i in {1..50..2} 1-50的奇数
for i in {2..50..2} 1-50的偶数
for i in {10..1} 1-10倒序排列
2.不带列表循环
语法:
for 变量名
do
command
done
3. 类似于C语言风格的for循环
语法:
for ((expr1;expr2;expr3))
do
command
done
while
语法:
while :
do
done
双重循环及跳出循环
- break跳出单个循环 break n 数字数字是几代表跳出n层循环
- continue终止某次循环中的命令,但是不会完全终止命令
- exit 直接退出脚本
until
until 循环与 while 循环类似,while 循环能实现的脚本 until 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环
语法:
until 条件测试操作
do
命令序列
done