zoukankan      html  css  js  c++  java
  • 202020211 20209327 《Linux内核原理与分析》第一周作业

    Linux基础入门

    目录

    1、 收获

    • 新建一个或多个文件
    • 进行用户管理
    • 文件权限
    • 文件打包与解压缩
    • 计划工具
    • 文本处理
    • 正则表达式

    2、 挑战任务

    • 寻找文件
    • 备份文件
    • 历史命令
    • 数据提取

    3、 问题

    • 关于邮箱匹配的正则表达式问题
    • 在进行update时出现的问题

    4、 参考链接

    一、收获

    1. 新建一个或多个文件

    # 新建文件asd.txt和fgh.txt
    touch asd.txt fgh.txt
    
    # 使用通配符在当前目录下查找所有txt类型的文件
    ls *.txt
    
    # 使用通配符一次性创建多个同类型文件
    touch test-{1..10}.txt
    
    # 创建多级目录
    mkdir -p father/son/grandson
    
    # 复制文件到指定目录
    cp test father/son/grandson
    
    # 复制目录到指定目录
    cp -r father family
    
    # 强制删除文件
    rm -f test
    
    # 强制删除目录
    rm -rf family
    

    效果如图:

    2. 进行用户管理

    # 查询当前登录的用户名、伪终端序号及启动时间
    who am i
    
    # 添加新用户
    sudo adduser lilei
    
    # 切换至新用户
    su -l lilei
    
    # 查找所有用户组并过滤出shiyanlou组
    # cat查找指定文件/etc/group并打印至终端
    # 使用grep过滤
    cat /etc/group | grep -E "shiyanlou"
    
    # 删除用户及其工作目录
    sudo deluser lilei --remove-home
    

    效果如图:

    3. 文件权限

    # 赋予iphone11文件600权限
    chmod 600 iphone11
    

    效果如图:

    4. 文件打包与解压缩

    # 将指定目录打包成一个压缩文件
    # -r: 递归打包包含子目录的全部内容
    # -q: 不向屏幕输出信息
    # -o: 输出文件名
    # -e: 创建加密压缩包
    zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
    # 或者使用tar进行压缩
    # -f: 指定创建的文件名
    tar -P -cf shiyanlou.tar /home/shiyanlou/Desktop
    
    # 查看打包后的文件大小
    du -h shiyanlou.zip
    
    # 查看打包后的文件类型
    file shiyanlou.zip
    
    # 将文件解压至指定目录
    unzip -q shiyanlou.zip -d ziptest
    # 或者使用tar解压一个文件至指定路径的已存在目录中
    tar -xf shiyanlou.tar -C tardir
    

    5. 计划工具

    # 利用crontab设置周期性被执行的指令
    # 启动crontab
    sudo cron -f &
    
    # 为当前用户即shiyanlou添加一个crontab
    crontab -e
    

    crontab的格式如图:

    6. 文本处理

    # tr -d: 删除 "hello shiyanlou" 中所有的'o','l','h'
    echo 'hello shiyanlou' | tr -d 'olh'
    
    # tr -s: 将"hello" 中的ll,去重为一个l
    echo 'hello' | tr -s 'l'
    
    # 将输入文本,全部转换为大写或小写输出
    echo 'input some text here' | tr '[a-z]' '[A-Z]
    
    # paste -d: 将3个文件以分隔符':'合并
    paste -d ':' file1 file2 file3
    
    # paste -s: 将三个文件合并,每个文件为一行
    paste -s file1 file2 file3
    

    7. 正则表达式

    # 查找/etc/group文件中以shiyanlou为开头的行
    grep '^shiyanlou' /etc/group
    
    # 匹配所有小写字母
    grep '[a-z]'
    
    # 匹配所有数字
    grep '[0-9]'
    
    # 排除字符
    # ^放到中括号内为排除字符,否则表示行首
    grep '[^o]'
    

    二、挑战任务

    1. 寻找文件

    目标:找到/etc/目录下的sources.list文件,把文件所有者改为shiyanlou,并将权限修改为仅自己可读可写

    # 首先安装locate
    sudo apt-get update
    sudo apt-get install locate
    sudo updatedb
    
    # 利用locate在/etc目录下寻找后缀为.list的文件
    locate /etc/\*.list
    

    结果如图:

    可以发现,sources.list文件路径是/etc/apt/sources.list

    # 将文件所有者改为shiyanlou
    sudo chown shiyanlou /etc/apt/sources.list
    
    # 将权限改为仅有shiyanlou可读可写
    sudo chmod 600 /etc/apt/sources.list
    

    2. 备份文件

    目标:为shiyanlou用户添加计划任务,每天凌晨3点的时候定时备份alternatives.log到/home/shiyanlou/tmp/目录,命名格式为年-月-日

    # 利用crontab添加任务计划
    # 启动crontab
    sudo cron -f &
    
    # 为当前用户即shiyanlou添加一个crontab
    crontab -e
    
    # 利用vim添加两条计划
    # 计划1:每天凌晨3点删除/home/shiyanlou/tmp目录下的所有旧日志
    0 3 * * * sudo rm /home/shiyanlou/tmp/*
    
    # 计划2:每天凌晨3点将新日志alternatives.log拷贝到/home/shiyanlou/tmp/目录,并以年-月-日命名
    0 3 * * * sudo cp /var/log/alternatives.log /home/shiyanlou/tmp/$(date +\%Y-\%m-\%d)
    

    3. 历史命令

    目标:在data1文件中找到出现频率前3的命令并将结果保存在/home/shiyanlou/result

    # 首先查看一下data1文件中保存的命令格式
    cat data1
    

    可以发现每行的命令都是从第8个字符开始一直到行尾,因此可以使用cut命令将data1中的命令提取出来

    # cut -c: 从指定的范围中提取字符
    # cut 8-: 提取范围从第8个字符到行尾
    cat data1 | cut -c 8-
    

    可以看到,每条命令均已被提取出来,还需要统计其出现的频率

    # 排序并将相同命令累加起来
    # sort: 排序
    # uniq -c: 显示唯一的行,并在每行行首加上本行在文件中出现的次数
    cat data1 | cut -c 8- | sort | uniq -c
    

    显示前10条命令,可以发现每行的第一个字段为命令出现的次数

    # 按照第一个字段对数值进行从大到小的排序,取前3
    # sort -k1: 以第一个区间进行排序
    # sort -n: 按照数值大小排序
    # sort -r: 降序排序
    # head -3: 取前3条记录
    cat data1 | cut -c 8- | sort | uniq -c | sort -k1 -rn | head -3
    

    最后,将这3条记录重定向至/home/shiyanlou/result

    cat data1 | cut -c 8- | sort | uniq -c | sort -k1 -rn | head -3 > /home/shiyanlou/result
    

    4. 数据提取

    目标:在data2文件中匹配数字开头的行并写入/home/shiyanlou/num中,在data2中匹配出正确格式的邮箱并写入/home/shiyanlou/mail中

    # 首先查看data2文件中的内容
    cat data2
    

    发现带@符号的邮箱格式均正确,可以在匹配邮箱格式时简化问题

    # 匹配数字开头的行并写入/home/shiyanlou/num中
    cat data2 | grep '^[0-9]' > /home/shiyanlou/num
    
    # 匹配出正确格式的邮箱并写入/home/shiyanlou/mail中
    cat data2 | grep '.@' > /home/shiyanlou/mail
    

    结果如图:

    此处的邮箱匹配并不严谨,将会在问题部分提出

    三、问题

    1. 关于邮箱匹配的正则表达式问题

    邮箱的基本格式为:NameA@NameB

    NameA可以由以下字符组成:

    • 小写字母
    • 大写字母
    • 数字
    • 下划线

    NameB由字母数字以及位于其中间的字符·组成

    因此,邮箱匹配可以表示为'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$'

    更加严谨的、符合RFC5322标准的通用正则表达式为:

    (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:/.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[/x01-/x08/x0b/x0c/x0e-/x1f/x21/x23-/x5b/x5d-/x7f]|//[/x01-/x09/x0b/x0c/x0e-/x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|/[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[/x01-/x08/x0b/x0c/x0e-/x1f/x21-/x5a/x53-/x7f]|//[/x01-/x09/x0b/x0c/x0e-/x7f])+)/])
    

    2. 在进行update时出现的问题

    在Ubuntu16.04环境下执行sudo apt-get update时出现如下问题:

    执行sudo rm /var/lib/apt/lists/lock后,问题解决

    问题的原因在于其它的程序,如系统的自动更新,正在使用apt-get进程,所以解决方法也就是将这一进程关闭。

    四、参考链接

  • 相关阅读:
    收藏转载:一些视频流地址
    转载收藏:Android 输入法表情上传服务器
    Android N 的开机启动流程概述
    列举至少3种Support包中提供的布局或工具
    代码混淆定义
    应用内存优化主要思路
    锁屏的一些动画
    毛玻璃效果
    关于宏定义
    openresty性能测试报告分析
  • 原文地址:https://www.cnblogs.com/TracerElena/p/13797217.html
Copyright © 2011-2022 走看看