目录
3.8 | (重点) -----> 管道符(用来连接多个命令)
前言
不知不觉已经是在这学习的第四个周末了,这周因为中秋假期的原因,周一没上课,这四天的课主要讲了Linux命令的拓展、shell编程和Makefile编程:其中linux命令主要是讲了网络配置、软件安装,围绕linux的文件讲了一些常用的指令;对于shell编程,和C语言类似,讲了变量、数组、算数运算、分支结构、循环结构和函数;对于最后的Makefile编程,讲了规则构成、变量的使用、Makefile内置的函数和简单的Makefile文件的编写。
这周有点浑浑噩噩,一方面假期结束没调整好状态,另一方面从C语言转到其他方面的学习,有很多需要理解的地方,尤其是刚开始没太跟上老师的思路和节奏,所以这次回顾总结会全盘把老师讲的东西过一遍。
同样,写此文章,是想以这种碎碎念的方式回顾重点、重复盲点、加深印象,复习、总结和反思本周的学习,仅供后期自己回顾使用。知识体系不完善,内容也不详细,仅供笔者复习使用。如果是有需要笔记,或者对这方面感兴趣,可以私信我,发你完整的知识体系和详细内容的笔记。如有任何错误请多指正,也欢迎友好交流,定会虚心听取大佬的宝贵意见!
周二
Linux命令拓展
1 软件安装相关的命令
1.1 离线安装命令--dpkg
1. linux安装软件包的后缀
ubuntu ----> .deb
redhat ----> .rpm
2. 离线软件包命名的方式
sl_ 3.03-17build2 _amd64 .deb
| | | |
软件的名称 版本号 架构 软件包的后缀
amd64 ----> x64架构的软件包,64位系统
i386 ----> x86架构的软件包,32位系统
3. 安装软件的命令(重点)
sudo dpkg -i 软件安装包的名字
4. 卸载软件的命令(重点)
sudo dpkg -r 软件的名字
5. 查看软件安装的列表信息
sudo dpkg -l 软件的名字
6. 查看软件的安装路径
sudo dpkg -L 软件的名字
7. 完全卸载软件
sudo dpkg -P 软件的名字
1.2 在线安装命令--apt-get
在线安装软件需要配置ubuntu系统的源,在线安装软件时从哪个服务器中下载安装软件。
因此需要给ubuntu系统指定源,国内常用的软件源有:清华源, 阿里源,163源。
清华源的网址:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/
1、在线安装
sudo apt-get install 软件名
eg:
sudo apt-get install oneko //安装追⿏标的⼩猫
sudo apt-get install frozen-bubble //安装泡泡⻰
sudo apt-get install cmatrix //代码⾬
sudo apt-get install bastet //俄罗斯⽅块
运行软件,
oneko ----> 在前台运行
oneko & ----> 进程在后台运行
2、下载软件包
sudo apt-get download 软件名
eg:
sudo apt-get download oneko
3、卸载软件
sudo apt-get remove 软件名
sudo apt-get autoremove 软件名 ----> 卸载的更加干净
eg:
sudo apt-get remove oneko
4、下载软件的源码
sudo apt-get source 软件名
eg:
linux@ubuntu:~$ sudo apt-get source oneko
出现以下错误:
Reading package lists... Done
E: You must put some 'deb-src' URIs in your sources.list
解决办法:修改/etc/apt/sources.list文件将deb-src的网址取消注释,其他全部注释。
需要重新执行sudo apt-get update更新源,再次执行下载的命令。
注:测试完成之后,将/etc/apt/sources.list修改为默认的状态。再将deb-src的网址注释掉
2. 归档和拆包的命令(tar)(重点)
1. 参数
-c : 归档
-x : 拆包
-f : 指定归档和拆包的文件的名字,必须放到所有参数的最后边
-v : 显示归档和拆包的过程的详细信息
-j : 使用bzip2的压缩格式进行压缩
-J : 使用xz的压缩格式进行压缩
-z : 使用gzip的压缩格式进行压缩
2. 归档的命令-->单纯的进行归档并没有压缩
tar -cvf 归档之后的文件名.tar 要归档的文件名/文件夹
3. 拆包的命令
tar -xvf 要拆包的文件名.tar
4. 归档的同时进行压缩
tar -jvcf 归档之后的文件名.tar.bz2 要归档的文件名/文件夹
tar -jxvf 要拆包的文件名.tar.bz2
tar -Jvcf 归档之后的文件名.tar.xz 要归档的文件名/文件夹
tar -Jxvf 要拆包的文件名.tar.xz
tar -zvcf 归档之后的文件名.tar.gz 要归档的文件名/文件夹
tar -zxvf 要拆包的文件名.tar.gz
5. 万能的拆包并解压缩的命令
tar -vxf 要拆包的文件名.tar.xx
xx 表示bz2,gz, xz
3. 文件操作相关的命令
3.1 cat(重点)-----> 回显文件内容到终端
用法:
cat 文件名 ----> 回显文件内容到终端
cat -n 文件名 ----> 回显文件内容到终端, 显示行号
cat 文件名1 文件名2 > 文件名3 ---> 将文件名1和文件名2中的内容重定向到文件名3中
(实现多个文件的拼接)
> : 重定向
案例
linux@ubuntu:day01$ cat hello.c
#include <stdio.h>
linux@ubuntu:day01$ cat world.c
int main(int argc, const char *argv[])
{
return 0;
}
linux@ubuntu:day01$ cat hello.c world.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
return 0;
}
linux@ubuntu:day01$ cat hello.c world.c > helloworld.c
linux@ubuntu:day01$ cat helloworld.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
return 0;
}
3.2 head ----> 从文件头开始回显
用法:
head 文件名 ----> 默认回显文件的前10行,如果不够就全部回显
head -5 文件名 -----> 显示前五行
3.3 tail ----> 从文件的末尾开始回显
用法:
tail 文件名 ----> 默认回显文件末尾的后10行,如果不够就全部回显
tail -5 文件名 -----> 显示文件末尾的后五行
3.4 重定向符(重点) ----> ‘ > 和 >> ’
重定向:将命令的执行的结果重定向到其他文件中,不在终端回显。
shell命令 > 文件 : 将命令的结果重定向到“文件”中,如果文件不存在则创建文件,
如果文件存在,并且文件中有内容,则先将内容清空在进行重定向。
shell命令 >> 文件 : 将命令的结果重定向到“文件”中,如果文件不存在则创建文件,
如果文件存在,并且文件中有内容,从文件中的内容末尾开始追加内容。
3.5 find(重点) ----> 查到文件的命令
用法:
find 路径 -name 要查找的文件名 ----> 从“路径”下查找“要查找的文件名”
注:文件名中可以使用通配符 *(多个字符) ?(单个字符)
eg:
find . -name hello.c ---> 在当前目录查找hello.c
find /etc -name passwd ----> 在/etc目录下查找passwd文件
3.6 file(重点) ---> 查看文件属性的信息
用法:
file 文件名
eg:
linux@ubuntu:day02$ gcc hello.c -o hello
linux@ubuntu:day02$ file hello
hello:
ELF ----> 可执行文件的格式
64-bit LSB shared object, ----> 64位可执行程序 小端对齐
x86-64, ----> 可执行程序的架构
version 1 (SYSV),
dynamically linked, ----> 动态链接
interpreter /lib64/ld-linux-x86-64.so.2, ---> 动态库
BuildID[sha1]=aecfe163e5e53998d09c4ec5becb342c6d672a73,
for GNU/Linux 3.2.0,
not stripped ----> 没有压缩
3.7 grep(重点) ----> 从文件中搜索字符串
用法:
grep -参数 "要搜索的字符串" 文件名/目录
参数:
-n ----> 显示搜索内容的行号
-R ----> 递归搜索,如果是一个目录,必须添加-R参数
-i ----> 查找时不区分大小写
-w ----> 按照单词进行查找
eg:
grep -n "main" ./helloworld.c ---> 从helloworld.c文件中查找main字符串
grep -nR "main" ./ ---> 从当前目录下所有的文件中递归查找main字符串
grep -n "linux" /etc/passwd ---> 从文件中查找"linux"字符串
grep -n "^linux" /etc/passwd ---> 从文件中查找开头为"linux"字符串
grep -n "bash$" /etc/passwd ---> 从文件中查找结尾为"bash"字符串
grep -n "^bash$" /etc/passwd --->
从文件中查找开头为"bash"字符串,结尾也为"bash"字符串
grep -ni "MAIN" ./helloworld.c ---> 从helloworld.c文件中查找MAIN字符串,不区分大小写
grep -nw "hello" ./helloworld.c ---> 从helloworld.c文件中查找hello字符串,按照单词查找
3.8 | (重点) -----> 管道符(用来连接多个命令)
用法:
shell命令1 | shell命令2 | shell命令3 | ......
功能:将前一个命令的结果作为后一个命令的输入
eg :
查找当前目录下的hello.c文件:
ls | grep "hello.c" ----> 从当前目录下查找是否存在hello.c文件
练习题
1> passwd文件中内容的解析(/etc/passwd)
linux : x : 1000 : 1000:linux,,,:/home/linux:/bin/bash
| | | | | | |
用户名 密码 用户ID 组ID 描述信息 家目录 使用bash解析终端的命令
2> 使用管道符的方式提取linux用户所在的行的信息
grep "^linux" /etc/passwd -n
cat /etc/passwd | grep "^linux"
cat -n /etc/passwd | grep "linux"
head -46 /etc/passwd | tail -1
3.9 echo ----> 打印的命令
用法:
echo "字符串"
echo 字符串
echo '字符串' ----> 回显字符串到终端
echo ${shell变量的名字}
echo $shell变量的名字 ----> 回显变量的值到终端
linux@ubuntu:day01$ echo hello world
hello world
linux@ubuntu:day01$ echo "hello world"
hello world
linux@ubuntu:day01$ echo 'hello world' ----> 输出字符串
hello world
linux@ubuntu:day01$ name=zhoukai ----> 定义变量,等号两边不允许有空格,变量的值是一个字符串,
可以加'', 可以加"", 可以什么都不加
linux@ubuntu:day01$ echo $name
zhoukai
linux@ubuntu:day01$ echo ${name} ----> 输出变量的值
zhoukai
3.10 read ----> 读数据到变量中
用法:
read shell变量名 ---> 将终端输入的输入读到变量中
read -p "提示字符串" 变量名 ---> 先打印一个提示符,将提示符后边输入的内容读到变量中
eg:
linux@ubuntu:day01$ read name
zhoukai2
linux@ubuntu:day01$ echo $name
zhoukai2
linux@ubuntu:day01$ read -p "please input your name > " name
please input your name > zhoukai3
linux@ubuntu:day01$ echo $name
zhoukai3
linux@ubuntu:day01$ read -p "please input your name, age > " name age
please input your name, age > zhoukai 18
linux@ubuntu:day01$ echo $name
zhoukai
linux@ubuntu:day01$ echo $age
18
linux@ubuntu:day01$ echo $name $age
zhoukai 18
3.11 cut ---> 字符串剪切的命令
用法:
cut -d "分隔符" -f 截取的域 要截取的文件名及路径
案例:
grep "^linux" /etc/passwd > ./passwd
linux@ubuntu:day02$ cat passwd
linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
域 1 2 3 4 5 6 7
linux@ubuntu:day02$ cut -d ":" -f 6 ./passwd ---> 截取第6部分
/home/linux
linux@ubuntu:day02$ cut -d ":" -f 1,6 ./passwd ---> 截取第1,6部分
linux:/home/linux
linux@ubuntu:day02$ cut -d ":" -f 3-4,6 ./passwd ---> 截取第3to4,6部分
1000:1000:/home/linux
linux@ubuntu:day02$ cut -d ":" -f 3-6 ./passwd ---> 截取第3to6部分
1000:1000:linux,,,:/home/linux
案例题:将/etc/passwd文件中linux用户的对应家目录字符串截取出来(grep | cut)
grep "^linux" -n /etc/passwd | cut -d ":" -f 7
| | | ---> 第七部分
| |
| |---> 冒号分隔
|
|
46:linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
域 1 2 3 4 5 6 7 8
----------------------------------------------------------------
grep "^linux" /etc/passwd | cut -d ":" -f 6
| | | ---> 第6部分
| |
| |---> 冒号分隔
|
|
linux:x:1000:1000:linux,,,:/home/linux:/bin/bash
域 1 2 3 4 5 6 7
-----------------------------------------------------------
head -46 /etc/passwd | tail -1 | cut -d ":" -f 6
案例题:将/etc/passwd文件中linux用户的用户ID和组ID字符串截取出来(grep | cut)
grep "^linux" -n /etc/passwd | cut -d ":" -f 4-5
grep "^linux" /etc/passwd | cut -d ":" -f 3,4
4.通配符的使用
touch a1.c a2.c a3.c a4.c aa.c ab.c ac.c ad.c aaa.c abb.c acc.c add.c
1. * ----> 匹配多个字符
linux@ubuntu:day02$ ls a*.c
a1.c a2.c a3.c a4.c aaa.c aa.c abb.c ab.c ac.c acc.c ad.c add.c
2. ? ----> 匹配单个字符
linux@ubuntu:day02$ ls a?.c
a1.c a2.c a3.c a4.c aa.c ab.c ac.c ad.c
linux@ubuntu:day02$ ls a??.c
aaa.c abb.c acc.c add.c
3. [] ----> 匹配中括号中的某一个字符
linux@ubuntu:day02$ ls a[abcd].c ---> 第二个字符为abcd的任意一个
aa.c ab.c ac.c ad.c
linux@ubuntu:day02$ ls a[a-d].c ---> 第二个字符为a到d的之间的任意一个
aa.c ab.c ac.c ad.c
linux@ubuntu:day02$ ls a[1-4].c ---> 第二个字符为1到4的之间的任意一个
a1.c a2.c a3.c a4.c
linux@ubuntu:day02$ ls a[^1-4].c ---> 第二个字符除了为1到4之间的任意一个
aa.c ab.c ac.c ad.c
linux@ubuntu:day02$ ls a[^abcd].c ---> 第二个字符除了为a到b之间的任意一个
a1.c a2.c a3.c a4.c
5.文件属性操作相关的命令
5.1 修改文件权限的命令 --- chmod
-rwxrwxr-x 1 linux linux 16704 Sep 12 23:04 a.out
| | | | | | | |->文件大小 |--> 日期 |---> 文件名
| | | | | | |----> 所属的组
| | | | | |----> 所属的用户
| | | | |-----> 硬链接个数
| | | |----> 其他用户的权限
| | |-----> 文件所属组的权限
| |-----> 文件所属用户的权限
|-------> 文件的类型
1. 文件类型
bsp-lcd :
块设备文件/套接字文件/管道文件/普通文件/链接文件/字符设备文件/目录
2. 文件的权限
r ---> 可读(4)
w ---> 可写(2)
x ---> 可执行(1)
3. 所有的用户
a ---> 所有的用户(all)
u ---> 普通的用户(user)
g ---> 组(group)
o ---> 其他用户(other)
4. 权限操作
+ ---> 添加权限
- ---> 移除权限
= ---> 修改权限
augo + +-= + rwx : 从中各选取一个或多个任意组合
5. 修改文件的权限 ----> chmod
方式1:
chmod u+x hello.c ---> 给hello.c所属用户添加可执行的权限
chmod g-w hello.c ---> 给hello.c所属组删除写的权限
chmod o=rw hello.c ---> 给hello.c所属其他用户修改为可读可写的权限
chmod a+rwx hello.c ---> 给hello.c所有的人都添加可读可写可执行的权限
方式2:
chmod 0777 hello.c --->
||||----> 设置其他用户的权限:可读+可写+可执行(4+2+1)
|||----> 设置所属组的权限:可读+可写+可执行(4+2+1)
||----> 设置所属用户的权限:可读+可写+可执行(4+2+1)
|----> 表示8进制数,0可以省略
具体设置文件为哪种权限,根据需要将:可读(4)+可写(2)+可执行(1),进行任意组合,
让后将对应的权限的数据进行加法运算即可。
二进制到十六进制之间的转算(4位二进制对应1位16进制,记住8421)
0b * * * *
8 4 2 1
二进制到八进制之间的转算(3位二进制对应1位16进制,记住421)
5.2 修改用户所属的组 ---> chgrp
chgrp root hello.c ----> 修改hello.c文件所属的组为root用户
5.3 修改用户所属的用户和组 ----> chown
chown root:root hello.c ---> 修改hello.c文件所属的用户和组
chown root: hello.c ---> 修改hello.c文件所属的用户和组
chown :root hello.c ---> 修改hello.c文件所属的组
chown root hello.c ---> 修改hello.c文件所属的用户
6、链接文件的创建
在查看文件的详细信息时有一个硬链接数:
-rw-rw-r-- 1 root root 101 Aug 10 18:17 hello.c
如果是一个文件,则硬链接数表示此文件的硬链接文件的个数;
如果是一个目录,则硬链接数表示此目录下的子目录的个数。
6.1 创建软链接文件
用法:
ln -s 绝对路径/被链接的文件或者目录 绝对路径/链接的文件或目录的名字
总结:
1> 创建软链接文件时既可以对普通文件创建软连接文件,也可以对目录创建软链接文件;
2> 在创建软连接文件时使用绝对路径,尽量不要使用相对路径;
原因:如果使用相对路径时,当将软连接文件拷贝到其他目录下时,
软连接文件和被链接的文件的链接关系将失效;如果使用绝对路径链接关系就不会失效。
3> windows系统是不支持软链接文件,因此在后续的课程中,
在解压缩***.tar.xx压缩文件时,要求在ubuntu中使用tar命令解压缩。
4> 软链接文件的属性为----> l
5> 创建软链接文件之后,硬链接数不会增加。
6> 如果删除被链接的文件,则对应的软链接文件会失效,如果重新创建对应的文件,
软链接文件会重新生效。
练习题:
// 对目录创建软链接文件
ln -s /home/linux/DC22081/day01 /home/linux/DC22081/day01-s
// 对文件创建软链接文件
ln -s /home/linux/DC22081/day01/hello.c /home/linux