目录
一.基础命令的补充
上一篇总结了Linux操作系统的一部分的基础命令,接下来进行一些基础命令的补充。
1.grep命令
1)功能说明
grep命令是Linux下的文本过滤工具,grep根据指定的字符串,对文件的每一行进行搜索,如果找到了这个字符串,就输出改行的内容。
grep [选项] 需要查找的字符串文件名。grep命令是Linux中一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。在一个或多个文件中搜索字符串模式,如果字符串模式包括空格,也必须被引用,模式后所有字符串被看作文件名。搜索的结果被送到标准输出(stdout),不影响原文件内容。
2)主要选项及说明:
选项 | 说明 |
-c | 只显示符合条件的行数,即只输出匹配行的计数 |
-i | 搜索时忽略大小 |
-n | 显示匹配及行号 |
-l | 查询多文件时只输出包含匹配字符的文件名 |
-s | 不显示不存在或无匹配文本的错误信息 |
-v | 显示不包含匹配文本的所有行 |
-o | 只显示匹配字符串的部分 |
-E | 同时匹配多个关键字或关系,可以和-v一起使用 |
-w | 可以实现完整单词匹配,也很有用 |
2.grep命令与管道"|"的结合
1)管道的介绍
Linux提供管道符合“|”,作用是命令1的输出内容作为命令2的输出内容。通常与grep命令一起使用。格式:命令1|命令2
需要注意的是管道符的使用有两个条件:
1.管道命令只能处理前一个命令的标准输出,而不能处理标准错误;
2.管道命令右边命令必须能够接收标准输入。
2)grep查找命令
a)grep是查找命令,支持模糊搜索
b)grep选项:
| grep -n 显示匹配行和行号
| grep -i 忽略大小写进行查找
c)grep命令不与管道配合的语法
命令一:grep选项“查找内容”路径
命令二:xxx|grep 选项“查找内容”
命令一和命令二的作业是一样的,只不过写法不同,一个利用了管道一个没有利用管道
3)使用实例
实例 | 命令 | 说明 |
查找指定进程 | ps-ef|grep svn | 第一条记录是查找出的进程;第二条结果是grep进程本身,并非真正要找的进程 |
从文件中读取关键词进行搜索 | cat test.txt|grep -f test2.txt | 输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行 |
从文件中读取关键词进行搜索且显示行号 | cat test.txt|grep -nf test2.txt | 输出test.txt文件中读取出的关键词的内容行,并显示每一行的行号 |
3.tar命令
1)功能说明
tar是Linux下经常使用的归档功能,对文件或者目录进行打扫归档,归档成一个文件,但是并不进行压缩。其格式如下。
tar[主选项+辅助选项] 文件或者目录
tar命令的选项很多,这里列出一些经常用到的主选项。
2)tar命令的主选项及其说明
主选项 | 说明 |
-c | 新建文件 |
-r | 把要归档的文件追加到档案文件末尾 |
-t | 列出档案文件中已经归档的文件列表 |
-x | 从打包的档案文件中还原出文件 |
-u | 更新档案文件,用新建文件替代档案中的原始文件 |
3)tar命令的辅助选项及说明
辅助选项 | 说明 |
-z | 支持gzip解压文件 |
-w | 在还原文件时,把所有文件的修改时间设定为现在时间 |
-j | 支持dzip2解压文件 |
-Z | 支持compress解压文件 |
-f | 指定压缩文件 |
-v | 显示操作过程 |
-p | 在文件归档的过程中,保持文件的属性不发生变化 |
二.文件编译运行的介绍
1.Linux上文件的编译链接的过程
文件是一个外存的概念,文件只存在于“外存”(硬盘,U盘,网盘)中,文件由两部分构成,文件名和文件主体。文件的分类:可执行文件,不可执行文件。
可执行文件:在windows操作系统中,扩展名为:*.exe,*.bat等文件时可执行文件,可执行文件由命令和数据构成。Linux中文件的属性不以后缀名来区分,是靠文件属性来判断是否可执行。
不可执行文件:C/C++语言中:.c/*.cpp源文件(文本),*h头文件(文本),*.o/*.obj二进制目标文件,*.exe可执行文件。
1)预处理阶段
主要工作是将头文件插入到所写的代码中,生成扩展名为“.i”的文件替换原来的扩展名为“.c”的文件,但是原来的文件仍然保留,只是执行过程中实际文件发生了改变。(这里所说的替换并不是只原来的文件被删除)
2)编译阶段
.i文件中的代码翻译成特定汇编语言。编译器首先要检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,再检查无误后,编译器把代码翻译成汇编语言,同时将扩展名为“.i”的文件翻译成“.s”的文件
3)汇编阶段
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫作目标文件.o文件,是二进制格式
4)链接阶段
链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件
2.Linux上的C程序的编译流程
1)预编译阶段
gcc -E main.c -o main.i
a)删除所有的“#define”,并且展开所有的宏定义;
b)处理所有的条件预编译指令,“#if”,“#ifdef”,“#endif”等;
c)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置;
d)删除所有注释;
e)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告是显示行号;
f)保留所有的#pragma编译器指令,因为编译器需要使用它们。
2)编译阶段
gcc -S main.i -o main.s
词法分析,语法分析,语义分析,代码优化,汇总符号。
3)汇编阶段
gcc -c main.s -o main.o
将汇编指令翻译成二进制格式,生成各个section,生成符号表
4)链接阶段
gcc -o main.o main
a)合并各个section,调整section的起始位移和段大小,合并符号表进行符号解析,给符号分配虚拟地址
b)符号重定位
5)Linux系统程序的一步编译执行命令
gcc -o 可执行文件名称 源文件名
3.头文件与源文件之间的关系
当我们写一个项目时,我们通常要将待实现的函数在头文件(.h)中进行声明,然后将文件中声明的函数功能在对应的源文件(.cpp)中进行实现。
4.make命令和makefile文件的编写
第一步:文本文件的编写(准备工作)
add函数:
mul函数:
在main.c程序中对add和mul函数进行调用:
第二步:编写makefile文件,管理工程,实现自动化编译(.o)
创建makefile文件,输入命令:touch makefile
使用vim编辑器对makefile文件进行编辑,输入指令:
第三步:使用make命令执行makefile文件中的指令集
第四步:在当前目录下执行main程序
三.GDB调试
1.Debug版本和Release版本
Debug版本为可调式版本,生成的可执行文件包含调试需要的信息,我们作为开发人员,最常用的就是Debug版本的可执行文件。
Debug版本的生成:因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。
gcc -c hello -g ——>生成包含调试信息的中间文件
gcc -o hello hello.o 或者 gcc -o hello hello.c -g
Release版本为发行版本,是提供给用户的版本。用gcc默认生成的就是Release版本。
首先将源代码编译,链接生成Debug版本的可执行文件,然后通过‘gdb Debug 版本的可执行文件名’进行调试模式。
2.gdb调试命令
第一步:gcc -c main main.c -g 或者-G生成Debug可调试版本
第二步:gdb filename 指定调试的文件
第三步:b行号 下断点
第四步:r 程序运行
第n步:输入命令进行程序调试
gdb调试命令