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