目录

1 grep、cut、awk、sed对比总结

2 脚本的一些重要语句

2.1 判断式test与[ ]

2.2  if语句

2.3 case语句

2.4 循环 while、until、for

2.5 函数

2.6 脚本调试

部分习题自做答案


看完第十二章发现其实脚本的编写总体有C的影子,但是也有python的灵活性,以及大量比较好用的命令,所以学会脚本编写是大有裨益的。其中,对于数据流的处理很多,所以先将前面遇到的grep等数据处理工具进行一个总结。

1 grep、cut、awk、sed对比总结

几种数据处理工具总结
命令 能否正则 处理对象/功能 格式 常用参数 例子
cut 行中一段信息

cut -d '分割字符' -f field

field:指被分割的第几段

-c:以字符为单位取

-d:分割字符

-f:后跟第几段

echo ${PATH} | cut -d ':' -f 3,5

取出PATH的第三和五个路径

grep

可,且egrep可扩展正则

找到所需要信息的 grep [ ] '查找字符' filename

-c:计算查找到次数

-i:忽略大小写

-v:反向选择

-n:顺便输出行号

-A:可跟数字,后面几行也输出

-B:可跟数字,前面几行也输出

grep -n ‘t[ae]st’ reg.txt

查找tast或者test的行

egrep -v '^$|^#' reg.txt

去除空白行和以#为行首的行

sed 可且扩展 替换/删除/新增/选取行,或者替换一段信息

sed [ ] [ ‘[n1[, n2] function ’ ]

n1 n2 代表行数

function需要被 ' ' 括住,有:

a:下一行新增

c:替换

d:删除

i:插入

p:打印

s:替换 s/被替换/新的字符/g

-n:只输出处理过的行

-e:命令行模式操作

-f:将sed写入文件

-f filenaem:执行filename文件内的sed

-r:使用扩展正则

-i:直接修改不输出到屏幕

sed '2a drink tea'

第二行下加上drink tea

sed ‘2,5 no number’

第二到五行替换成no number

sed  ‘s/#.*$//g'

将#开头的行替换成空行

sed ' /^$/d'

删除空白行 /删除字符/d

awk 行中信息分处理

awk ‘条件1{操作1} 条件2 {操作2}  ...’  filename

内置变量:

NF: 每一行字段总数

NR:目前处理第几行

FS:目前分割字符,默认空格

$0:代表一行

$1 $2 ...:变量形式代表第几个字段

条件:

可以用逻辑运算符

awk ‘ $3<10 {print $1 "\t"  $3}’

若第三字段小于10则将第一字段和第三字段列表出来

awk ‘BEGIN {FS=':'} $3 <10 {print $1 "\t"  $3}’

将分割符换成:,同上

注意print 和printf不一样

2 脚本的一些重要语句

脚本的参数,是直接在执行脚本时传入的,如 sh a.sh 参数1 参数2 ...  在脚本中以$1 $2 .. 的形式使用

2.1 判断式test与[ ]

判断命令可以用test或者[ ]。test 可以直接跟例如-e -f 加上文件名,来判断是否存在或者是否为文件,而[ ]则相当于代理了test,语法基本一致,只有小小的格式需要注意:[□-e 文件名□],即[ ] 两边是要加空格(用□表示)的。

推荐使用[ ],句法简单易于读。

为了方便将鸟叔中书上部分参数拍下,如下

2.2  if语句

if [ 条件判断式 ]; then语句块
fiif [ 条件判断式 ]; then语句块
elif [ ]; then语句块
fiif [ 条件判断式 ]; then语句块
else语句块
fi

注意:变量和字符串比较需要用 “${变量}” == “字符串” 即两边都需要“ ”括起来。

2.3 case语句

case $变量 in"第一个变量内容")语句块;;
"第二个变量内容")语句块;;
*)语句块;;
esac

case用法和C的switch一样,但需要注意语法

  • 选择的变量内容后只有 )
  • 每个块需要;;结束,有些像break
  • 最后一个是*) 匹配所有字符 有些像 default

2.4 循环 while、until、for

while [ 条件 ]      #当成立开始循环
do语句块
doneuntil [ 条件 ]      #当成立结束循环
do语句块
donefor 变量 in con1 con2 ...  #有些像python中直接把后面的量赋给变量,而且只要有空格隔开
do                        #所以可以类似 for username in ${usrs}  user中有很多空格隔开的名字语句块                #注意:变量前是没有$的
donefor ((初始值;限制值;赋值运算)) #这个和C的基本一样,只不过是两层括号
do语句块
done

2.5 函数

function fname() {    #和C一样语句块
}#调用:
fname 参数1 参数2 ...
#在函数体中表示 参数1:$1 参数2:$2 ...

这里参数记得与脚本的参数区别,用C++来看,函数的作用域在脚本作用域中,所以在函数体中,函数的$1会将脚本的$1隐藏。

2.6 脚本调试

  • source:在父进程中执行,所以可以用来更改改变系统设置
  • sh:在子进程中执行
sh [ ] 脚本文件
-n:仅检查语法问题
-v:执行前先将脚本内容输出到屏幕
-x:将使用的脚本内容输出到屏幕,可以用来调试

部分习题自做答案

第一题:

#!/bin/bash
#Program:
#       chapter12 first exercise.
#History:
#       2023/02/06
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/linux_learn/script/bin
username=$(whoami)
dir=$(pwd)
echo -e "your name is ${username}, and your directory is ${dir}"
exit 0

第二题

#!/bin/bash
#Program:
#       chapter12 2nd exercise.
#History:
#       2023/02/06
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/linux_learn/script/bin
read -p "enter your birthday ex:0107    :" bday_now
bday_now_test=$(echo ${bday_now} | grep '[0-9]\{4\}')
if [ "$bday_now_test" == "" ];then  #注意两边都有“”echo "wrong date"exit 1
fi
declare -i bday_afteryear=$(($(date +%Y)+ 1))
bday="${bday_afteryear}${bday_now}"
declare -i datenow=$(date +%s)
declare -i datebir=$(date --date="${bday}" +%s)
declare -i date=$(((${datebir}-${datenow})/60/60/24))
echo -e "ater ${date} days"

linux学习(八)鸟叔第十二章:脚本练习相关推荐

  1. LINUX学习基础篇(十二)痕迹命令

    LINUX学习基础篇(十二)痕迹命令 系统痕迹命令 w命令 who命令 last命令 lastlog命令 lastb命令 系统痕迹命令 系统中有一些重要的痕迹日志文件,如/var/log/wtmp./ ...

  2. 【鸟哥的Linux私房菜】第十二章、学习shell脚本

    第十二章.学习shell脚本 以下皆为实践题,请自行编写出程序 请建立一个脚本,当你执行该脚本的时候,该脚本可以显示:(1)你目前的身份(用 whoami) (2)你目前所在的目录(用pwd) #!/ ...

  3. linux i2c adapter 增加设备_「正点原子Linux连载」第六十二章Linux SPI驱动实验(一)...

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南>关注官方微信号公众号,获取更多资料:正点原子 第六十二章Linux SPI驱动实验 上一 ...

  4. 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  5. 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  6. 鸟哥的Linux私房菜(服务器)- 第二十二章、邮件服务器: Postfix

    第二十二章.邮件服务器: Postfix 最近更新日期:2011/08/10 在这个邮件服务器的架设中,我们首先谈论 Mail 与 DNS 的重要相关性,然后依序介绍 Mail Server 的相关名 ...

  7. 【正点原子Linux连载】第七十二章 RGB转HDMI实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. 鸟哥的Linux私房菜(服务器)- 第十二章、网络参数控管者: DHCP 服务器

    第十二章.网络参数控管者: DHCP 服务器 最近更新日期:2011/07/27 想象两种情况:(1)如果你在工作单位使用的是笔记本电脑,而且常常要带着你的笔记本电脑到处跑, 那么由第四章.连上 In ...

  9. 系统架构师学习笔记_第十二章_连载

    第十二章  系统安全架构设计 12.1  信息系统安全架构的简单描述 信息安全的特征 是为了保证信息的 机密性.完整性.可用性.可控性.不可抵赖性. 以风险策略为基础. 12.1.1  信息安全的现状 ...

  10. 第四十八课第十二章Managing Indexes

    第十二章Managing Indexes 本章目标 1.列出索引的不同类型和作用 2.创建不同的索引 3.重新组织索引 4.维护索引 5.监控索引的使用 6.获取索引信息 索引分类 1.逻辑分类 ①单 ...

最新文章

  1. WinCE中串口驱动及接口函数介绍(转载)
  2. Tensorflow 全网最全学习资料汇总之框架平台的综合对比【3】
  3. 运用家居收纳储物空间 小空间变出大身材
  4. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )
  5. 使用telnet模拟邮件的收发
  6. Vi经典插件ctags(转)
  7. ABAP 标准培训教程 BC400 学习笔记之二:Cross-client 和 Client-specific 的区别
  8. ArcGIS Python
  9. 【从入门到放弃-ZooKeeper】ZooKeeper入门
  10. query登录linux命令,在Linux系统中使用sqlcmd命令连接与查询SQL Server
  11. Canvas 数学、物理、动画学习笔记一
  12. Ae效果控件快速参考:3D 通道
  13. 电饭锅一会儿通电一会儿不通电【检修原因】
  14. (个体户)注册公众平台步骤
  15. 如何卸载有密码保护的symantec客户端
  16. inductive bias:归纳偏置
  17. 网站快速排名百度首页搜索前十名
  18. Bursuite暴力破解实践
  19. 计算机设置从光盘启动怎么办,如何设置光盘启动计算机
  20. 重做红楼梦的数据分析-判断前80回后40回是否一个人写的

热门文章

  1. 张雪峰谈专科计算机网络技术,张雪峰:这三大专科“专业”,学生失业率极高,选择要慎重!...
  2. 汽车报户计算机自动选号,为爱车上户三招搞定中意车号 可上网自主选号
  3. python 字符串获取倒数第二个_Python 学习 第二篇:数据类型(字符串)
  4. 基于51单片机门禁系统
  5. 使用PHP+MySQL技术及前端开发技术,设计一个简易员工信息管理系统。
  6. 首页优化操作的详细步骤
  7. JDK8中HashMap依然会产生死循环问题,太香了
  8. Aurora、Chip2chip、Ethernet(一)
  9. 视频引伸计与数字图像相关法(DIC)的区别
  10. SCEP 离线更新病毒库