编辑整理 by Staok。
本文部分内容摘自 “100ask imx6ull” 开发板的配套资料(如 百问网的《嵌入式Linux应用开发完全手册》,在 百问网 imx6ull pro 开发板 页面 中的《2.1 100ASK_IMX6ULL_PRO:开发板资料》或《2.2 全系列Linux教程:在线视频与配套资料》里面可以下载到),还有参考 菜鸟教程、C语言中文网、红联的等等等等,比较广泛,侵删。进行了精髓提取,方便日后查阅。过于基础的内容不会在此提及。如有错误恭谢指出!
注:在 Github 上的原版文章日后可能会更新,在其它位置发的不会跟进。文章的 Gitee 仓库地址,Gitee 访问更流畅。
terminal / console / tty / shell
一文搞懂~
终端、Shell、tty 和控制台(console)有什么区别? - 知乎 (zhihu.com)。
Linux Shell
概况
Shell 的意思是“外壳”,在 Linux 中它是一个程序,比如 /bin/sh、 /bin/bash 等。它负责接收用户的输入,根据用户的输入找到其他程序并运行。比如我们输入“ ls”并回车时, shell 程序找到“ ls”程序并运行,再把结果打印出来。Shell 有很多种实现,我们常用 bash。
命令提示符如下图。
根目录: "/" ;家目录: "~" ;上一级目录: ".." ;当前目录: "." ;上一次目录:"-"。执行当前目录的 "app" 应用程序: "./app" 。
绝对路径从 根目录 "/" 开始写起,相对目录从当前所在目录 “.” 开始写起。
常用命令
-
Linux 命令查询,当字典用。
-
Linux 命令大全 - 菜鸟教程。
-
即用网页:Linux命令搜索引擎 命令,Linux Linux命令搜索引擎 命令详解:最专业的Linux命令大全,内容包含Linux命令手册、详解、学习,值得收藏的Linux命令速查手册。 - Linux 命令搜索引擎 (wangchujiang.com),开源地址 jaywcjlove/linux-command: Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux (github.com)。
-
即用网页:Linux工具快速教程 — Linux Tools Quick Tutorial (linuxtools-rst.readthedocs.io),开源地址 me115/linuxtools_rst: Linux工具快速教程 (github.com)。
-
本地离线文档资料 Linux 命令速查:
【1 Linux 命令速查 & Shell & Vim】\Linux 命令速查-快速定位查询\
。 -
100ask 手册《嵌入式Linux应用开发完全手册》的 “第2章 开发板板载系统应用、库、工具、使用”。
-
Linux大神都是怎么记住这么多命令的? - 知乎 (zhihu.com)。
-
20个提高生产力的 Linux 命令与技巧,用完带你起飞_布道者-瞎子的博客-CSDN博客.
-
-
Shell 教程 - 菜鸟教程,Shell脚本:Linux Shell脚本学习指南(超详细) (biancheng.net)。
-
添加环境变量:具体步骤在 “换源 和 添加系统变量” 一节 里面的 “添加系统变量” 处。
快捷键 / 通配符 / 流重定向 / 管道
-
Linux 图形界面中(比如 Ubuntu 图形界面中),按下
Ctrl + Alt + t
打开终端。 -
命令的 惯例选项 的含义:以下命令的多个选项可以任意按需组合。
-
-a 表含隐藏文件;
-
-r 表文件夹内遍历所有文件;
-
-h 容量以方便识别的形式打印(如容量大小以 K/M/G 单位显示);
-
-i 执行例外操作前会询问,加上比较保险;
-
-v 显示版本;
-
--help 显示帮助;
-
等等。
-
-
快捷键:
-
结束当前进程:ctrl + c。
-
暂停当前进程:ctrl + z,可使用
fg
命令 恢复,详见任务后台执行 / 任务&进程查看
一节。 -
使光标移动到命令行的最前:ctrl + a,对于长命令可以快速定位到最前。
-
使光标移动到命令行的最后:ctrl + e。
-
退出当前终端:ctrl + d,关闭,作用与
exit
一样。 -
暂停终端的快速滚动(冻结):ctrl + s;解冻终端是用 ctrl + q。
-
-
一行多个命令逐个执行:命令之间加
&&
符号。 -
一次运行多个命令:命令之间加上
;
分号,即command_1; command_2; command_3
形式。 -
将命令放到后台执行:命令结尾加一个
&
符号,更多信息见任务后台执行 / 任务&进程查看
一节。 -
自动补全:tab 键自动补全命令和文件或目录的全名。输入路径全名的中途,按两下 tab 键显示当前目录下的内容。
-
shell 中
!!
代表上一个命令,原样替换,比如执行command_1
后发现需要 root 权限,只需再执行sudo !!
即可 带上 sudo 前缀执行上一次命令。 -
shell 中
!$
代表 上一个命令的最后一项,比如ls ~
和cd !$
就是接连查看家目录和打开家目录。 -
设置命令别名:设置 linux 命令别名_清泉影月的博客-CSDN博客。
-
基本命令
alias ll=ls -l
。删除别名unalias [别名]
。 -
直接执行 alias 命令后别名立马生效,只是临时生效,退出 shell 窗口就没了。
-
永久生效方法:上述命令写到
/root/.bashrc
文件,用 source 命令让 .bashrc 文件生效。
-
-
各种通配符:
-
*:任何字符和字符串。
-
?:一个任意字符。
-
[abc...]: [ ] 内的任意一个字符。 [abc]表示 a、 b、 c 任一个字符;有时候也表示范围,如 [a-x] ,表示 a 到 x 的任一个字符; [1-9] 表示 1 到 9 的任一数字。
-
[!abc...]:和上面的相反,表示除 [ ] 内的字符外的任意一个字符。
例
rm -f 1[!1]*.txt
删除名字中第一个字符是 “1” 而第二个字符不是为 “1” 的所有文件。 -
-
流控制,输入 和 输出 重定向(> / >>, <):Shell 输入/输出重定向 | 菜鸟教程 (runoob.com)。
-
command > file
,将 command 的 输出 重定向到 file(一个文件),即将 command 的输出流 stdout 重定向到 file,将 command 的打印内容覆盖输出到文件 file 里;command >> file
,将输出以追加的方式重定向到 file,追加输入到文件 file。 -
command < file
,将 command 的 输入 重定向到 file,即将 command 的输入流 stdin 重定向到 file,本来需要从键盘获取输入的命令会转移到读取文件内容。 -
注意 输出重定向是大于号(>),输入重定向是小于号(<)。
-
清空文本文件的内容而不删除文件本身:
> 文件名
。 -
错误信息重定向:
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
-
标准输入文件(stdin):stdin 的文件描述符为 0,Unix 程序默认从 stdin 读取数据。
-
标准输出文件(stdout):stdout 的文件描述符为 1,Unix 程序默认向 stdout 输出数据。
-
标准错误文件(stderr):stderr 的文件描述符为 2,Unix 程序会向 stderr 流中写入错误信息。
command 2 >> file
让执行命令后的错误信息 stderr 追加到 file 文件末尾。
-
-
-
管道( | ):
command1 | command2
,当在两个 命令/应用/进程 之间设置管道时,管道符|
左边命令的输出就变成了右边命令的输入(管道 即进程间通讯的一种)。这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command1 的输出结果; command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。
例:查看指定程序的进程运行状态,并将输出重定向到文件中。
ps aux | grep httpd > /tmp/ps.output && cat /tmp/ps.output
基本命令 / 文件&目录管理
基本命令
pwd
、cd
、mkdir
(-p 选项指示连续创建目录及其子目录,如mkdir -p test1/test2/test3/test4
)、rmdir
(不能删除非空目录,-p 选项可以一次删除多级空目录)、touch
、clear
、echo
(往文件写内容 echo none > /sys/class/leds/cpu/trigger
)。
文件与目录管理
Linux 文件与目录管理 | 菜鸟教程 (runoob.com)。
ls(英文全拼:list files): 列出目录及文件名
cd(英文全拼:change directory):切换目录
pwd(英文全拼:print work directory):显示目前的目录
mkdir(英文全拼:make directory):创建一个新的目录
rmdir(英文全拼:remove directory):删除一个空的目录
cp(英文全拼:copy file): 复制文件或目录
rm(英文全拼:remove): 删除文件或目录
mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
显示目录文件和文件夹:ls
-l 显示完整属性信息;-a 显示隐藏文件;-h 文件和文件夹大小以 K/M/G 单位显示;-i参数显示文件的inode节点信息。一个例子如图。
统计目录每个文件大小:du
统计指定目录内每个文件和文件夹大小:du -ah ~/Videos
。-a 表显示隐藏文件,-h 表大小以 K/M/G 单位显示。
显示指定文件所占空间:
# du log2012.log 300 log2012.log
复制 文件或文件夹:cp
-
-r 表示递归目录下所有文件。
-
-d 如果源文件为链接文件,只复制链接文件而不是实际文件。
-
-i 增加特殊情况的讯问,如同名时会询问是否覆盖等(个人建议常用)。
-
-f 强制覆盖。
额外选项:
-
-l:进行硬连结(hard link)的连结档创建,而非复制文件本身。
-
-s:复制成为符号连结档 (symbolic link),亦即 快捷方式文件。
-
-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用)。
-
-a:相当於 -pdr,递归复制,并将文件属性和链接文件一同复制过去。
例子:
-
拷贝 dir1 目录内所有文件到 dir2 目录:
cp dir1/* dir2
或者cp -r dir1/ dir2/
。 -
复制 整个目录 到 另一个目录 时常用:
cp -rid dir_a dir_b
。
关于 硬链接 和 符号链接:
引自:Linux 文件与目录管理 | 菜鸟教程 (runoob.com)。embedded-notes/linux.md at master · xiaowenxia/embedded-notes (github.com)。
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。
硬连接
硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
硬链接直接指向文件的i节点
硬链接和原文件的i节点是一样的
硬链接文件显示的大小是跟原文件是一样的
硬链接不能链接目录文件。
ln file2 /home/xiaxiaowen/file2hard软连接
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
软链接则是建立了一个新文件
这个文件指向链接的文件,i节点不一样
可以链接目录
ln -s file2 /home/xiaxiaowen/file2soft实验
touch f1 #创建一个测试文件f1 ln f1 f2 #创建f1的一个硬连接文件f2 ln -s f1 f3 #创建f1的一个符号连接文件f3 ls -li # -i参数显示文件的inode节点信息从上面的结果中可以看出,硬连接文件 f2 与原文件 f1 的 inode 节点相同,均为 9797648,然而符号连接文件的 inode 节点不同。
可以得到以下预期与测试的结果:
1).删除符号连接f3,对f1、f2无影响;
2).删除硬连接f2,对f1、f3也无影响;
3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。
移动/重命名 文件/文件夹:mv
-
-f 强制;-i 询问(个人建议常用)。
直接举例:
-
mv file1 dir1 dir2
,将文件 file1 和 目录 dir1 移动到目录 dir2 里面。 -
mv file1 file_1
,将文件 file1 重命名为 file_1。
删除 文件或文件夹:rm
-
-r 递归;-f 强制;-i 询问(个人建议常用)。
-
删除目录:
rm -r dir_a
。 -
喜闻乐见的删库跑路(新手要理解其意思):
rm -rf /*
。
文件内容查看
Linux系统中使用以下命令来查看文件的内容:
cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
查看长文件 less
:less install.log
,最下面显示的是这个文件的名称,我们可以使用 “PageUp” 和 “PageDown” 可以进行上一页和下一页的翻页。如果要知道具体的控制键,我们可以按下 “H” 键,可以显示 less 命令的所有控制键,如果想结束,可以按 “q” 键。
在需要在应用程序运行时分析日志(文本)文件,动态追踪显示:tail -F linuxidc_log
。
以上每个命令的选项,可用时再查(上面 “Linux 命令查询” 处给出了一些在线查询 Linux 命令 的网站),用的多了就 内化 / 记住了。
文件权限 & 用户管理 & 密码管理
文件权限/属性管理
这里面讲的更详细 Linux 文件基本属性 | 菜鸟教程 (runoob.com),Linux权限管理详解 (biancheng.net)。
一句话明白:对于一个文件,通过 chown 来授权某个用户所有该文件,通过 chmod 为该用户设置可以操作(读/写/执行)该文件的权限。
-
改变文件所属用户组 :chgrp
将 install.log 文件的用户组改为 hy 用户组:
chgrp hy install.log
。注意 hy 用户组必须要在/etc/group 文件内存在才可以。-R : 进行递归的持续更改,也连同子目录下的所有文件、目录都更新成为这个用户组之意。常常用在更改某一目录内所有文件的情况。
-
改变文件的所有者:chown
例子:
chown bin install.log
、chown book:book install.log
,改变 install.log 文件的所有者为 bin,改变 install.log 文件的所有者和用户组为 book 和 book。改变文件所有者和用户组的这两个命令的应用场景:复制文件,由于复制行为会复制执行者的属性和权限,因此复制后需要改变文件所属用户、用户组等。
-R:也是递归子目录。
-
改变文件权限:chmod
使用 u、 g、 o 三个字母代表 user、 group、 others 3 中身份;此外 a 代表 all,即所有身份。范例:
chmod u=rwx,go=rx .bashrc
,即对于 .bashrc 文件,用户有 rwx 权限,用户组和其它用户有 rx 权限。也可以增加或去除某种权限,“ +”表示添加权限,“ -”表示去除权限:
chmod a+w .bashrc
、chmod a-x .bashrc
、chmod +x app
。数字的方式就不细说了:用 4 代表 r 权限,2 代表 w 权限,1 代表 x 权限;owner = rwx = 4+2+1 = 7;例子:
chmod 777 .bashrc
。
用户与用户组管理
Linux 用户和用户组管理 | 菜鸟教程 (runoob.com),Linux用户和用户组管理详解 (biancheng.net)。
对于用户与用户组的阐释:
-
Linux用户和用户组(包含两者之间的关系) (biancheng.net)。
-
linux用户和用户组相关概念、理解、操作森狗道格的博客-CSDN博客linux用户和组的作用。
主要有这些命令:
Linux系统添加新用户(useradd命令)
Linux修改系统用户密码(passwd命令)
Linux修改系统用户信息(usermod命令)
Linux强制系统用户登陆时修改密码(chage命令)
Linux删除系统用户(userdel命令)
Linux查看用户的UID和GID(id命令)
Linux临时切换用户身份(su命令)
Linux whoami和who am i命令
Linux添加用户组(groupadd命令)
Linux修改用户组(groupmod命令)
Linux删除用户组(groupdel命令)
Linux将系统用户加入或移除群组(gpasswd命令)
Linux切换用户的有效群组(newgrp命令)
-
增加用户:
useradd user1
,表增加一个用户 user1 ,并接着提示设置密码;只有 root 可以修改所有用户的密码,普通用户只能修改自己的密码,修改自己的密码passwd uesr1
。 -
删除用户:
userdel
,慎用,可删除用户帐号与相关的文件。若不加 -f 参数,则仅删除用户帐号,而不删除相关文件,加上则会删除用户登入目录以及目录中所有文件。 -
修改用户信息:usermod,选项:
-
-c <备注>,修改用户帐号的备注文字。
-
-d 登入目录>,修改用户登入时的目录。
-
-e <有效期限>,修改帐号的有效期限。
-
-f <缓冲天数>,修改在密码过期后多少天即关闭该帐号。
-
-g <群组>,修改用户所属的群组。
-
-G <群组>,修改用户所属的附加群组。
-
-l <帐号名称>,修改用户帐号名称。
-
-L,锁定用户密码,使密码无效。
-
-s <shell>,修改用户登入后所使用的shell。
-
-u <uid>,修改用户ID。
-
-U,解除密码锁定。
-
-
普通用户 与 超级用户 之间切换:
切换为 root 超级用户的命令为:
sudo su
;切换普通用户的命令为:su <username>
,也可以用exit
来退出超级用户。
密码管理
-
给 root 用户设置密码,并在用户间切换:
-
sudo passwd root
给 root 设置密码; -
输入 当前用户(book)密码
; -
输入 root 新设置的密码,两次
; -
成功;
-
su root
切换到 root 用户;su
用来切换用户; -
su book
切回。
-
-
Linux 忘记密码解决方法 | 菜鸟教程 (runoob.com)。
获取命令帮助: --help/man
help、man 和 info 命令。
-
help 只能用于查看某个命令的用法。
-
man 命令既可以查看命令的用法,还可以查看函数的详细介绍等等。
(引自 百问网)
比如想查看 open() 函数的用法时,可以直接执行
man open
,发现这不是想要内容时再执行man 2 open
。在 man 命令中可以及时按“h”查看帮助信息了解快捷键。常用的快捷键是:
-
f
往前翻一页。 -
b
往后翻一页。 -
/<patten>
往前搜patten
字符。 -
?<patten>
往后搜。
-
-
info 命令会显示最全面的信息,一般
man
命令就够了,故info
命令介绍 暂时略。
以下详细:
命令后加 --help 选项,获取此命令的所有选项和其释义。详情如下图。
命令的完整手册,命令前加 man,提供命令、API、概念、配置文件等帮助信息。详情如下。
man 手册一共有 9 册,每一册专注一个方面。如下表。
section | 名称 | 说明 |
---|---|---|
1 | 用户命令 | 用户可操作的命令 |
2 | 系统调用 | 内核提供的函数(查头文件) |
3 | 库调用 | 常用的函数库 |
4 | 特殊文件 | 设备文件(/dev下)和特殊文件 |
5 | 文件格式和约定 | 对一些文件进行解释 |
6 | 游戏程序 | 游戏程序 |
7 | 杂项 | 包括宏包和约定等 |
8 | 系统管理员使用的管理命令 | 通常只有系统管理员可以使用 |
9 | 内核相关 | Linux内核相关文件 |
每一册都细分为语法说明、详细说明、作者说明、版权信息等章节。如下表。
段名 | 主要内容 |
---|---|
NAME | 命令、数据名称的简短说明 |
SYNOPSIS | 简短的命令语法说明 |
DESCRIPTION | 最为权威和全面的使用说明 |
EXAMPLES | 使用本命令或数据的一些参考示例 |
AUTHOR | 作者 |
REPORTING BUGS | 报告相关的错误信息 |
COPYRIGHT | 版权 |
SEE ALSO | 与本命令或数据相关的其他参考说明 |
连接流 / 取文件内容:cat
-
-n 或 --number:由 1 开始对所有输出的行数编号。
-
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
-
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
例子:
# 将一个字符串输入到一个文件 echo "难凉热血瞰百易" > users # 把 textfile1 的文档内容加上行号后覆盖输入 textfile2 这个文档里 cat -n textfile1 > textfile2 # 把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容 追加 到 textfile3 文档里 cat -b textfile1 textfile2 >> textfile3 # 清空 /etc/test.txt 文档内容 cat /dev/null > /etc/test.txt
文件分割 / 文件合并
参考 Linux 下大文件切割与合并 (qq.com)。
在 Linux 系统下使用 split 命令进行大文件切割,使用 cat 命令进行多个小文件的合并,很方便。
-a: #指定输出文件名的后缀长度(默认为2个:aa,ab...) -d: #指定输出文件名的后缀用数字代替 -l: #行数分割模式(指定每多少行切成一个小文件;默认行数是1000行) -b: #二进制分割模式(支持单位:k/m) -C: #文件大小分割模式(切割时尽量维持每行的完整性) split [-a] [-d] [-l <行数>] [-b <字节>] [-C <字节>] [要切割的文件] [输出文件名] —————— -n: #显示行号 -e: #以$字符作为每行的结尾 -t: #显示TAB字符(^I) cat [-n] [-e] [-t] [输出文件名]
实例:
# 行切割文件 $ split -l 300000 users.sql /data/users_ # 使用数字后缀 $ split -d -l 300000 users.sql /data/users_ # 按字节大小分割 $ split -d -b 100m users.sql /data/users_ # 合并文件 $ cat /data/users_* > users.sql
查看二进制文件 hexdump
Linux 内核源码开发工具合集 (biscuitos.cn) ——hexdump。
hexdump [选项] [文件]… 选项 -n length:格式化输出文件的前 length 个字节 -C 输出规范的十六进制和ASCII码 -b 单字节八进制显示 -c 单字节字符显示 -d 双字节十进制显示 -o 双字节八进制显示 -x 双字节十六进制显示 -s 从偏移量开始输出 -e 指定格式字符串,格式字符串由单引号包含,格式字符串形如:’a/b “format1” “format2”。 每个格式字符串由三部分组成,每个由空格分割,如 a/b 表示,b 表示对每b个输入字节应用 format1 格式,a 表示对每个 a 输入字节应用 format2,一般 a > b,且 b 只能为 1,2,4, 另外 a 可以省略,省略 a=1。format1 和 format2 中可以使用类似printf的格斯字符串。 %02d:两位十进制 %03x:三位十六进制 %02o:两位八进制 %c:单个字符等 %_ad:标记下一个输出字节的序号,用十进制表示 %_ax:标记下一个输出字节的序号,用十六进制表示 %_ao:标记下一个输出字节的序号,用八进制表示 %_p:对不能以常规字符显示的用.代替 同一行显示多个格式字符串,可以跟多个-e选项
另外还有:
hexedit 是 linux 下的一款二进制文件编辑工具,可以使用 hexedit 工具对二进制 文件进行编辑和查看。
Bless 是一个十六进制编辑器,其主要功能包括:支持编辑大数据文件及块设备、能够执行 搜索与替换操作、具有类似 Firefox 的标签浏览特性、可将数据输出为文本或 HTML、包含 插件系统。
比较文件差异:diff
diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。
Linux diff命令
diff log2014.log log2013.log 3c3 < 2014-03 --- > 2013-03 8c8 < 2013-07 --- > 2013-08 11,12d10 < 2013-11 < 2013-12 # 上面的 "3c3" 和 "8c8" 表示 log2014.log 和 log20143log 文件在 3 行和第 8 行内容有所不同;"11,12d10" 表示第一个文件比第二个文件多了第 11 和 12 行。
-
-a,只会逐行比较文本文件。
-
-c,显示全部内文,并标出不同之处。
-
-B,不检查空白行。
-
-r,比较子目录中的文件。
-
-y,以并列的方式显示文件的异同之处,其中:
-
"|"表示前后2个文件内容有不同。
-
"<"表示后面文件比前面文件少了1行内容。
-
">"表示后面文件比前面文件多了1行内容。
-
-
-u,以合并的方式来显示文件内容的不同。
-
-H,比较大文件时,可加快速度。
常用 diff -yB <文件1> <文件2>
。
常用 find / grep / sed / awk
可参考 四个强大的linux文本处理工具(find、grep、sed、awk)~青萍之末~的博客-CSDN博客linux 文本处理 查找。embedded-notes/linux.md at master · xiaowenxia/embedded-notes (github.com) 下面一些参考了这个链接。
查找/搜索:find
-
格式:
find 目录名 选项 查找条件
;如果没有指定目录,则为当前目录查找 -
举例,在某目录用名字查找名为 test1.txt 的文件:
find /home/book/dira/ -name "test1.txt"
;按格式查找:-name " *.txt "
; -
其他高级用法很多,这里举例,查找 x 天内有变动的文件:
find /home/book -mtime -2
,查找 /home 目录下两天内有变动的文件。
用法
find [-path ..] [expression]
选项
-name 按照文件名 -iname 按照文件名 忽略大小写 -perm 按照文件权限 -user 按照文件拥有者 -group 按照文件所属的组 -mtime -n +n 按照文件的更改时间来查找文件, -n:n天以内,+n:n天以前 -type 查找某一类型:文件类型有:普通文件(f),目录(d),字符设备文件(c),块设备文件(b),符号链接文件(l),套接字文件(s),管道文件(p) -size n 查找文件长度为n块(一块等于512字节)的文件,带有c时表示文件长度以字节计。 -mount 不跨越文件系统 -follow 遇到符号链接文件,就跟踪至链接所指向的文件 -path 匹配文件路径或者文件 -exec 执行后续命令操作 -a and 与操作 -o or 或操作 -not not 非操作
经典使用方法
#查找/run中所有的socket文件 find /run -type s #搜索/dev中所有包含tty的文件 find /dev -name "*tty*" #搜索/dev中大小大于10字节,名称包含bus的文件 find /dev -size +10c -name "*bus*" #或操作,搜索debug开头的文件或者.rst的文件 find -name 'debug*' -o -name '*.rst' #与操作,搜索debug开头的文件同时是.rst的文件 find -name 'debug*' -a -name '*.rst' #找出文件大小大于10000块的文件,并复制到当前目录 find -size +100000 -exec cp {} . \;
高级使用方法
查询所有mk文件中的date文本
find ./build/ -name "*.mk" -print -exec grep -rwn "date" --color=auto {} \;
文件内搜索:grep
-
格式:
grep [选项] [查找模式] [文件名]
; -
grep -rn "字符串" 文件名
。字符串:要查找的字符串;文件名:要查找的目标文件,如果是 * 符号则表示查找当前目录下的所有文件和目录;r(recursive) 递归查找;n(number) 显示目标位置的行号;-w 全字匹配; -
在 test1.txt 中查找字符串abc:
grep -n "abc" test1.txt
,在当前目录递归查找字符串abc:grep -rn "abc" *
; -
第一个命令的结果传入第二个命令,即在 grep 的结果中再次执行 grep 搜索:
grep “ABC” * -nR | grep “ \.h”
,搜索包含有 "ABC" 的头文件。
选项: -c:只输出匹配行的计数。 -C:匹配的上下文分别显示[number]行。 -I:不区分大小写(只适用于单字符)。 -i:不区分大小写。 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -L:列出不匹配的文件名。 -n:显示匹配行及 行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 -w:只匹配整个单词。 -E:扩展的正则表达式 -R:递归搜寻 --exclude=FILE:跳过FILE 正则表达式主要参数: \:忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $:匹配正则表达式的结束行。 \<:从匹配正则表达式的行开始。 \>:到匹配正则表达式的行结束。 []:单个字符,如[A]即A符合要求 。 [-]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 .:所有的单个字符。 *:有字符,长度可以为0。
经典使用方法: #所有以d开头的文件,包含test的匹配行 grep "test" d* #包含test或者zephyr 不区分大小写 显示行号 扩展正则表达式 grep -inE "test|zephyr" d* #包含test和zephyr 不区分大小写 显示行号 扩展正则表达式 grep -in "test" d* | grep 'zephyr' 主要参数: -c:只输出匹配行的计数。 -I:不区分大小写(只适用于单字符)。 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -L:列出不匹配的文件名 -n:显示匹配行及行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 -R:递归搜寻 -d skip:不递归搜寻 -w:匹配整个单词 正则表达式主要参数: \:忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $:匹配正则表达式的结束行。 \<:从匹配正则表达式的行开始。 \>:到匹配正则表达式的行结束。 []:单个字符,如[A]即A符合要求 。 [-]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 .:所有的单个字符。 *:有字符,长度可以为0。 grep 'test' d* 显示以d开头的文件中包含的test行 grep 'test' aa bb cc 查找文件aa bb cc 中匹配的test行 grep 'test'|'hello' files 匹配test或者hello grep '\<man' files 匹配manic 和man 不匹配batman grep '\<man\>' 只匹配man 不匹配batman和manic grep '^man' files 匹配的字符行首 grep '$man' files 匹配的字符串仔行尾
计算字数:wc
-
各个选项:
-c
只显示 Bytes 数; -l 只显示列数; -w 只显示字数。
数据替换:sed
-
用时现查。
文本处理:awk
-
用时现查。
列出当前打开的文件:lsof
$ sudo lsof COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root cwd DIR 3,3 1024 2 / init 1 root rtd DIR 3,3 1024 2 / init 1 root txt REG 3,3 38432 1763452 /sbin/init init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1 init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1 init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so init 1 root 10u FIFO 0,15 1309 /dev/initctl
COMMAND | 进程的名称 | |
PID | 进程标识符 | |
USER | 进程所有者 | |
FD | 文件描述符 | 应用程序通过文件描述符识别该文件。如cwd、txt、mem等 |
TYPE | 文件类型 | REG(文件) DIR(目录) CHR(字符) BLK(块设备) FIFO(管道) UNIX(UNIX 域套接字) IPv4(IP套接字) |
DEVICE | 指定磁盘的名称 | |
SIZE | 文件大小 | |
NODE | 文件inode | 每个文件都有一个唯一的inode |
NAME | 文件名称 |
参数列表
lsof filename 显示打开指定文件的所有进程 lsof -a 表示两个参数都必须满足时才显示结果 lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件 lsof -u username 显示所属user进程打开的文件 lsof -g gid 显示归属gid的进程情况 lsof +d /DIR/ 显示目录下被进程打开的文件 lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长 lsof -d FD 显示指定文件描述符的进程 lsof -n 不将IP转换为hostname,缺省是不加上-n参数 lsof -i 用以显示符合条件的进程情况 lsof -i[46] [protocol][@hostname|hostaddr][:service|port] 46 --> IPv4 or IPv6 protocol --> TCP or UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (可以不只一个) port --> 端口号 (可以不只一个)
查找应用程序打开的文件的名称和数目
#显示打开指定文件的所有进程 $ lsof filename #例如:打开所有使用/dev/urandom的进程 $ lsof /dev/urandom #查看22端口现在运行的情况 $ lsof -i :22 #查看所属xiaxiaowen用户进程所打开的文件类型为txt的文件 $ lsof -a -u xiaxiaowen -d txt #查找谁在使用文件系统 $ lsof /media/xiaxiaowen/机械硬盘 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME zsh 8465 xiaxiaowen cwd DIR 8,17 8192 5 /media/xiaxiaowen/机械硬盘
压缩打包:gzip、bzip2、tar、7z
Linux打包(归档)和压缩详解 (biancheng.net)。
单文件压缩、解压:gzip、bzip2
-
小文件:gzip (.gz)
-
大文件(压缩比高):bzip2 (.bz2)
上述两个的选项:-l (list) 列出压缩文件内容;-k (keep) 保留压缩或解压的源文件;-d (decompress) 解压压缩文件。
例子:
-
查看:
gzip -l pwd.1.gz
; -
压缩:
gzip -k guesswhat.iso
; -
解压:
gzip -kd pwd.1.gz
。
注:不加 -k 选项,在操作完后不会保留源文件;都只能压缩单文件。
多文件、目录的压缩和解压:tar
-
-c (create):表示创建用来生成文件包 。压缩。
-
-x:表示提取,从文件包中提取文件。解压。
-
-t:可以查看压缩的文件。查看。
-
-z:使用 gzip 方式进行处理,它与”c“ 结合就表示压缩,与”x“ 结合就表示解压缩。
-
-j:使用 bzip2 方式进行处理,它与”c“ 结合就表示压缩,与”x“ 结合就表示解压缩。
-
-v (verbose):详细报告 tar 处理的信息。
-
-f (file):表示文件,后面接着一个文件名。
-
-C <指定目录> 解压到指定目录。
例子:(选项前可以不加 "-",以下还是加上的)
-
查看:
tar -tvf dira.tar.gz
。 -
压缩(目录):
tar -czf dira.tar.gz dira
;或者tar -cjf dira.tar.bz2 dira
;前者使用 gzip (-czf
),后者使用 bzip2 (-cjf
)。tar 打包、 bzip2 压缩:
tar -cjvf dira.tar.bz2 dira
,把目录 dira 压缩、打包为 dira.tar.bz2 文件。 -
解压:
tar -xzf dira.tar.gz -C /home/book
,加-C
指定目录,不加就是解压到当前目录;使用 gzip(-xzf
),使用 bzip2(-xjf
)。
总之:
-
查看:
tar tvf <压缩文件>
。 -
压缩(用 bzip2):
tar cjf /<目标位置>/xxx.tar.bz2 <要压缩的文件夹或文件>
;用 tar:tar cf /.../<目标压缩文件.tar> <要压缩的文件或文件夹>
。 -
解压(用 bzip2):
tar xjf xxx.tar.bz2 -C <目标目录>
;用 tar :tar xf <压缩文件.tar> <解压目录>
。
注意:要进入到被解压的目录下面,然后进行压缩命令,而不是输入压缩文件的全路径名,这样会连带把目录结构一同压缩!
高压工具:7z
-
工具安装:
sudo apt-get install p7zip
。 -
解压:
7z x <压缩包名.7z>
解压到压缩包命名的目录下。 -
压缩:
7z a pack.7z 1.jpg dir1
将 1.jpg 和 文件夹 dir1 压缩成一个 7z 包 pack.7z。
zip、rar
-
rar a jpg.rar *.jpg
rar 格式的压缩,需要先下载 rar for linux;unrar e file.rar
解压 rar; -
zip jpg.zip *.jpg
zip 格式的压缩,需要先下载 zip for linux;unzip file.zip
解压 zip。zip 详细:
压缩并指定目录,举例:
zip -r /home/kms/kms.zip /home/kms/server/kms
;解压并指定目录,举例:
unzip /home/kms/kms.zip -d /home/kms/server/kms
;删除压缩文件中 smart.txt 文件:
zip -d myfile.zip smart.txt
;向压缩文件中添加 rpm_info.txt 文件:
zip -m myfile.zip ./rpm_info.txt
。
网络命令:ifconfig /netstat
-
ifconfig
:查看当前正在使用的网卡,及其 IP;-a 查看所有网卡。修改相应网卡的 IP 地址:ifconfig <网卡名> 192.168.1.123
。 -
测试路由:
ping 8.8.8.8
。测试 DNS 服务:ping www.baidu.com
。DNS 的设置比较简单,8.8.8.8 是好记好用的 DNS 服务器,修改 Ubuntu 中的/etc/resolv.conf
文件,内容如下:nameserver 8.8.8.8
。 -
图形画界面的网络配置工具:
netconfig
,修改好后OK
退出,还需要service network restart
重新启动网络服务才会生效。 所有网络配置信息保存在ls /etc/sysconfig/network-scripts/
里面,重启网络服务就是加载这个里面的文件信息。 -
netstat
:查看网络状况。netstat -lnp | head -n 30
,打印当前系统启动了哪些端口,显示前 30 行信息。netstat -an | head -n 20
,打印网络连接状况,显示前 20 行信息。
查看文件类型:file/readelf
file <文件名>
确定其机器码是适合 x86 平台的,还是 arm 平台的。举例:
file ~/.bashrc 为 ASCII 编码的 text 类型 file ~/.vimrc 为 UTF-8 Unicode 编码的 text 类型 file ~/Pictures/* 如图形文件 JPEG/PNG/BMP 格式 file ~ 为 directory 表明这是一个目录 file /bin/pwd 出现 ELF 64-bit LSB executable,即为 ELF 格式的可执行文件 file /dev/* 出现 character special (字符设备文件)、 block special (块设备文件) 等 readelf -a <elf 文件> 解析并显示 elf 的 arm 可执行文件的详情
定位文件:locate
全局查找文件,打印其位置:locate install.log
。
因为这个命令是从数据库中来搜索文件,这个数据库的更新速度是7天更新一次。 新建不久的文件搜索不到,需要更新一下数据库:
touch 001.txt locate 001.txt # 找不到 updatedb # 立即更新数据库,需要一段时间 locate 001.txt # 找到了
更多选项 Linux locate 命令。
查找应用程序位置:which
which pwd
定位到 /bin/pwd;which gcc
定位到 /user/bin/gcc。
whereis pwd
可得到可执行程序的位置和手册页的位置。
任务后台执行 / 任务&进程查看
前置知识:每个进程有个 ID(The task's unique process ID),为 PID(Process ID),同一个进程下的线程的 PID 均相同。LWP 即轻量级进程,就是线程了。
-
在命令的最后,加一个
&
符号,即可放到后台运行,常用任务管理命令:
jobs
查看任务,返回任务编号 n 和进程号bg %n
将编号为 n 的任务转后台,并运行fg %n
将编号为 n 的任务转前台,并运行ctrl+z
挂起当前任务ctrl+c
结束当前任务例如:更多操作详情看这里。
执行
ping www.baidu.com &
,再按 ctrl + z,显示[1]+ Stopped ping www.baidu.com
,表示此任务编号为 [ 1 ],接着键入bg %1
,让此任务继续执行并转入后台执行,再键入fg %1
,将其转入前台执行,然后 ctrl + c 结束此任务。 -
kill -9 <进程 ID>
结束进程指定进程 ID 的进程。 -
显示系统内存使用情况:
free -h
。 -
查看 CPU 状况有很多方法,还有:
cat /proc/cpuinfo
。 -
命令
w
查看系统整理负载,可显示更细节的命令vmstat
,后者可以查看到内存、磁盘的负载情况, Linux vmstat命令实战详解浮生忆梦的博客-CSDN博客vmstat。 -
ps -aux
查看当前哪些任务在后台执行。详情如下图。 -
ps -xH
,这样可以查看所有存在的线程,也可以使用 grep 作进一步的过滤。 -
ps -mq PID
,这样可以看到指定的进程产生的线程数目。 -
动态的显示系统进程信息(相当于任务管理器界面):
top -d 2
,-d 表示刷新时间,单位秒。详情如下图。 -
top -H
,加上 -H 这个选项,top 的每一行就不是显示一个进程,而是一个线程。top 命令详解 linux top命令查看内存及多核CPU的使用讲述 - tamatama - 博客园 (cnblogs.com)。
-
进程、信号、ps 和 top 详解:关于Linux下进程的详解【进程查看与管理】 - AshJo - 博客园 (cnblogs.com)。
磁盘管理:df / du / fdisk
Linux 磁盘管理 | 菜鸟教程 (runoob.com)。
文件系统挂载查看:df
df -Th
列出文件系统类型、容量和哪个硬盘挂载在这里的情况。
第一列指文件系统的名称,第二列指1KB为单位的总容量,第三列指以使用空间,第四列指剩余空间,最后一栏是磁盘挂载所在目录。
$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda6 29640780 4320600 23814492 16% / ...
分区查看和设置:fdisk
用时现学,网上资料足多。
fdisk -l
,列出系统中所有存储设备,并显示其分区结构。设备名从 /dev/sda
、 /dev/sdb
开始延续。
文件系统挂载:mount
mount 命令用来挂载各种支持的文件系统协议到某个目录下。Linux mount 命令-菜鸟教程
举例:
-
将 /dev/hda1 挂在 /mnt 之下
mount /dev/hda1 /mnt
。 -
将 /dev/hda1 用唯读模式挂在 /mnt 之下
mount -o ro /dev/hda1 /mnt
。 -
将 /tmp/image.iso 这个光碟的 image 档使用 loop 模式挂在 /mnt/cdrom之下。用这种方法可以将一般网络上可以找到的 Linux 光 碟 ISO 档在不烧录成光碟的情况下检视其内容
mount -o loop /tmp/image.iso /mnt/cdrom
。 -
卸载挂载
umount /mnt
。
内核模块管理:kmod
Linux 有许多功能是通过模块的方式,你可以将这些功能编译成一个个单独的模块,待用时再分别载入它们到 kernel。这类可载入的模块,通常是设备驱动程序。
-
lsmod
列出已安装系统的模块。 -
insmod kmod.ko
用于手动安装模块;-f 强制(不检查目前 kernel 版本与模块编译时的 kernel 版本是否一致),更多命令:-
-f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-
-k 将模块设置为自动卸除。
-
-m 输出模块的载入信息。
-
-o <模块名称> 指定模块的名称,可使用模块文件的文件名。
-
-p 测试模块是否能正确地载入kernel。
-
-s 将所有信息记录在系统记录文件中。
-
-v 执行时显示详细的信息。
-
-x 不要汇出模块的外部符号。
-
-X 汇出模块所有的外部符号,此为预设置。
-
-
rmmod
卸载某个已安装的模块。 -
modinfo
查看某个模块的详细信息。 -
modprobe
自动安装模块,并自动尝试解决依赖,比 insmod 聪明;-f 强制安装,-r 卸载模块,更多命令:-
-a或--all 载入全部的模块。
-
-c或--show-conf 显示所有模块的设置信息。
-
-d或--debug 使用排错模式。
-
-l或--list 显示可用的模块。
-
-r或--remove 模块闲置不用时,即自动卸载模块。
-
-t或--type 指定模块类型。
-
-v或--verbose 执行时(载入或者卸载)显示详细的信息。
-
-V或--version 显示版本信息。
-
-help 显示帮助。
-
系统日志:dmesg
Linux命令之dmesg命令_恒悦sunsite的博客-CSDN博客。
dmesg七种用法 - zhaoxuguang - 博客园 (cnblogs.com)。
例子:
-
dmesg | less。
-
dmesg | tail -20。
-
watch "dmesg | tail -20"。
系统管理 / 杂项 / 日常
以下命令可用时现查。
-
who,显示登录到本地的用户。
-
w,显示登录到本地的用户,并显示他们在做什么。
-
whoami,显示当前用户的登录名。
-
id,查看用户 id 和其它信息。
-
last,查看最近登陆本机的用户。
-
uname -a,显示本机和系统信息。
-
uptime,查询 linux 系统的运行时间、当前用户数等信息。
-
dmesg,查看开机信息。
-
umask,控制新创建文件的默认权限。
-
ulimit,查看和控制用户的资源限制。
-
env,查看当前用户的环境变量。
-
显示日期、日历:
data
,cal
。打印程序执行时间:time ./可执行程序
。 -
查看 CPU 信息:
cat /proc/cpuinfo
。 -
在 shell 中显示内核驱动使用 printk() 打印的信息(有些板子默认打开了)
echo "7 4 1 7" > /proc/sys/kernel/printk
关闭内核打印信息echo "0 4 1 7" > /proc/sys/kernel/printk
-
关机相关:
-
将存于 buffer 中的资料强制写入硬盘中:
sync
。Linux 系统中欲写入硬盘的资料有的时候为了效率起见,会写到 filesystem buffer 中,这个 buffer 是一块缓存空间,如果欲写入硬盘的资料存于此 buffer 中,而系统又突然断电的话,那么资料就会流失了,sync
指令会将存于 buffer 中的资料强制写入硬盘中。sync
命令在关闭 Linux 系统前使用。 -
在关机前,可使用
ps -aux
查看还有哪些后台进程。 -
关机:
halt
停止机器;halt -p
关闭机器、关闭电源。 -
重启:
reboot
。 -
延时关机:
shutdown -t 10
,-t 表示关机倒计时,单位秒。shutdown
更多例子:常用shutdown -h now
立即关机。
-
-
图形化系统设置工具,调整运行状态,运行
setup
这个综合工具。包括如图所示的五项:认证方式、防火墙配置、鼠标配置、网络配置、系统服务等。这里包含了各种系统服务。 -
有趣的命令:
-
hollywood 和 cmatrix:安装
sudo apt-get install hollywood cmatrix
,效果执行后见。 -
sl:为从右到左跑一遍字符画火车。安装同样使用 apt 工具。
-
figlet:命令为字符画生成,详看 Linux终端也能玩出新境界:Figlet 和 Toilet命令Linux教程Linux公社-Linux系统门户网站 (linuxidc.com)。
-
设置开机运行脚本
-
ubuntu18.04设置开机自动启动脚本_guotianqing的博客-CSDN博客。
-
ubuntu18.04设置开机启动命令/脚本的三种方法(可sudo)ubuntu设置开机自启动Sidney.Tan的博客-CSDN博客。
-
Linux配置开机自启动执行脚本的两种方法 | 《Linux就该这么学》 (linuxprobe.com)。