shell、awk、sed和定时器

84 阅读6分钟

一、shell

1.复习:

(1)shell脚本创建:

1.通过vi/vim编辑器,创建一个.sh结尾的文件。

2.shell文件声明: #!/bin/bash

3.shell文件中可以执行命令(命令集合),运算、逻辑控制、函数

(2)shell执行:

1.sh xxx.sh

2.bash xxx.sh

3.source xxx.sh

4.. xxx.sh

5.授予执行权限后 ./xxx.sh

(3)shell脚本编写 :

问题,编写一个shell 文件,可以传入文件名和行号,通过该shell获取指定文件中第几行内容

#!/bin/bashcat -n $1 | head -n $2 | tail -1

调用:

sh getcont.sh  /etc/passwd  10

问题:通过shell完成任意文件的重命名

问题:通过shell完成任意文件的重命名

#!/bin/bashmv $1 $2if [ $? -eq 0 ]then    echo '操作成功'else    echo '操作失败'fi

获取传入参数内容、长度

echo $@echo $*echo $#

判断上一条命令是否执行成功:

echo  $?0   成功非0  失败

运算:

算法运算符:

+  -  * / %  ++ --    ++ 表述 变量值+1 自增长i=1第一种:i=`expr $i + 1`第二种:let i+=1第三种:let i++第四种:((i++))第五种:i=$(($i+1))echo $i

比较运算符:

数字=  -> -eq>  -> -gt<  -> -lt>= -> -ge<= -> -le!= => -ne字符串: 前后有空格===!=

逻辑运算符:

与   &&或   ||非   !

(4)判断:

判断,用于分支和循环的条件。因为判断返回布尔类型数据(true和false)

接收用户输入,判断该数是否大于0

#!/bin/bashread -p "请输入一个数字:" numtest  $num -gt 0echo $?

判断用户输入是否为admin

read -p "请输入用户名:" nametest $name == "admin"echo $?

判断用户名(admin)和密码(123456)

test $1 = "admin" && test $2 -eq 123456echo $?

判断用户名(admin或者root)

test $1 = 'admin' || test $1 = 'root'echo $?

(6) 分支结构:

if-else结构:if 判断then    语句elif  判断 then    语句...else    语句fi

2.分支结构:

(1)case 了解

case 变量名 in匹配条件)  匹配成功后的业务代码;;
匹配条件2)  匹配成功后的业务代码;;*) 
#类似于else最后兜底业务代码esaccase 结构中,所有的条件是离散的。不能使用范围(不能使用比较运算符)

问题:当用户输入1.时,显示登录;当输入2时,显示注册当输入3时,提示退出

#!/bin/bash
#接收一个用户输入
read -p "Enter:" numcase $num in
1)   echo '登录';;
2)   echo "注册";;
3)   echo '退出';;
*)   echo "异常"esac

3.循环结构

控制解释器让代码在一个时间范围内,重复完成一些操作。

(1)for 循环

通常情况下,通过for循环完成明确循环次数的操作

for ((变量=值;判断;自增))
do 
#开始  类似{    需要循环的语句done #结束 类似}
for((i=0;i<10;i++))
do    echo $i
done
for i in 1 2 3 4 5 6
do    echo $i
done 
for i in {数字..数字}
do    语句
done
for i in {1..5}
do    echo $idone
for i in `seq 数字`do    语句donefor i in `seq 5`do    echo $idone
#从字符串中取值:
#!/bin/bashstr="Hello, World!"
# 提取每个字符
for i in $(seq 0 ${#str}); 
do  
echo "${str:$i:1}"
done

(2)while循环 通常情况下,使用while循环完成死循环。

while 判断
do   语句
done
如果有明确次数变量=值
while 条件
do   
语句   
变量自增
done

i=0
while [ $i -lt 10 ]
do    
echo $i    
let i++done

练习:for 和while 分别实现1-100累加 : 1+2+3+4+5+…+100

#!/bin/bash
#for
s=0
for i in {1..100}
do   
s=$(($s+$i))
done
echo $s#
whiles=0
i=1
while [ $i -le 100 ]
do   
s=$(($s+$i))   
let i++
done
echo $s

(3) until 循环(linux专属) 与while循环一致

until [ 条件 ]
do    语句
done

4)select (linux专属)

与for—in循环一致

select 变量  in  变量1  变量2  变量3 ...
do    语句
done

(5)循环控制

关键字:
break : 当条件满足时,触发break操作,循环中break之后代码不会执行,break所在的循环结束
continue : 当条件满足时,触发continue, 本次循环结束,关键字后的代码不执行
exit: 满足条件时,直接结束程序。

for i in {1..10}
do     
for j in {1..10}     
do         
if [ $j -eq 5 ]        
then             
continue|break|exit         
fi        
echo $j     
done
done

练习:通过循环结构,接收用户输入,并讲用户输入拼接“woniu”回显,当用户输入quit,退出

i=0
while true
do     
read -p 'Enter:' word     
if [ $word = 'quit']     
then         
break|exit     
fi     
echo $word'woniu'
done

4.函数:

函数是一种封装方式,讲代码中可能重复使用部分,统计放在一个结构中,这个结构就是函数。方便重复调用。提高代码的维护性。

定义:
function 函数名(){    
函数体    
[return 数据]
}
调用:函数名  参数...
echo $?      
#查看返回值
#定义一个函数f(x,y)=x+y功能
function add()
{   
c=$(($1+$2))   
echo $c
}
#函数调用add  1 2

练习:顶一个函数,实现用户输入数字的求和

二、字符串操作:

1.sed

sed,流编辑期。可以对文件进行增、删、改、查操作。sed命令在不使用-i参数时,所有增删改都发生内存中,不会改变源文件。

语法:sed 选项 命令 文件选项:    
-i 将编辑后的结果写入原文件    
-e 执行多条命令    
-n 只显示被执行的结果(查看使用)命令:    
#常见操作    
a:增加,在当前行下面增加一行指定内容。    
c:替换,将选定行替换为指定内容。    
d:删除,删除选定的行。    
i:插入,在选定行上面插入一行指定内容。    
#下面两个用的多    
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。    
n # 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。    
N # 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。    
s:替换,替换指定字符。    
y:字符转换。

(1)添加:

(1)添加:

sed '3a hello world' /tmp/passwd
sed '3i hi woniu' /tmp/passwd
#在每行上插入
sed 'i hello' /tmp/passwd#在每行下插入
sed 'a hello' /tmp/passwd

(2) 删除:

sed '4d' /tmp/passwd   删除第4行
sed '3,5d' /tmp/passwd  删除3到5行数据

(3) 修改:

sed '3c helloworld' /tmp/passwd      #修改第三行
sed '3,5c hellowoniu' /tmp/passwd    #修改三到五行内容

(4)查找

sed -n '3p' /tmp/passwd       #显示第三行内容
sed -n '3,5p' /tmp/passwd      #显示第3到5行内容
sed -n 'n;p' /tmp/passwd    #显示偶数行
sed -n 'p;n' /tmp/passwd    #显示奇数行

(5)替换:

sed 's/旧字符/新字符/g' /tmp/passwd
正则:    g: 全局模式    i: 忽略大小写
sed 's/bin/BIN/g' /tmp/passwd   对文件所有满足条件的字符串进行替换
sed 's/bin/BIN/' /tmp/passwd    对每行中第一个出现的字符串进行替换

awk命令简介 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符

awk是一种文本格式化的方式,默认以空格将字符串拆分成为表结构,可以以列为单位输出内容:

语法:awk -F '符号' '{print $数字}' 文件名
-F 指明以哪种方式分割字符串
print $数字:      
0    整行数据      
1    第1列      
2    第2列

(1)定义一个字符串 : s=’hello world’

awk '{print $1}' 文件名echo $s | awk '{print $2}'  #显示workd

(2)指定分割符: s=”Aho,Weinberger,Kernighan”

echo $s | awk -F ',' '{print $2}'    #显示Weinberger

(3)NR指定行过滤

awk -F ":" 'NR==3{print $1}' /etc/passwd      显示第三行第1列awk -F ":" 'NR==3||NR==10{print $1}' /etc/passwd   显示第三行和第十行第1列awk awk -F ":" 'NR==3,NR==10{print $1}' /etc/passwd   显示第3到10行第1列

(4) 通过正则查找

awk -F ":" '$1~/root/{print $0}' /etc/passwd   找到以root开头的行

练习:通过ping命令,从响应中找到ip

ping www.baidu.com -c 1 | awk -F "[()]" 'NR==1{print($2)}'

三、定时任务:

1.at

只一次定时器:

安装: yum install -y at

启动|重启|关闭服务:systemctl start|restart|stop atd

at now+时间
>echo 'hello'
ctrl + d 保存退出
时间: 数字+单位 (minute(s) hour(s) day(s))

2.crontab

周期任务:在给定的时间执行命令

启动和关闭服务:crond 
systemctl start|stop crondcrontab 
-选项      -l  显示当前用户创建的所有任务      -e  进入编辑      -r  删除

五星:

image-20240415171941772

(1)创建任务:

crontab -e*/1 * * * *  echo 'hello'   每分钟执行1 * * * *  echo 'hello'   每小时的第1分钟执行

(2)查看

crontab -l

(3)清空任务列表

crontab -r

补充:与定时任务无关

1.链接文件: 链接文件在linux分为两种:软硬链接的相同点:都会随着原文件的改变而改变,同样,修改链接文件后,原文件也会变。

1.软链接:当原文件删除后,软链接失效

创建:ln -s 原文件名 链接名

2.硬链接: 当原文件删除后,链接文件依然有效

船舰 : ln -d 原文件名 链接名

硬链接文件类型属于文件,软链接是连接

-rwxr—r—. 2 root root 129 4月 15 17:38 test_d.sh
lrwxrwxrwx. 1 root root 7 4月 15 17:34 test_s.sh -> test.sh

2.别名:

当操作命令过程时,可以通过命别名方式将命令变短,方便下次使用

语法:alias  简短的单词=’长的命令‘
alias  ens33='vi /etc/sysconfig/network-scripts/ifcfg-ens33'输入ens33打开ifcfg-enss文件

3.磁盘空间查看:

du -lh   显示当前目录中文件磁盘占用df -lh   显示整个文件系统的磁盘占用

4.内存查看

free