shell脚本和文本处理工具

一、文本处理工具

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/stdin0键盘 鼠标等
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出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

shell脚本例子

1.脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了, 猜小了或猜大了,直至用户猜对脚本结束。

请添加图片描述

2.提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 作为默认密码。

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值