linux实验笔记

lab2

  1. 编写 shell 脚本 p1.sh,完成向用户输出“Hello!”的问候语。并根据实验的时间,分别给出:“上午好!”或者“下午好!”或者“晚上好!”的问候。 提示:使用 date 取得当前的时间,并对 date 进行格式化取得当前时间中的小时, 根据当前的小时来判断上午、下午还是晚上。1-11 点上午,12-18 点下午,19-24 点晚上。
    在这里插入图片描述
  • 等号两边不能有空格
  • 与数字比较时数字也要加" "
  • 记得fi
  1. 编程完成 shell 脚本 p2.sh:如果存在 p1.sh 文件,则输出信息:p1.sh 文件已 经存在,并询问是否允许?如果用户回答:要运行,那么给出运行结果;如回到 不要运行,则退出程序。如果 p1.sh 不存在,则提示用户先创建文件并退出。
    在这里插入图片描述

  2. 编写 shell 脚本,按要求打印输出乘法口诀表,输出用两种方式完成:一种是 直接在控制台输出;另一种是输出至文件 result.txt。
    1x1=1
    1x2=2 2x2=4
    1x3=3 2x3=6 3x3=9
    1x4=4 2x4=8 3x4=12 4x4=16
    1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
    1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
    1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
    1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
    1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
    在这里插入图片描述

  • 输出重定向就是>> result.txt
  • 注意需要用到\c实现不换行以及echo换行

lab3

  1. 生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
    猜小了或猜大了,直至用户猜对脚本结束。(提示:RANDOM 为系统自带的系统变量,
    值为 0‐32767 的随机数,使用取余算法将随机数变为 1‐100 的随机数)
    在这里插入图片描述
  • 注意要再次读取输入
  1. 使用 shell 脚本编写一函数 add 求两个数的和,要求这两个数用位置参数传入,最后
    输出结果。
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/b09a9a11623b44a6861af7eb876bef34.png]
  • 注意要在sh文件末尾调用函数并传入参数
  1. 编写一个 shell 脚本,实现如下功能:把第二个位置参数及其以后的各个参数指定的
    文件复制到第一个位置参数指定的目录中。
    在这里插入图片描述
  • 用到了shift。位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。
  • 用到了“$@”获取所有输入参数
  1. 编写脚本模拟实现交互式文件目录操作,实现命令包括:dir-列出当前目录下的文件和子目录;cd-切换目录;wcd-显示当前工作目录;create-创建一个文件;delete-删 除一个文件;rename-重命名文件;newdir-创建目录;deldir-删除目录;exit-退出系统。(提示:可使用 select 命令实现交互操作,题目中要求实现的命令可用 Linux shell中相关的命令模拟实现,如 dir 可用使用 ls 命令实现)。
    在这里插入图片描述
    在这里插入图片描述
  • 读取所需要的参数即可

lab4

awk教程

awk入门教程-阮一峰

  • 基本用法
    在这里插入图片描述
  • 变量
    在这里插入图片描述
    • NR 当前处理行
    • FILENAME:当前文件名
    • FS:字段分隔符,默认是空格和制表符。
    • RS:行分隔符,用于分割每一行,默认是换行符。
    • OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
    • ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
    • OFMT:数字输出的格式,默认为%.6g。
  • 函数
    在这里插入图片描述
    • tolower():字符转为小写。
    • length():返回字符串长度。
    • substr():返回子字符串。
    • sin():正弦。
    • cos():余弦。
    • sqrt():平方根。
    • rand():随机数。
  • 条件
    在这里插入图片描述
  • if语句
    在这里插入图片描述
  1. 针对以下文本内容的操作,请写出相关的 awk 命令
    Beth 4.00 0
    Dan 3.75 0
    Kathy 4.00 10
    Mark 5.00 20
    Mary 5.50 22
    Susie 4.25 18
    (1) 当第 3 列大于 0 时,输出文本中对应行的第 1 列和第 2 列与第 3 列之积
    在这里插入图片描述
  • 将数据存入data.txt 用输入重定向读取

(2) 统计第 3 列大于 15 的行数,记为 X,并以下列格式输出 “X
employees worked more than 15 hours.”
在这里插入图片描述

  • 直接作为awk的参数传入data.txt也行
  • 创建了变量X 并设置了X增长的条件
  • BEGIN{} (执行前运行) {}(执行中运行) END{}(执行后运行) 是awk常用的三个环节

(3) 使用特殊变量 NR、NF,统计输出整个文本的行数、单词数和字符数

awk '{words=words+NF;chars=chars+length($0)} END{print "行数:",NR,"单词数:",words,"字符数目:",chars}' data.txt

在这里插入图片描述

  • 变量初始化为0
  1. 使用 awk 统计/etc/passwd 文件中,
    (1) 登陆 shell 为“/sbin/nologin”的用户个数
 cat /etc/passwd | awk -v i=0  -F ':' '{if ($NF=="/sbin/nologin") i=i+1} END{print i}'
  • $NF就是一行数据最后一列的那个值
  • 注意-F 和-v之间要用空格分开 不然会有错
cat /etc/passwd | awk -F ':'-vi=0 '{if ($NF=="/sbin/nologin")i=i+1}END{print i}'
#wrong
cat /etc/passwd | awk -F ':' -vi=0 '{if ($NF=="/sbin/nologin")i=i+1}END{print i}'
# true

(2) 用户名包含’g’的用户,打印出用户名和 UID

$ cat /etc/passwd | awk -F : '{print $1,$3}'|awk -F : '/g/{print $1$2}'
  • 先将用户名和UID提取出来,再对用户名做正则匹配
  1. 使用 awk 统计当前文件夹下,文件总的大小
ls -l | awk -vdata=0 '{data+=$5}END{print"total size:",data,"Bytes"}'
  • 将ls的输出用管道输入awk

sed菜鸟教程
Linux sed 命令是利用脚本来处理文本文件,主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或–expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或–file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或–help 显示帮助。
-n或–quiet或–silent 仅显示script处理后的结果。
-V或–version 显示版本信息。
动作说明:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

  1. 针对下列文本内容,使用 sed 命令完成以下操作
    4000001476
    4000000041
    4000002754
    4000000944
    4000002549
    (1) 将文本内容中每行中的 400 替换为 800 显示,即输出如下:
    8000001476
    8000000041
    8000002754
    8000000944
    8000002549
 cat data.txt | sed 's/400/800/g'
  • g 标识符表示全局查找替换
  • s 替换
    (2) 使用正则表达式,将文本内容中每行的前三个数字,以小括号括起来
    显示, 即输出如下:
    (400)0001476
    (400)0000041
    (400)0002754
    (400)0000944
    (400)0002549
cat data.txt | sed -r  's/(^[0-9]{3})/(\1)/g'
  • 如果没有-r参数,除非每个括号都使用\字符进行转义,否则反向引用(如\1)将不起作用。
    对于-r,参数反向引用(如\1)将不起作用,除非圆括号没有转义。
  • \1表示被前面第一个括号框住的部分匹配的内容
    (3) 使用正则表达式,将文本内容中每行的中间三个数字前后增加“-”
    符号, 即输出如下:
    400-000-1476
    400-000-0041
    400-000-2754
    400-000-0944
    400-000-2549
cat data.txt | sed -r  's/(^[0-9]{3})([0-9]{3})/\1-\2-/g'
  • 需要匹配两块
    (4)打印输出第 3 行到最后一行的内容,即输出:
    4000002754
    4000000944
    4000002549
cat data.txt | sed -n  '3,$p'
  • $ 表示最后一行
  • p选择性输出
  1. 下列命令的输出结果是什么?
    echo “123 abc” | sed –r 's/[0-9]+/& &/’
    123 123 abc
    (& 保存查找串以便在替换串中引用)





在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值