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进程,所以解决方法也就是将这一进程关闭。

四、参考链接

原文地址:https://www.cnblogs.com/TracerElena/p/13797217.html