“Linux-2019-spring”的版本间的差异
(→课程信息) |
|||
| (未显示同一用户的47个中间版本) | |||
| 第11行: | 第11行: | ||
* 上课时间和地点: | * 上课时间和地点: | ||
| + | ** 上课对象:16级物联网、网工、软工本科生 (45人) | ||
** 周三10:10-12:00理工楼153上理论课; | ** 周三10:10-12:00理工楼153上理论课; | ||
** 周四10:10-12:00(单周)理工楼243上机课(434备用,目前用不到) | ** 周四10:10-12:00(单周)理工楼243上机课(434备用,目前用不到) | ||
| 第23行: | 第24行: | ||
** 实验报告应该严格按照模板要求认真填写,[http://hlt.suda.edu.cn/~zhli/exp-report.doc 实验报告word模板下载] | ** 实验报告应该严格按照模板要求认真填写,[http://hlt.suda.edu.cn/~zhli/exp-report.doc 实验报告word模板下载] | ||
** readme文件应该详细说明编译运行等 | ** readme文件应该详细说明编译运行等 | ||
| + | |||
| + | * 实验作业5:读下面四个shell脚本,最大程度上理解,给每一行添加注释,并在实验报告中总结学习到的语法 【2019年6月20日上机课之前完成并上传到作业平台上】 | ||
| + | ** [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/run0.sh run0.sh] | ||
| + | ** [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/run1.sh run1.sh] | ||
| + | ** [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/run2.sh run2.sh] [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/run2-fold.sh run2-fold.sh] | ||
| + | ** [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/run3.sh run3.sh] | ||
| + | |||
| + | * 实验作业4:环境变量的输出,修改,增加 【2019年6月6日上机课之前完成并上传到作业平台上】 | ||
| + | ./a.out -l # 输出所有的环境变量的名字和值,按照一定顺序排序 | ||
| + | ./a.out abc=123 # 增加环境变量abc,或更新原来的值 // 不用支持PATH=$PATH:.,只是简单的赋值语句 | ||
| + | |||
| + | * 实验作业3:c语言实现cpdir命令【2019年5月9日上机课之前完成并上传到作业平台上】 | ||
| + | ./a.out 3 5 10 100 // 分别表示,有3个生产者,5个消费者,仓库的容量为10,一共生产100个产品,消费完之后就停止 | ||
| + | 程序最开始就随机产生一个(0,3)之间的浮点常量,表示生产一个产品的时间,时间和生产者的数量成正比 | ||
| + | 同样,最开始随机产生一个(0,5)之间的浮点常量,表示消费一个产品的时间 | ||
| + | 生产或消费或产品的过程可以用sleep实现 | ||
| + | 如果仓库满了,生产者就阻塞(休息),无法把生产好的商品放到仓库中 | ||
| + | 如果仓库空了,消费者就阻塞(休息) | ||
| + | 消费者总是优先消费先生产的产品(防止过期) | ||
| + | 屏幕中要汇报进展信息(一定要注意,屏幕输出不能混杂) | ||
| + | 第0号生产者开始生产第70个商品 | ||
| + | 第1号生产者把第35号商品放到了仓库的第5个位置 | ||
| + | 第4号消费者从仓库的第5个位置拿出了第35号商品 | ||
| + | 第4号消费者将第35号商品消费完成 | ||
| + | |||
* 实验作业2:c语言实现cpdir命令【2019年4月14日晚上20:00前完成】 | * 实验作业2:c语言实现cpdir命令【2019年4月14日晚上20:00前完成】 | ||
编译后,在命令行输入 cpdir dir1 dir2可以递归将dir1复制为dir2,和cp -r dir1 dir2的功能一致 | 编译后,在命令行输入 cpdir dir1 dir2可以递归将dir1复制为dir2,和cp -r dir1 dir2的功能一致 | ||
| 第41行: | 第67行: | ||
5、wc: word count | 5、wc: word count | ||
| − | === | + | == awk == |
| + | |||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/awk.JPG awk板书讲义] | ||
| + | |||
| + | awk '条件/模式 {动作}' FILE | ||
| + | awk '$3>=90 {print}' score1.txt | less:$3为第三列 | ||
| + | awk '{print $2 " " $5}':打印两列,第二列和第五列 | ||
| + | awk '{print $2,$5}' | ||
| + | awk 'NR>1 {print}' | ||
| + | awk 'NR>1 {print $0}':$0打印一行 | ||
| + | awk 'BEGIN {print "No. ID. Score"}' score.txt | ||
| + | awk 'BEGIN {sum = 0};{sum = sum +$3};END {aver = sum/NR;print NR,sum,aver}' score.txt | ||
| + | wc score.txt:返回行数,词数/字段数,字符数 | ||
| + | awk '{cn =cn+length($0) +1;wn = wn+NF};END {print NR, wn ,cn}' | ||
| + | |||
| + | 特殊模式:BEGIN END | ||
| + | |||
| + | 特殊变量: | ||
| + | NR(record)---一行的记录,当前行 | ||
| + | NF(field)-----字段,表示列 | ||
| + | |||
| + | *管道pipeline | ||
| + | cat main.txt main.c >x1 | ||
| + | egrep 'stdout'>x2 | ||
| + | wc -l x2 | ||
| + | rm | ||
| + | cat main.txt main.c | egrep 'stdout' | wc -l:和上面的操作一样 | ||
| + | cat stdoutxxx main.txt main.c 2>&1 | egrep 'stdout' | wc -l:标准错误输出重定向 | ||
| + | rm */*.output:把所有文件下*.output删除 | ||
| + | cat */*.txt |egrep '^[0-9- ]+' -o |sort >y1 :-o只输出匹配的东西 | ||
| + | |||
| + | == 文件系统 == | ||
| + | |||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/xargs-and-file-system.JPG xargs命令和文件系统基础板书讲义] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/fdisk-df-dumpe2fs.JPG 文件系统fdisk df dumpe2fs命令板书讲义] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/fs-basic.JPG 文件系统基础板书讲义] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/fs-dir.JPG 文件系统目录的实质板书讲义] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/fs-mount.JPG 文件系统挂载板书讲义] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/fs-ln.JPG 文件系统链接板书讲义] | ||
| + | |||
| + | *文件系统的介绍 | ||
| + | |||
| + | 1、分区(partition)------>格式化(formatting) | ||
| + | |||
| + | 2、windows下的文件系统:NTFS(能存储大文件),FAT | ||
| + | |||
| + | 3、linux下的文件系统:EXT2/3/4 linux extended file system | ||
| + | |||
| + | *文件系统的定义 | ||
| + | 定义了如何存储、增加、删除、读文件。 | ||
| + | 百度上的定义:文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。 | ||
| + | |||
| + | |||
| + | *一个文件如何存储 | ||
| + | 1、唯一的inode(256个字节)——————>存储文件的属性(读写权限、创建时间、修改时间、访问时间等)+block的指针列表 | ||
| + | |||
| + | 2、0到n个block(4k字节)——————>存储文件的真实内容 | ||
| + | |||
| + | 3、superblock——————>fs共有inode、共有block、空闲的block、inode的bitmap、block的bitmap等 | ||
| + | |||
| + | *相关指令 | ||
| + | |||
| + | $sudo dumpe2fs /dev/sda1/ | less | ||
| + | $du -sh main.c 查看文件的真实物理大小 (要考) | ||
| + | $du -sh . | ||
| + | |||
| + | |||
| + | ===挂载和卸载=== | ||
| + | |||
| + | *挂载的 | ||
| + | 1、定义:把一个文件系统挂到目录树中的一个点(挂载点--空目录)上 | ||
| + | |||
| + | 2、windows(分区文件系统)————C:;D:;E: | ||
| + | |||
| + | 3、linux(目录结构)————bin;home;etc | ||
| + | |||
| + | 4、挂起的指令:mount dev_name dir_name | ||
| + | |||
| + | 5、相关指令 | ||
| + | |||
| + | $sudo umount /media/zhenghua8G | ||
| + | $mkdir to_mount | ||
| + | $sudo fdisk -l | ||
| + | $sudo mount /dev/sdb1 /media/to_mount | ||
| + | $vim /etc/fstab | ||
| + | $df -h (要考) | ||
| + | |||
| + | |||
| + | |||
| + | ===链接:硬链接和软链接=== | ||
| + | |||
| + | *hard link (硬链接) | ||
| + | |||
| + | 1、特点:同一个文件,有多个名字;针对文件,不支持目录;不能跨文件系统。 | ||
| + | |||
| + | 2、相关指令 | ||
| + | $ln main.c hlink.c | ||
| + | $ls -li *.c | ||
| + | $rm hlink.c | ||
| + | |||
| + | *symbolic link (软链接) | ||
| + | |||
| + | 1、特点:不同文件;文件和目录都可以;可以跨文件系统。 | ||
| + | |||
| + | 2、相关指令 | ||
| + | $ls -lid linux/vim _awk | ||
| + | $ls -li cur(指向linux/vim _awk的软连接) | ||
| + | $ln -s main.c slink.c | ||
| + | $ls -li *.c | ||
| + | $ln -s ~/home/zhenghua/linux-teach/c-multi-arr/main.c slink2.c | ||
| + | $ln main.c hmain.c | ||
| + | $ls -lid c-multi-arr | ||
| + | $cd c-multi-arr | ||
| + | $ls -lid . | ||
| + | $mkdir a | ||
| + | $ls -lid c-multi-arr(硬链接增加一个) | ||
| + | |||
| + | 四、考试题 | ||
| + | |||
| + | cat /etc/password 怎么找到password的iNode? | ||
| + | |||
| + | == 2019.6.12 过滤器、文件系统 == | ||
| + | |||
| + | 2019.6.5 王中卿老师上课,讲解了awk和命令ln | ||
| + | |||
| + | awk复习 | ||
| + | |||
| + | 过滤器的概念 | ||
| + | |||
| + | == 2019.5.29 sed history fc shell一些技巧 == | ||
| + | |||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/shell-advanced-fc.JPG shell高级(fc命令)板书讲义] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/sed.JPG sed板书讲义] | ||
| + | |||
| + | * shell高级技巧 | ||
| + | |||
ctrl+a回到命令的最开始 | ctrl+a回到命令的最开始 | ||
ctrl+e回到命令的最末尾 | ctrl+e回到命令的最末尾 | ||
| 第47行: | 第208行: | ||
ctrl+r | ctrl+r | ||
history | history | ||
| − | |||
屏幕对应的文件:标准输入输出stdin;stdout;stderr | 屏幕对应的文件:标准输入输出stdin;stdout;stderr | ||
$clear或者 ctrl+l:清屏 | $clear或者 ctrl+l:清屏 | ||
| − | + | 注:“tab”键,自动补全文件名、命令名 | |
| − | |||
| − | 注:“tab”键,自动补全文件名、命令名 | ||
bg background后台 | bg background后台 | ||
fg fore ground前台 | fg fore ground前台 | ||
fc fix command/history修改命令 | fc fix command/history修改命令 | ||
| + | ctrl+c:杀死(kill?)进程 | ||
| + | ctrl+d:"EOF"信号 | ||
| + | |||
| + | |||
| + | * egrep | ||
| + | egrep '^([a-Z]+)([0-9]+) \2\1$':一行的开始第一组为字母,第二组为数字,然后是空格,需要严格匹配。匹配上abc123 123abc 匹配不上:abc123 342abc | ||
| + | egrep '^([a-Z]+)([0-9]+) ([0-9]+)([a-Z]+)$':可匹配上abc123 342abc | ||
| + | |||
| + | |||
| + | * vi中支持基本的正则表达式语法 | ||
| + | |||
| + | vi中查找:$vim a.txt ; | ||
| + | /std (查找) | ||
| + | :s/std/stdin/(当前行的第一个std替换成stdin) | ||
| + | :s/std/stdin/g(当前行std全局替换成stdin,第一个/是定界符) | ||
| + | :%s/std/stdin/(所有行的第一个std替换成stdin) | ||
| + | :%s/std/stdin/g(所有行std全局替换成stdin,第一个/是定界符) 等价于:0,$s/std/stdin/g | ||
| + | :s/std/stdin/3(当前行开始3行的第一个std替换成stdin) | ||
| + | :s/std/stdin/g3(当前行开始3行的std全局替换成stdin) | ||
| + | :26s/std/stdin/g(26行std全局替换成stdin,第一个/是定界符) | ||
| + | :23,26s/std/stdin/g(23到26行std全局替换成stdin,第一个/是定界符) | ||
| + | :.,$s/std/stdin/g(当前行到文章末尾std全局替换成stdin,第一个/是定界符) | ||
| + | :.,.+3s/std/stdin/g(当前行开始3行std全局替换成stdin) | ||
| + | :s/std[inout]*/(&)/g2(当前行开始2行stdin或者stdout全局替换成加括号的stdin和stdout) | ||
| + | :15,20d(删除15到20行) | ||
| + | :0,.d(删除零到当前行) | ||
| + | |||
| + | |||
| + | * sed (stream editor) | ||
| + | 语法sed [opt] "cmd" file | ||
| + | 编辑 ----vim 打开文件替换 | ||
| + | ----sed:不用打开文件 | ||
| + | sed 's/^ //' score.txt | less 把每行前四个空格删掉 | ||
| + | sed -r 's/^\s+//' socre.txt>score2.txt | ||
| + | sed '1d' score.txt | less 删除第一行 | ||
| + | sed '/[^0-9]$/d'删除缺考的那一行 | ||
| + | sed -r 's/[^0-9 ].*[^0-9]/ /' | ||
| + | sed 's/std/stdin/g' main.txt > main.2.txt :main.txt内容不变,定界符还可以为# | ||
| + | sed -i 's/std/stdin/g' main.2.txt :会替换掉main.2.txt中的内容 | ||
| + | sed -r 's/^([0-9]*)([/t ]*)([^/t ]*)/\3\2\1/' main.txt :(第一个^表示一行的开始,\1表示第一分组(括号)匹配的内容) | ||
| + | sed -r 's/^(([0-9]*)([/t ]*)([^/t ]*))/\4\3\2/' main.txt :分组按照左括号开始匹配内容 | ||
| + | sed -r 's/std[inout]*/(&)/g' main.2.txt | ||
| + | 删除 sed '2,&d' main.txt | ||
| + | sed '/^std/d' main.txt 删除以std开头的行 | ||
| + | |||
| + | == 2019.5.22 shell编程 复习 == | ||
| + | |||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/shell-scripts-1.JPG shell脚本板书讲义-part1] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/shell-scripts-2.JPG shell脚本板书讲义-part2] | ||
| + | |||
| + | |||
| + | |||
| + | * 解释型语言和编译型语言 | ||
| + | 解释型语言特点: | ||
| + | 1.解释器(interpreter)按语句逐条执行 | ||
| + | 2.语法/运行时的错误只有执行到的时候才会报 | ||
| + | 3.优化的余地不大 | ||
| − | + | 编译型语言特点 | |
| + | 1.编译器一次性读入源代码,编译(compile)每一个.c文件-->.o文件(二进制文件、机器代码),链接(link)*.o --> .exe | ||
| + | 2.语法错误立刻报 | ||
| + | 3.优化可以很充分 | ||
| − | + | *shell脚本 | |
| + | 一般来说,解释型语言写的程序叫做脚本。(脚本特点:小) | ||
| − | = | + | shell中数据类型有两种:Integer和String |
| + | (默认都是String,在没有歧义的情况下不用加引号) | ||
| + | ex. v="I love teaching" | ||
| − | === | + | 赋值语句:x=3(等号左右不能有空格)y=5 |
| + | $:取值符 用法${}(当不歧义时不用加{}) | ||
| + | echo $x | ||
| + | 字符串拼接:k=$x$y | ||
| + | 数值运算:k=$(($x+$y)) | ||
| + | 思考: | ||
| + | m="$x+$y=$(($x+$y))" | ||
| + | m='$x+$y=$(($x+$y))' | ||
| − | == | + | *关于shell中的变量 |
| + | 1.默认都是字符串 | ||
| + | 2.declare -i 整数类型 | ||
| + | 3.如果做整数运算,会把非整数都理解为0 | ||
| + | 4.declare +i 把变量的整数属性去掉 | ||
| + | 5.unset删除一个变量 | ||
| + | 6.echo $notexistvar 等价于 echo $emptystrvar(空字符串) | ||
| + | 7.declare -r var (read-only)等价于 const int i = 1; | ||
| + | 8.环境变量:指可以继承给儿子进程的变量 | ||
| + | export x 或 declare -x x | ||
| + | 注:shell中的继承只能通过环境变量 | ||
| + | 9.数组变量 | ||
| + | a=(A B C 1 2 30) | ||
| + | echo ${a[0]} | ||
| + | 数组长度:echo ${#a[@]} | ||
| + | 增加元素:a[100]=40 | ||
| + | 总结 | ||
| + | a.下标可以不连续 | ||
| + | b.下标不合法输出空字符串 | ||
| + | c.{#a[@]表示数组长度 | ||
| + | 10.特殊变量 | ||
| + | $变量:当前shell的进程编号 | ||
| + | ?变量:返回上个命令的状态编号(上个命令执行成功返回0,未成功返回大于0) | ||
| + | 11.把命令结果保存到变量中 | ||
| + | a.$(cmd) 例:a=$(ls) | ||
| + | b.`cmd` 例:a=`date +%y-%m-%d` | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | test命令 | |
| + | a.判断文件类型、存在、时间比较、权限 | ||
| + | b.比较字符串或证书 | ||
| − | + | test -e /bin/ls:-e是否存在 | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | 与条件语句合用: | |
| − | + | if test -e /bin/ls; then echo "exist: /bin/ls"; fi | |
| − | + | if [ -e /bin/ls ]; then echo "exist: /bin/ls"; fi | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | shell中的循环 | |
| − | + | while循环 | |
| + | for循环 | ||
| + | *上节课思考题: | ||
| + | for f in `find . -name '*output*txt'` | ||
| + | do | ||
| + | newf=`echo $f | sed 's/.output//'`; | ||
| + | mv $f $newf; | ||
| + | done | ||
| − | |||
| − | |||
| − | + | *shell中变量的定义 | |
| − | $./ | + | 注意变量两边不能有空格 |
| + | |||
| + | *复杂语句 | ||
| + | |||
| + | *shell脚本(求和的例子) | ||
| + | #!/bin/bash | ||
| + | sum=0 | ||
| + | for((i=1;i<101;i=i+1)); do | ||
| + | sum=$(($i+$sum)) | ||
| + | done | ||
| + | echo $sum | ||
| + | |||
| + | |||
| + | *shell脚本的运行方式 | ||
| + | 1、bash x.sh | ||
| + | |||
| + | 2、chmod +x x.sh | ||
| + | ./x.sh | ||
| + | |||
| + | *“#!/bin/bash ”的作用 | ||
| + | |||
| + | 1、告诉shell文件类型,打开或解释或运行的方式 | ||
| + | |||
| + | 2、告诉shell用那种shell运行文件。 | ||
| + | |||
| + | *shell中函数的定义和使用 | ||
| + | $# -----参数的个数 | ||
| + | $* -----字串 | ||
| + | $0 -----第0个参数 | ||
| + | $1 -----第1个参数 | ||
| + | $@ -----数组 | ||
| + | $? -----获取返回值 | ||
| + | |||
| + | *命令行参数 | ||
| + | |||
| + | $nohup bash run0.sh &:后台运行run0.sh | ||
| + | |||
| + | |||
| + | [http://hlt.suda.edu.cn/index.php/Linux-2018-spring-run0.sh run0.sh] | ||
| + | [http://hlt.suda.edu.cn/index.php/Linux-2018-spring-run1.sh run1.sh] | ||
| + | [http://hlt.suda.edu.cn/index.php/Linux-2018-spring-run2.sh run2.sh] | ||
| + | [http://hlt.suda.edu.cn/index.php/Linux-2018-spring-run3.sh run3.sh] | ||
| + | |||
| + | == 2019.5.15 shell编程 (王中卿老师代课)== | ||
| − | + | === 王中卿老师代课笔记 === | |
| − | + | 1. Shell脚本输出语句echo命令,运行方式bash hello.sh 或sh hello.sh | |
| + | 2. 变量: 命名,变量的引用方式,变量的赋值,删除变量,定义只读变量。 | ||
| + | a) 环境变量PATH HOME等 | ||
| + | b) 字符串:双引号 单引号 反引号的区别,vim中语法高亮的提示显示它们不同的作用。${# }获取字符串长度 | ||
| + | 反引号中放置命令 如expr 1 + 2 ,其中空格不可少。或者写成$((1+2))的形式 | ||
| + | 3. 数组 数组索引 数组中可存在不同类型的值 | ||
| + | 4. 运算符 5种运算符 | ||
| + | 5. Test 命令 | ||
| + | 6. 函数的定义和使用 | ||
| + | a) 传递参数 | ||
| + | b) 流程控制 | ||
| + | 7. 几个shell 脚本例子: 模拟用户登录,倒序输出数组,求1-10中的素数 | ||
| − | + | == 2019.5.8 (第11周/共17周,6月19日最后一次课)== | |
| − | + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/egrep-re.JPG egrep和re板书讲义] | |
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/re.JPG re板书讲义] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/pipeline.JPG 管道pipeline板书讲义] | ||
=== egrep命令=== | === egrep命令=== | ||
简单学习一下 | 简单学习一下 | ||
| + | === 正则表达式 === | ||
| + | man egrep,根据英文文档讲一遍 | ||
===管道=== | ===管道=== | ||
| 第136行: | 第436行: | ||
=== 正则表达式 === | === 正则表达式 === | ||
结合egrep命令 | 结合egrep命令 | ||
| + | |||
| + | 一、复习 | ||
| + | *正则表达式 | ||
| + | |||
| + | *egrep命令: | ||
| + | |||
| + | 1、egrep命令用于在文件内查找指定的字符串。egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep是用extended regular expression语法来解读的,而grep则用basic regular expression 语法解读,extended regular expression比basic regular expression的表达更规范。 | ||
| + | |||
| + | 2、grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。 | ||
| + | $egrep 'int' main.c | ||
| + | $egrep -n 'int' (ctrl + d 输入结束) | ||
| + | $egrep -n '[ijklm]nt' | ||
| + | $egrep -n '[^0-9]nt':加^表示取反 | ||
| + | $egrep -n '[0-9]nt' | ||
| + | $egrep -n '.nt' | ||
| + | $egrep -n 'a*bc' | ||
| + | $egrep -n 'a*?bc' | ||
| + | $egrep -n 'a?bc' | ||
| + | $egrep -n '[0-9]*bc' | ||
| + | $egrep -n 'abc|bcd' | ||
| + | $egrep -n '(abc|bcd)[0-9]+' | ||
| + | $egrep -n '^(abc|bcd)' | ||
| + | $egrep -n '^(abc|bcd)$' | ||
| + | |||
| + | *正则表达式 regular expression | ||
| + | |||
| + | 正则表达式的定义:表达正则语言的一个式子;以一定规则写出来的一个字符串,作为一个抽象的模式,用以匹配一个、多个甚至无穷多个实际的字符串。 | ||
| + | |||
| + | 1、literal字面意思 | ||
| + | |||
| + | 2、[ ] 字符集 $egrep -n '[0-9]nt' | ||
| + | |||
| + | 3、 . 任意一个字符,不能匹配\n\r | ||
| + | |||
| + | 4、重复修饰符(贪心 greedy): * 表示前面的字符匹配0次到n次;? 表示可取0个/1个 ;+ 重复一次到无穷多次 ;{3} 重复3次;{3,5} 三次到五次 ;{3,} 三次到无穷 | ||
| + | |||
| + | 5、分组:() ;| 或 | ||
| + | |||
| + | 6、定位符:^表示行首,$表示行尾,单词的首/尾(自学) | ||
| + | |||
| + | 通配符 * ? | ||
| + | |||
| + | 正则表达式 .* . | ||
| + | |||
| + | == 2019.4.24 == | ||
| + | |||
| + | === shell重定向 === | ||
| + | |||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/redirect1.JPG 重定向板书讲义 part-1] | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/linux-2019-spring/redirect2.JPG 重定向板书讲义 part-2] | ||
| + | |||
| + | *标准输入重定向 stdin--->file | ||
| + | *标准输出重定向 stdout--->file | ||
| + | |||
| + | a->b b->c ... | ||
| + | A->B ... | ||
| + | |||
| + | |||
| + | 输入重定向:写一个简单的代码来解释(很多命令都是同时支持:a文件参数;b默认标准输入,如sort) | ||
| + | myencrypt.c | ||
| + | |||
| + | 输出重定向: | ||
| + | |||
| + | $./myencrypt > yy.txt | ||
| + | |||
| + | 只输出标准错误输出stderr:I am stderr | ||
| + | |||
| + | $./myencrypt >> yy.tx 追加 | ||
| + | |||
| + | $./myencrypt > yy.tx 2>&1:标准错误的输出也写入了yy.txt中 | ||
| + | |||
| + | stdin=0;stdout=1;stderr=2 | ||
| + | |||
| + | == 2019.4.17 == | ||
| + | |||
| + | === 进程管理 === | ||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/top-ps.JPG 黑板板书总结] | ||
| + | * ps | ||
| + | [http://www.runoob.com/linux/linux-comm-ps.html runoob-ps]:了解一下即可 | ||
| + | $man ps 语法比较复杂,三种格式的参数option | ||
| + | * top:x M | ||
| + | |||
| + | === shell中wildcard 通配符 === | ||
| + | |||
| + | * [http://hlt.suda.edu.cn/~zhli/teach/wild-card.JPG 黑板板书总结] | ||
| + | *?匹配任意一个字符; *匹配任意长度个任意字符;[abcd]匹配中括号中的某一个字符;[a-z]匹配一个范围 | ||
| + | $ls /bin/?a??? | ||
| + | $ls /bin/f* | ||
| + | $ls /[cd]* :匹配中括号中的某一个字符开头的文件 | ||
| + | *shell来处理的通配符 | ||
| + | $ls home/*:相当于ls /home/zhenghua /home/yli /home/a.txt | ||
| + | $ls -d /home/*:不显示文件夹内的东西 | ||
| + | $cp *.txt xxx | ||
| + | |||
| + | === find命令 === | ||
| + | $ find . -name '*xxx*' | ||
| + | [http://www.runoob.com/linux/linux-comm-find.html runoob-find] | ||
| + | $ man find可以学到很多东西,可以和 | xargs结合 | ||
| 第242行: | 第640行: | ||
* 理解shell是什么 | * 理解shell是什么 | ||
* 了解shell是怎么工作的 | * 了解shell是怎么工作的 | ||
| − | * [http://hlt.suda.edu.cn/~zhli/teach/shell. | + | * [http://hlt.suda.edu.cn/~zhli/teach/shell.jpeg 黑板板书总结] |
== 2019.3.27 == | == 2019.3.27 == | ||
2019年12月18日 (三) 10:44的最新版本
Linux 操作系统 课程主页
- Teacher: 李正华
- Teach Assistant: 江心舟
- Linux课程QQ群:643979822
- 2019春季学期
- 写给自己的话
- 内容不可能面面俱到,抓住重点(以及自己感觉最重要的知识点)即可,其他需要靠学生自己去探索
- 多鼓励学生自己思考
课程信息
- 上课时间和地点:
- 上课对象:16级物联网、网工、软工本科生 (45人)
- 周三10:10-12:00理工楼153上理论课;
- 周四10:10-12:00(单周)理工楼243上机课(434备用,目前用不到)
- 成绩分布:平时10-15分、实践20-25、期末60(计划)
- Linux课程QQ群:643979822
- Linux课程的百度云分享链接(2018年教学视频) - 密码: 45n2
- 期末总成绩(待定)
实践作业
- 请登录csteaching.suda.edu.cn网站,认真完成实验报告,并将代码和readme.txt打包作为附件上传
- 实验报告应该严格按照模板要求认真填写,实验报告word模板下载
- readme文件应该详细说明编译运行等
- 实验作业5:读下面四个shell脚本,最大程度上理解,给每一行添加注释,并在实验报告中总结学习到的语法 【2019年6月20日上机课之前完成并上传到作业平台上】
- 实验作业4:环境变量的输出,修改,增加 【2019年6月6日上机课之前完成并上传到作业平台上】
./a.out -l # 输出所有的环境变量的名字和值,按照一定顺序排序 ./a.out abc=123 # 增加环境变量abc,或更新原来的值 // 不用支持PATH=$PATH:.,只是简单的赋值语句
- 实验作业3:c语言实现cpdir命令【2019年5月9日上机课之前完成并上传到作业平台上】
./a.out 3 5 10 100 // 分别表示,有3个生产者,5个消费者,仓库的容量为10,一共生产100个产品,消费完之后就停止
程序最开始就随机产生一个(0,3)之间的浮点常量,表示生产一个产品的时间,时间和生产者的数量成正比
同样,最开始随机产生一个(0,5)之间的浮点常量,表示消费一个产品的时间
生产或消费或产品的过程可以用sleep实现
如果仓库满了,生产者就阻塞(休息),无法把生产好的商品放到仓库中
如果仓库空了,消费者就阻塞(休息)
消费者总是优先消费先生产的产品(防止过期)
屏幕中要汇报进展信息(一定要注意,屏幕输出不能混杂)
第0号生产者开始生产第70个商品
第1号生产者把第35号商品放到了仓库的第5个位置
第4号消费者从仓库的第5个位置拿出了第35号商品
第4号消费者将第35号商品消费完成
- 实验作业2:c语言实现cpdir命令【2019年4月14日晚上20:00前完成】
编译后,在命令行输入 cpdir dir1 dir2可以递归将dir1复制为dir2,和cp -r dir1 dir2的功能一致
- 实验作业1:c语言实现myls命令【2019年4月11日上机课前完成】
编译后,在命令行输入 myls dir可以显示dir1目录下的文件(包括目录),并且输出每一个文件的权限、时间、大小、拥有着等信息,类似于ls -l dir。
Linux核心思想
- 每个程序只做一件事,做到最好,功能完善:vim+gcc+gdb = visual studio c++
讲义
后期内容
- tab键自动补全
- AM:(0:00-12:00)ante meridiem or ante meridian; 上午;PM:(12:00-24:00)post meridiem or post meridian; 下午
5、wc: word count
awk
awk '条件/模式 {动作}' FILE
awk '$3>=90 {print}' score1.txt | less:$3为第三列
awk '{print $2 " " $5}':打印两列,第二列和第五列
awk '{print $2,$5}'
awk 'NR>1 {print}'
awk 'NR>1 {print $0}':$0打印一行
awk 'BEGIN {print "No. ID. Score"}' score.txt
awk 'BEGIN {sum = 0};{sum = sum +$3};END {aver = sum/NR;print NR,sum,aver}' score.txt
wc score.txt:返回行数,词数/字段数,字符数
awk '{cn =cn+length($0) +1;wn = wn+NF};END {print NR, wn ,cn}'
特殊模式:BEGIN END
特殊变量:
NR(record)---一行的记录,当前行 NF(field)-----字段,表示列
- 管道pipeline
cat main.txt main.c >x1 egrep 'stdout'>x2 wc -l x2 rm cat main.txt main.c | egrep 'stdout' | wc -l:和上面的操作一样 cat stdoutxxx main.txt main.c 2>&1 | egrep 'stdout' | wc -l:标准错误输出重定向 rm */*.output:把所有文件下*.output删除 cat */*.txt |egrep '^[0-9- ]+' -o |sort >y1 :-o只输出匹配的东西
文件系统
- 文件系统的介绍
1、分区(partition)------>格式化(formatting)
2、windows下的文件系统:NTFS(能存储大文件),FAT
3、linux下的文件系统:EXT2/3/4 linux extended file system
- 文件系统的定义
定义了如何存储、增加、删除、读文件。 百度上的定义:文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构;即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
- 一个文件如何存储
1、唯一的inode(256个字节)——————>存储文件的属性(读写权限、创建时间、修改时间、访问时间等)+block的指针列表
2、0到n个block(4k字节)——————>存储文件的真实内容
3、superblock——————>fs共有inode、共有block、空闲的block、inode的bitmap、block的bitmap等
- 相关指令
$sudo dumpe2fs /dev/sda1/ | less $du -sh main.c 查看文件的真实物理大小 (要考) $du -sh .
挂载和卸载
- 挂载的
1、定义:把一个文件系统挂到目录树中的一个点(挂载点--空目录)上
2、windows(分区文件系统)————C:;D:;E:
3、linux(目录结构)————bin;home;etc
4、挂起的指令:mount dev_name dir_name
5、相关指令
$sudo umount /media/zhenghua8G
$mkdir to_mount
$sudo fdisk -l
$sudo mount /dev/sdb1 /media/to_mount
$vim /etc/fstab
$df -h (要考)
链接:硬链接和软链接
- hard link (硬链接)
1、特点:同一个文件,有多个名字;针对文件,不支持目录;不能跨文件系统。
2、相关指令
$ln main.c hlink.c
$ls -li *.c
$rm hlink.c
- symbolic link (软链接)
1、特点:不同文件;文件和目录都可以;可以跨文件系统。
2、相关指令
$ls -lid linux/vim _awk
$ls -li cur(指向linux/vim _awk的软连接)
$ln -s main.c slink.c
$ls -li *.c
$ln -s ~/home/zhenghua/linux-teach/c-multi-arr/main.c slink2.c
$ln main.c hmain.c
$ls -lid c-multi-arr
$cd c-multi-arr
$ls -lid .
$mkdir a
$ls -lid c-multi-arr(硬链接增加一个)
四、考试题
cat /etc/password 怎么找到password的iNode?
2019.6.12 过滤器、文件系统
2019.6.5 王中卿老师上课,讲解了awk和命令ln
awk复习
过滤器的概念
2019.5.29 sed history fc shell一些技巧
- shell高级技巧
ctrl+a回到命令的最开始
ctrl+e回到命令的最末尾
ctrl+u清除一行的命令
ctrl+r
history
屏幕对应的文件:标准输入输出stdin;stdout;stderr
$clear或者 ctrl+l:清屏
注:“tab”键,自动补全文件名、命令名
bg background后台
fg fore ground前台
fc fix command/history修改命令
ctrl+c:杀死(kill?)进程
ctrl+d:"EOF"信号
- egrep
egrep '^([a-Z]+)([0-9]+) \2\1$':一行的开始第一组为字母,第二组为数字,然后是空格,需要严格匹配。匹配上abc123 123abc 匹配不上:abc123 342abc egrep '^([a-Z]+)([0-9]+) ([0-9]+)([a-Z]+)$':可匹配上abc123 342abc
- vi中支持基本的正则表达式语法
vi中查找:$vim a.txt ;
/std (查找)
:s/std/stdin/(当前行的第一个std替换成stdin)
:s/std/stdin/g(当前行std全局替换成stdin,第一个/是定界符)
:%s/std/stdin/(所有行的第一个std替换成stdin)
:%s/std/stdin/g(所有行std全局替换成stdin,第一个/是定界符) 等价于:0,$s/std/stdin/g
:s/std/stdin/3(当前行开始3行的第一个std替换成stdin)
:s/std/stdin/g3(当前行开始3行的std全局替换成stdin)
:26s/std/stdin/g(26行std全局替换成stdin,第一个/是定界符)
:23,26s/std/stdin/g(23到26行std全局替换成stdin,第一个/是定界符)
:.,$s/std/stdin/g(当前行到文章末尾std全局替换成stdin,第一个/是定界符)
:.,.+3s/std/stdin/g(当前行开始3行std全局替换成stdin)
:s/std[inout]*/(&)/g2(当前行开始2行stdin或者stdout全局替换成加括号的stdin和stdout)
:15,20d(删除15到20行)
:0,.d(删除零到当前行)
- sed (stream editor)
语法sed [opt] "cmd" file
编辑 ----vim 打开文件替换
----sed:不用打开文件
sed 's/^ //' score.txt | less 把每行前四个空格删掉
sed -r 's/^\s+//' socre.txt>score2.txt
sed '1d' score.txt | less 删除第一行
sed '/[^0-9]$/d'删除缺考的那一行
sed -r 's/[^0-9 ].*[^0-9]/ /'
sed 's/std/stdin/g' main.txt > main.2.txt :main.txt内容不变,定界符还可以为#
sed -i 's/std/stdin/g' main.2.txt :会替换掉main.2.txt中的内容
sed -r 's/^([0-9]*)([/t ]*)([^/t ]*)/\3\2\1/' main.txt :(第一个^表示一行的开始,\1表示第一分组(括号)匹配的内容)
sed -r 's/^(([0-9]*)([/t ]*)([^/t ]*))/\4\3\2/' main.txt :分组按照左括号开始匹配内容
sed -r 's/std[inout]*/(&)/g' main.2.txt
删除 sed '2,&d' main.txt
sed '/^std/d' main.txt 删除以std开头的行
2019.5.22 shell编程 复习
- 解释型语言和编译型语言
解释型语言特点: 1.解释器(interpreter)按语句逐条执行 2.语法/运行时的错误只有执行到的时候才会报 3.优化的余地不大
编译型语言特点 1.编译器一次性读入源代码,编译(compile)每一个.c文件-->.o文件(二进制文件、机器代码),链接(link)*.o --> .exe 2.语法错误立刻报 3.优化可以很充分
- shell脚本
一般来说,解释型语言写的程序叫做脚本。(脚本特点:小)
shell中数据类型有两种:Integer和String (默认都是String,在没有歧义的情况下不用加引号) ex. v="I love teaching"
赋值语句:x=3(等号左右不能有空格)y=5 $:取值符 用法${}(当不歧义时不用加{}) echo $x 字符串拼接:k=$x$y 数值运算:k=$(($x+$y))
思考: m="$x+$y=$(($x+$y))" m='$x+$y=$(($x+$y))'
- 关于shell中的变量
1.默认都是字符串 2.declare -i 整数类型 3.如果做整数运算,会把非整数都理解为0 4.declare +i 把变量的整数属性去掉 5.unset删除一个变量 6.echo $notexistvar 等价于 echo $emptystrvar(空字符串) 7.declare -r var (read-only)等价于 const int i = 1; 8.环境变量:指可以继承给儿子进程的变量 export x 或 declare -x x
注:shell中的继承只能通过环境变量
9.数组变量 a=(A B C 1 2 30) echo ${a[0]} 数组长度:echo ${#a[@]} 增加元素:a[100]=40 总结 a.下标可以不连续 b.下标不合法输出空字符串 c.{#a[@]表示数组长度 10.特殊变量 $变量:当前shell的进程编号 ?变量:返回上个命令的状态编号(上个命令执行成功返回0,未成功返回大于0) 11.把命令结果保存到变量中 a.$(cmd) 例:a=$(ls) b.`cmd` 例:a=`date +%y-%m-%d`
test命令
a.判断文件类型、存在、时间比较、权限
b.比较字符串或证书
test -e /bin/ls:-e是否存在
与条件语句合用: if test -e /bin/ls; then echo "exist: /bin/ls"; fi if [ -e /bin/ls ]; then echo "exist: /bin/ls"; fi
shell中的循环
while循环
for循环
- 上节课思考题:
for f in `find . -name '*output*txt'` do newf=`echo $f | sed 's/.output//'`; mv $f $newf; done
- shell中变量的定义
注意变量两边不能有空格
- 复杂语句
- shell脚本(求和的例子)
#!/bin/bash
sum=0
for((i=1;i<101;i=i+1)); do
sum=$(($i+$sum))
done
echo $sum
- shell脚本的运行方式
1、bash x.sh
2、chmod +x x.sh
./x.sh
- “#!/bin/bash ”的作用
1、告诉shell文件类型,打开或解释或运行的方式
2、告诉shell用那种shell运行文件。
- shell中函数的定义和使用
$# -----参数的个数 $* -----字串 $0 -----第0个参数 $1 -----第1个参数 $@ -----数组 $? -----获取返回值
- 命令行参数
$nohup bash run0.sh &:后台运行run0.sh
run0.sh
run1.sh
run2.sh
run3.sh
2019.5.15 shell编程 (王中卿老师代课)
王中卿老师代课笔记
1. Shell脚本输出语句echo命令,运行方式bash hello.sh 或sh hello.sh 2. 变量: 命名,变量的引用方式,变量的赋值,删除变量,定义只读变量。 a) 环境变量PATH HOME等 b) 字符串:双引号 单引号 反引号的区别,vim中语法高亮的提示显示它们不同的作用。${# }获取字符串长度 反引号中放置命令 如expr 1 + 2 ,其中空格不可少。或者写成$((1+2))的形式 3. 数组 数组索引 数组中可存在不同类型的值 4. 运算符 5种运算符 5. Test 命令 6. 函数的定义和使用 a) 传递参数 b) 流程控制 7. 几个shell 脚本例子: 模拟用户登录,倒序输出数组,求1-10中的素数
2019.5.8 (第11周/共17周,6月19日最后一次课)
egrep命令
简单学习一下
正则表达式
man egrep,根据英文文档讲一遍
管道
cat main.txt main.c >x1 egrep 'stdout'>x2 wc -l x2 rm cat main.txt main.c | egrep 'stdout' | wc -l:和上面的操作一样 cat stdoutxxx main.txt main.c 2>&1 | egrep 'stdout' | wc -l:标准错误输出重定向 rm */*.output:把所有文件下*.output删除 cat */*.txt |egrep '^[0-9- ]+' -o |sort >y1 :-o只输出匹配的东西
myencrypt.c就可以作为例子
$help history |less 分屏显示
正则表达式
结合egrep命令
一、复习
- 正则表达式
- egrep命令:
1、egrep命令用于在文件内查找指定的字符串。egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep是用extended regular expression语法来解读的,而grep则用basic regular expression 语法解读,extended regular expression比basic regular expression的表达更规范。
2、grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
$egrep 'int' main.c $egrep -n 'int' (ctrl + d 输入结束) $egrep -n '[ijklm]nt' $egrep -n '[^0-9]nt':加^表示取反 $egrep -n '[0-9]nt' $egrep -n '.nt' $egrep -n 'a*bc' $egrep -n 'a*?bc' $egrep -n 'a?bc' $egrep -n '[0-9]*bc' $egrep -n 'abc|bcd' $egrep -n '(abc|bcd)[0-9]+' $egrep -n '^(abc|bcd)' $egrep -n '^(abc|bcd)$'
- 正则表达式 regular expression
正则表达式的定义:表达正则语言的一个式子;以一定规则写出来的一个字符串,作为一个抽象的模式,用以匹配一个、多个甚至无穷多个实际的字符串。
1、literal字面意思
2、[ ] 字符集 $egrep -n '[0-9]nt'
3、 . 任意一个字符,不能匹配\n\r
4、重复修饰符(贪心 greedy): * 表示前面的字符匹配0次到n次;? 表示可取0个/1个 ;+ 重复一次到无穷多次 ;{3} 重复3次;{3,5} 三次到五次 ;{3,} 三次到无穷
5、分组:() ;| 或
6、定位符:^表示行首,$表示行尾,单词的首/尾(自学)
通配符 * ?
正则表达式 .* .
2019.4.24
shell重定向
- 标准输入重定向 stdin--->file
- 标准输出重定向 stdout--->file
a->b b->c ... A->B ...
输入重定向:写一个简单的代码来解释(很多命令都是同时支持:a文件参数;b默认标准输入,如sort)
myencrypt.c
输出重定向:
$./myencrypt > yy.txt
只输出标准错误输出stderr:I am stderr
$./myencrypt >> yy.tx 追加
$./myencrypt > yy.tx 2>&1:标准错误的输出也写入了yy.txt中
stdin=0;stdout=1;stderr=2
2019.4.17
进程管理
- 黑板板书总结
- ps
runoob-ps:了解一下即可 $man ps 语法比较复杂,三种格式的参数option
- top:x M
shell中wildcard 通配符
- 黑板板书总结
- ?匹配任意一个字符; *匹配任意长度个任意字符;[abcd]匹配中括号中的某一个字符;[a-z]匹配一个范围
$ls /bin/?a??? $ls /bin/f* $ls /[cd]* :匹配中括号中的某一个字符开头的文件
- shell来处理的通配符
$ls home/*:相当于ls /home/zhenghua /home/yli /home/a.txt $ls -d /home/*:不显示文件夹内的东西 $cp *.txt xxx
find命令
$ find . -name '*xxx*' runoob-find $ man find可以学到很多东西,可以和 | xargs结合
2019.4.10
shell基础
- $ man bash (GNU Bourne-Again Shell, Free Software Foundation)
- 命令的执行过程
mv x.c xx.c
step1 -- 解析字符串
step2--分析命令的类型并执行
1、内嵌命令-函数;
2、外部命令-找到可执行文件-执行(a、系统调用的方法执行;b、开启一个新的进程,load到RAM中,参数设置,切换进程;bash输入/执行外部命令通过创建一个子进程来完成)
3、别名命令:找到原命令执行
- shell变量、环境变量
$ echo $PATH 查看路径 疑问:shell如何搜索外部命令?
内部命令和外部命令
- 命令的类型
1、外部命令:mv和less是外部命令(linux系统下可以找到这个命令对应的可执行文件就是外部命令,大部分放在bin目录下且大部分命令是外部命令);
2、别名类型的命令:ls is aliased to 'ls --color=none';
3、内嵌命令:命令的可执行命令在shell 里面;shell的类型有bash和dash等。
type:类型--- $type ls mv cd less查看命令的类型
alias: 取别名--- $alias lm='ls -a'
- 常见内部命令
cd history:显示之前输入的所有命令 $fc -s love=hate 232 替换232命令中的love为hate
- 查看内部命令帮助文档(man、help)
$man bash/builtins:查看内部命令
输入“/^\s+history”正则表达式搜索
$help ./: 查看.命令或者:命令
外部命令的执行过程
2019.4.3 (第6周/共17周,6月19日最后一次课)
vi的使用
- 三个模式之间转换
命令--->插入模式(i/I光标在行首/a/A光标在行尾/o光标在下一行/O上面再插入一行,光标在下一行) 插入模式--->命令模式下(ESC键,u撤销,x删除一个字符,r替换,yy复制一行,p粘贴,dd删除一行,3dd删除三行:set nu 显示行号;^光标到行首,$光标到行尾,G光标到最后一行,:5直接跑到第五行,3G跑到第三行) 命令--->视图模式(v) 按字符选择 命令--->视图行模式(V) 按行选择 命令--->按列选择(ctrl+v) 命令--->末行模式(/搜索 n正向找,N反着找; ?反向搜索;正则表达式查找/o[uv]---找到所有含有ou或者ov的字符;“:!date”可查看时间;“:r!date”将命令执行的结果保存在当前文本中;“:n1,n2s/word1/word2/g n1和n2为数字,在第n1行和n2行之间寻找word字符串,并将该字符串替换为word2 :1,$s/word1/word2/g 从第一行到最后一行查找字符串word1字符串,并将字符串word1替换为word2 :1,$s/word1/word2/gc 从第一行到最后一行查找字符串word1,并将字符串word1替换为word2,在替换之前提示用户确认是否替换(confirm)”替换) vi filename---进入命令模式---输入“i/insert”---进入插入模式----按“ESC”---进入命令模式---“:wq”---保存退出
- 打开多个文件
命令模式“:sp”利用“ctrl +w+w”进行切换
中枢,中轴
c语言命令行参数的实现
#include<stdio.h>
int main(int argc, char *argv[]) {
int i = 0; for (; i < argc; ++i) { fprintf(stdout, "%d: %s\n", i, argv[i]); } fflush(stdout); char c = fgetc(stdin); while (c != EOF) { if (c >= 'a' && c <= 'z') { c = c + 'A' - 'a'; } fputc(c, stdout); c = fgetc(stdin); } fflush(stdout); fprintf(stderr, "I am stderr\n"); fflush(stderr);
}
argc:参数的个数 argv:字符串数组;argv[0]:命令本身
$gcc main.c -o hi
$./hi hello dads dff 0:./hi 1:hello 2: dads 3:dff I am stderr
shell
- 理解shell是什么
- 了解shell是怎么工作的
- 黑板板书总结
2019.3.27
- 目录的rwx
r:打开目录,list目录包含的文件 w:目录中增加或删除文件 x:进入目录,作为当前工作目录。即使没有r权限,也可以打开已有文件(前提是知道文件名,可否修改?)。
- 文件操作命令
which mkdir 可执行文件的绝对路径 whereis mkdir(查看命令mkdir所在的位置:1、命令的可执行文件位置;2、命令的帮助文档) man 2 mkdir (系统调用) man 1 mkdir (命令) man 3 printf (库调用) printf "%d%s\n" 10, "hi" mkdir (-p) mv -f (--force: do not prompt before overwriting) -i (--interactive: opposite to -f) -n (--no-clobber: do not overwite an existing file) [-T] (--no-target-directory: treat DEST as a normal file) cp -t (target dir) -R/-r (--recursive: copy directories recursively) rmdir rm -r (--recursive) -f (--force) -i (--interactive=always) -I (--interactive=once)
- ctrl+c ctrl+d ctrl+a ctrl+e ctrl+r
- 文本文件查看命令
cat 拼接(concatenate) (不跟参数的时候:默认将标准输入的内容标准输出),
tac
tail -n 3 a.txt
tail -f a.txt监控文件
head -n 30 a.txt
more
less (less is more):分屏/页 显示;
空格 翻屏;上下箭头 按行移动;
ctrl + f/b (^F或^B): forward/backward翻屏
输入/字符串或者正则表达式 进行搜索,按n(next下一个)继续搜索,按N反向继续搜索
G (shift+g):末行;gg:首行
- 文件编辑器
1、vi --- vim:打开文件
命令模式:按“Esc”回到命令模式;“h”“←”左;“l”“→”右;
末行模式:在命令模式下,输入“:”进入末行模式
编辑模式/插入模式:命令模式下,按"i/I/o/O/a/A"进入编辑模式;
- 遗留问题:
为什么which cd,没有显示结果?
2019.3.20
- ls命令:深入学习命令的使用
ls -l /home:长格式
第一个字符d表示文件夹,-表示文件,接下来的连续三个owner的权限,然后三个是group的权限;最后三个是other的权限;
24:硬链接数
zhenghua:owner
zhenghua:group
4090:表示文件所占的物理空间,表示的是该目录自身所占内存的大小,不是该目录下所有文件相加所占的空间。
mar 26 10:31 :时间信息
zhenghua :文件的名字
ls -a /home:
ls -dl /home: 如果参数是目录,不是看包含的内容,而是看目录本身的信息
ls -l -d /home 同上
ls -lc /home: 【显示ctime】
ls -r,--reverse /home:逆序
ls -R /home:递归显示
ls --color=nevel|auto|never /home:
ls -lh:大小信息
ls -t /home 根据时间排序
ls -al:
ls --full-time:完整时间信息
ls --hide=a*
讲了一点通配符和RE的对应关系: *=.* [A-Z]=[A-Z]
- stat命令
权限、拥有者、inode、block等信息
文件的三个时间信息:
atime: accesss:读文件
mtime:modify:修改文件内容(文件加长、vim下w、文件长度不变的修改)
ctime:change:修改文件内容、chown、chmod 【man ls -c中的解释:修改文件状态status信息的最新时间】
- man
man 3 printf:(synopsis 用法; description 描述)看在线文档
man ls :(LS(1): Name ; synopsis: ls [option]... [file]...可以跟0个到n个选项或者文件)
man pwd:
option:可以是长选项(--all)或者是短选项(-a),ls --all和ls -a实现的效果是一样的。
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]
- 遗留问题
对于目录而言,atime mtime ctime分别什么意思
对于目录而言,rwx分别表示什么意思
ls -l 显示的是哪个时间?atime?
ls -t 根据什么时间排序?atime?
2019.3.13
Linux的文件目录结构 (续)
- root目录及超级用户
$ su # cd :切换到root的家目录下(/root) # exit :回到普通用户下 bin--可执行文件,二进制; etc--配置文件;boot--操作系统启动相关的代码;home--家目录,一个用户自己的目录,通常情况下每个普通用户都在home下面有一个目录,超级管理员在/root下
- 文件名规则
linux下文件名大小写区分,windows下不区分
linux下文件名最长为256字节,尽量不要用中文
linux下几乎所有的符号都可以作为文件名的一部分,只有“/”不能作为文件名的一部分出现(斜杠“/”:slash;反斜杠“\”:backslash)
特殊字符如空格、括号等需要用双引号或反斜杠\来书写
隐藏文件:文件名以.开头。ls 看不到隐藏文件;ls -a 可看到隐藏文件夹。
文件夹(目录)也是一种文件
- 绝对路径和相对路径
“.”表示当前目录 “..”表示上一级目录 绝对路径:从根目录开始到目标文件的路径 相对路径:从当前目录(不是从根目录开始)到目标文件的路径
文字终端
- 图形终端下的文字终端Terminal
XWindow下打开了Terminal应用程序(快捷键:ctrl+alt+t)【航站楼】
- 输入一些简单命令
ls $ cd :切换目录(change directory)。 $ cd ~ :回到当前用户的根目录下
date, cal, calendar, bc, echo
uptime:系统启动的时间 hostname:机器名 who:显示当前登录的用户,以及用户从哪里登录进来的 users:目前有几个用户登录了这个系统 w:和who类似,同时可以显示每个用户在干啥 whoami:写程序的时候会用到
$ uname -a :命令是uname;-a是选项(显示全部的信息);可以查看内核(kernel)版本号等。 $ pwd:显示当前工作目录(print working directory)
- 深入理解命令
命令的结构:命令(command) 选项(option) 参数(argument)
例子:cd:后面不加参数时,默认切换到当前用户的家目录下。
1、命令:一个操作
2、选项:操作方式
3、参数:操作对象
ls -l 命令详细解释。 思考问题:目录的硬链接数(类似于Python中一个对象绑定的名字数)如何计算?
2019.3.6
操作系统的作用
- 管理硬件资源
- 为程序员提供API
- 为普通用户提供界面(GUI、CLI)
Linux和Windows的一些区别
- 图形界面
菜单栏隐藏在最上面 默认有四个工作区workplace ctrl+alt+上下左右键:可以在四个工作区之间切换 ctrl+shift+alt+上下左右键:把当前焦点窗口拖到另外一个工作区 有自己的文本编辑器 熟悉一下资源管理器
- Linux的文件目录结构
- 标准化(windows下是乱七八糟的)
- bin(二进制);dev(设备);boot(启动);home(所有用户的家目录)
- 只有一个根目录 /(windows下每个分区有一个目录)
- 家目录(Home Folder)
- 每个用户都有一个家目录,存放自己的私有数据
- 用户的家目录通常在/home/用户名
- 除非别人允许,用户A无法访问用户B的家目录(权限的概念)
- 权限管理使得Linux支持真正的多用户
讲课期间用到的几个命令
- cd(change command)、ls (list files)
杂项
- 文字界面下的提示符:prompt symbol,通常包含的信息:用户名@机器名: 当前工作目录 $
2019.2.27
- 介绍课程基本情况,个人介绍,对读书、独立思考的看法
- 讨论了操作系统的概念、作用,相当于回忆操作系统理论课的内容
- /dev/stdin (stdout, stderr),为什么要区分标准输出和标准错误输出?
- g++ gcc cout cerr printf fprintf