Linux系统编程:(三)基础指令详解(2)
目录
前言
一、man 指令:Linux 的 “万能说明书”
1.1 指令语法
1.2 常用选项
1.3 man 手册章节说明
1.4 实战示例
示例 1:查看普通指令帮助
示例 2:查看系统调用帮助
示例 3:查看库函数帮助
示例 4:搜索关键字相关帮助
二、cp 指令:文件与目录的 “复制神器”
2.1 指令语法
2.2 核心说明
2.3 常用选项
2.4 实战示例
示例 1:复制单个普通文件
示例 2:批量复制同类文件到目录
示例 3:复制文件前询问确认
示例 4:递归复制整个目录
三、mv 指令:文件的 “移动与重命名大师”
3.1 指令语法
3.2 核心功能说明
3.3 常用选项
3.4 实战示例
示例 1:文件重命名
示例 2:重命名时覆盖已有文件(带询问)
示例 3:移动文件到指定目录
四、cat 指令:文件内容的 “快速查看工具”
4.1 指令语法
4.2 常用选项
4.3 实战示例
示例 1:查看文件基本内容
示例 2:显示行号(非空行编号)
示例 3:显示所有行编号(包括空行)
示例 4:压缩多行空行
示例 5:连接多个文件内容
五、more 指令:大文件的 “分页查看工具”
5.1 指令语法
5.2 常用选项与操作快捷键
5.3 实战示例
示例 1:分页查看大文件
示例 2:指定每页显示行数
六、less 指令:分页查看的 “增强版工具”
6.1 指令语法
6.2 常用选项与操作快捷键
选项
快捷键
6.3 实战示例
示例 1:显示行号并查看文件
示例 2:向下搜索关键词
示例 3:向上搜索关键词
示例 4:忽略大小写搜索
七、head 指令:文件开头的 “截取工具”
7.1 指令语法
7.2 常用选项
7.3 实战示例
示例 1:默认显示前 10 行
示例 2:指定显示前 N 行
示例 3:显示除最后 N 行外的所有内容
八、tail 指令:文件末尾的 “截取与实时监控工具”
8.1 指令语法
8.2 常用选项
8.3 实战示例
示例 1:默认显示最后 10 行
示例 2:指定显示最后 N 行
示例 3:实时监控文件变化
示例 4:显示文件指定范围的行
九、date 指令:时间的 “显示与修改工具”
9.1 指令语法
9.2 常用格式标记
9.3 常用选项
9.4 实战示例
示例 1:显示常规时间格式
示例 2:自定义日期格式输出
示例 3:显示 Unix 时间戳
示例 4:时间戳转换为常规时间
示例 5:设置系统时间(root 用户)
十、cal 指令:日历的 “查看工具”
10.1 指令语法
10.2 常用选项
10.3 实战示例
示例 1:显示当前月日历
示例 2:显示指定年份的完整日历
示例 3:显示三个月的日历
示例 4:显示日期在当年的天数
十一、find 指令:文件系统的 “搜索神器”
11.1 指令语法
11.2 常用选项与搜索条件
核心选项(按文件名搜索)
其他常用搜索条件(扩展)
动作(对搜索结果执行的操作)
11.3 实战示例
示例 1:按文件名精确搜索文件
示例 2:按文件名模糊搜索文件
示例 3:按文件类型搜索目录
示例 4:搜索并删除文件(慎用)
示例 5:搜索并执行命令(复制文件)
十二、which 指令:命令路径的 “查找工具”
12.1 指令语法
12.2 核心说明
12.3 实战示例
示例 1:查找基础命令的路径
示例 2:查找自定义命令的路径
示例 3:查找不存在的命令
十三、whereis 指令:文件的 “全方位查找工具”
13.1 指令语法
13.2 常用选项
13.3 实战示例
示例 1:全方位查找命令相关文件
示例 2:查找库文件相关路径
示例 3:仅搜索可执行文件
示例 4:仅搜索帮助文档
总结
前言
在 Linux 系统学习与运维过程中,指令是与系统交互的核心方式。相比于图形界面,命令行操作更高效、更灵活,尤其在服务器环境中,指令操作更是必备技能。本文将详细拆解 Linux 下 13 个核心指令(man、cp、mv、cat、more、less、head、tail、date、cal、find、which、whereis),结合实际操作示例与输出结果,帮助大家从入门到精通,轻松掌握指令用法。下面让我们正式开始吧!
一、man 指令:Linux 的 “万能说明书”
在使用 Linux 指令时,我们很难记住所有参数的用法。此时,man 指令就像一本随身携带的 “万能说明书”,能够提供指令的详细帮助信息,是 Linux 学习者和运维人员的必备工具。
1.1 指令语法
man [选项] 命令
1.2 常用选项
- -k:根据关键字搜索联机帮助,适合不知道具体指令名称时使用。
- num:只在第 num 章节查找,man 手册分为 9 个章节,不同章节对应不同类型的帮助内容。
- -a:显示所有章节的帮助信息,默认情况下 man 找到第一个匹配的章节后就会停止,使用 - a 选项可继续查看后续章节。
1.3 man 手册章节说明
man 手册的 9 个章节(不同系统可能略有差异)各自有明确的定位,理解章节分类能让我们更精准地查找所需信息:
- 1:普通命令(如 ls、pwd 等基础指令)
- 2:系统调用(如 open、write 等内核提供的接口)
- 3:库函数(如 printf、fread 等 C 语言库函数)
- 4:特殊文件(/dev 目录下的设备文件)
- 5:文件格式(如 passwd 文件的字段含义)
- 6:游戏相关
- 7:附件与变量(如 environ 全局变量)
- 8:系统管理命令(仅 root 用户可使用,如 ifconfig)
- 9:内核相关(较少使用)
1.4 实战示例
示例 1:查看普通指令帮助
查看 printf 指令的基础用法(默认是从第 1 章节查找的):
[whb@bite-alicloud test]$ man printf
输出结果如下(截取部分):
PRINTF(1) User Commands PRINTF(1)NAMEprintf - format and print dataSYNOPSISprintf FORMAT [ARGUMENT]...printf OPTIONDESCRIPTIONPrint ARGUMENT(s) according to FORMAT, or execute according to OPTION:--help display this help and exit--versionoutput version information and exit...
示例 2:查看系统调用帮助
查看 fork 系统调用的帮助(系统调用位于第 2 章节):
[whb@bite-alicloud test]$ man 2 fork
输出结果如下(截取部分):
FORK(2) Linux Programmer's Manual FORK(2)NAMEfork - create a child processSYNOPSIS#include <unistd.h>pid_t fork(void);DESCRIPTIONfork() creates a new process by duplicating the calling process. The new process is referred to as the child process. The calling process is referred to as the parent process....
示例 3:查看库函数帮助
查看 C 库函数 printf 的帮助(库函数位于第 3 章节):
[whb@bite-alicloud test]$ man 3 printf
输出结果如下(截取部分):
PRINTF(3) Linux Programmer's Manual PRINTF(3)NAMEprintf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf - formatted output conversionSYNOPSIS#include <stdio.h>int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);...
示例 4:搜索关键字相关帮助
搜索与 “signal” 相关的帮助信息:
[whb@bite-alicloud test]$ man -k signal
输出结果如下(截取部分):
signal (2) - ANSI C signal handling
signal (3) - signal handling functions
signalfd (2) - create a file descriptor for signal handling
signalfd4 (2) - create a file descriptor for signal handling
sigpending (2) - examine pending signals
sigprocmask (2) - examine and change blocked signals
...
二、cp 指令:文件与目录的 “复制神器”
cp 指令用于复制文件或目录,是日常操作中使用频率极高的指令之一。它支持单文件复制、多文件批量复制、目录递归复制等多种场景,配合选项可实现强制覆盖、复制前询问等功能。
2.1 指令语法
cp [选项] 源文件或目录 目标文件或目录
2.2 核心说明
- 若目标是已存在的目录,会将源文件 / 目录复制到该目录下。
- 若目标是不存在的文件,会创建该文件并将源文件内容复制进去。
- 若同时指定多个源文件 / 目录,目标必须是已存在的目录,否则会报错。
2.3 常用选项
- -f/--force:强行复制,忽略目标文件已存在的情况,直接覆盖。
- -i/--interactive:覆盖文件前询问用户,避免误操作。
- -r:递归处理,复制目录时必须使用该选项,否则无法复制子目录及其中的文件。
2.4 实战示例
示例 1:复制单个普通文件
创建一个测试文件,然后复制该文件并命名为备份文件:
[whb@bite-alicloud test]$ echo "你好比特就业课">myfile.txt
[whb@bite-alicloud test]$ cat myfile.txt
你好比特就业课
[whb@bite-alicloud test]$ cp myfile.txt myfile-backup.txt
[whb@bite-alicloud test]$ ll
total 8
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
输出说明:成功创建 myfile.txt 文件,并复制生成 myfile-backup.txt,两个文件内容和大小完全一致。
示例 2:批量复制同类文件到目录
创建一个目录,将所有.txt 后缀的文件批量复制到该目录下:
[whb@bite-alicloud test]$ mkdir dir
[whb@bite-alicloud test]$ ll
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 15:48 dir
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 whb whb 22 Jan 11 15:47 myfile.txt
[whb@bite-alicloud test]$ cp *.txt dir # *为通配符,匹配所有.txt结尾的文件
[whb@bite-alicloud test]$ tree dir
dir
├── myfile-backup.txt
└── myfile.txt0 directories, 2 files
输出说明:使用通配符*.txt
匹配当前目录下所有文本文件,成功批量复制到 dir 目录中。
示例 3:复制文件前询问确认
修改源文件内容后,复制并覆盖目标文件,使用 - i 选项确保操作安全:
[whb@bite-alicloud test]$ echo "hello bite tech" > myfile.txt
[whb@bite-alicloud test]$ cat myfile.txt
hello bite tech
[whb@bite-alicloud test]$ cp -i myfile.txt myfile-backup.txt
cp: overwrite ‘myfile-backup.txt’? y
[whb@bite-alicloud test]$ cat myfile-backup.txt
hello bite tech
输出说明:使用 - i 选项后,系统会询问是否覆盖目标文件,输入 y 确认后完成覆盖,避免误操作导致数据丢失。
示例 4:递归复制整个目录
将包含子目录和文件的目录完整复制到新目录:
[whb@bite-alicloud ~]$ tree test
test
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt1 directory, 4 files
[whb@bite-alicloud ~]$ cp -rf test test-backup # -r递归复制,-f强制覆盖已存在的目录
[whb@bite-alicloud ~]$ tree test-backup
test-backup
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt1 directory, 4 files
输出说明:使用 - r 选项递归复制 test 目录下的所有文件和子目录,-f 选项强制覆盖已存在的 test-backup 目录,复制后目录结构和文件内容与源目录完全一致。
三、mv 指令:文件的 “移动与重命名大师”
mv 指令是 move 的缩写,兼具文件 / 目录重命名和移动功能,常用于文件整理、备份等场景。它的使用逻辑简单,但配合选项可有效避免误覆盖操作。
3.1 指令语法
mv [选项] 源文件或目录 目标文件或目录
3.2 核心功能说明
- 目标是不存在的文件:将源文件 / 目录重命名为目标文件名。
- 目标是已存在的目录:将源文件 / 目录移动到该目录下。
- 目标是已存在的文件:默认直接覆盖,使用 - i 选项可询问确认。
3.3 常用选项
- -f:强制覆盖,若目标文件已存在,不询问直接覆盖。
- -i:覆盖前询问用户,默认选项(部分系统),提高操作安全性。
3.4 实战示例
示例 1:文件重命名
创建一个文件并将其重命名:
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 myfile.txt
[whb@bite-alicloud test]$ mv myfile.txt yourfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 yourfile.txt
输出说明:成功将 myfile.txt 重命名为 yourfile.txt,文件的创建时间、权限等属性保持不变。
示例 2:重命名时覆盖已有文件(带询问)
当目标文件名已存在时,使用 - i 选项确保覆盖操作可控:
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:57 myfile.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 yourfile.txt
[whb@bite-alicloud test]$ mv -i yourfile.txt myfile.txt
mv: overwrite ‘myfile.txt’? y
[whb@bite-alicloud test]$ ll
total 0
-rw-rw-r-- 1 whb whb 0 Jan 11 15:56 myfile.txt
示例 3:移动文件到指定目录
将文件移动到上级目录的 temp 文件夹中:
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ mkdir temp
[whb@bite-alicloud test]$ ll
total 4
-rw-rw-r-- 1 whb whb 0 Jan 11 17:56 myfile.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 17:56 temp
[whb@bite-alicloud test]$ mv myfile.txt temp/
[whb@bite-alicloud test]$ ls temp/
myfile.txt
[whb@bite-alicloud test]$ mv temp ../ # 将temp目录移动到上级目录
[whb@bite-alicloud test]$ ls -d ../temp
../temp
四、cat 指令:文件内容的 “快速查看工具”
cat 指令主要用于查看文件内容,支持显示行号、压缩空行等功能,适合查看小型文本文件。其名称源于 “concatenate”(连接),也可用于连接多个文件内容并输出。
4.1 指令语法
cat [选项] [文件]
4.2 常用选项
- -b:对非空输出行编号,空行不编号。
- -n:对所有输出行编号,包括空行。
- -s:压缩多行空行为一行,避免输出过多空行影响阅读。
4.3 实战示例
示例 1:查看文件基本内容
创建一个包含多行文本的文件,使用 cat 指令查看:
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 20 ]; do echo "hello bite"; let cnt++; done > temp.txt
[whb@bite-alicloud test]$ cat temp.txt
hello bite
hello bite
hello bite
... # 中间省略17行
hello bite
hello bite
hello bite
输出说明:通过循环语句创建了包含 21 行 “hello bite” 的 temp.txt 文件,cat 指令直接输出所有内容。
示例 2:显示行号(非空行编号)
使用 - b 选项对非空行进行编号,空行不编号:
[whb@bite-alicloud test]$ vim temp.txt # 手动在文件中插入若干空行
[whb@bite-alicloud test]$ cat -b temp.txt1 hello bite2 hello bite3 hello bite4 hello bite5 hello bite6 hello bite
...
输出说明:非空行被依次编号,空行未编号,便于快速定位有效内容的位置。
示例 3:显示所有行编号(包括空行)
使用 - n 选项对所有行(含空行)进行编号:
[whb@bite-alicloud test]$ cat -n temp.txt1 hello bite2 hello bite3 hello bite45 hello bite6 hello bite78 hello bite
...
输出说明:空行也被分配了行号,适合需要精确统计文件总行数或定位空行位置的场景。
示例 4:压缩多行空行
使用 - s 选项将文件中的多行空行压缩为一行:
[whb@bite-alicloud test]$ cat -s temp.txt
hello bite
hello bite
hello bitehello bite
hello bitehello bite
...
输出说明:原本连续的多个空行被压缩为单个空行,使输出内容更简洁,便于阅读。
示例 5:连接多个文件内容
创建两个文件,使用 cat 指令连接它们的内容并输出:
[whb@bite-alicloud test]$ echo "文件1内容" > file1.txt
[whb@bite-alicloud test]$ echo "文件2内容" > file2.txt
[whb@bite-alicloud test]$ cat file1.txt file2.txt
文件1内容
文件2内容
输出说明:cat 指令依次读取 file1.txt 和 file2.txt 的内容,并连续输出,实现了文件内容的连接。
五、more 指令:大文件的 “分页查看工具”
cat 指令适合查看小型文件,当文件内容较多时,会一次性输出所有内容,不便于阅读。more 指令支持分页显示文件内容,可逐页查看大文件,避免信息刷屏。
5.1 指令语法
more [选项] [文件]
5.2 常用选项与操作快捷键
- -n 行数:指定每页显示的行数。
- q:退出 more 查看模式。
- 空格:显示下一页。
- Enter:显示下一行。
- b:返回上一页(部分系统支持)。
5.3 实战示例
示例 1:分页查看大文件
创建一个包含 2001 行内容的大文件,使用 more 指令分页查看:
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 2000 ]; do echo "hello bite"; let cnt++; done > temp.txt
[whb@bite-alicloud test]$ more temp.txt
hello bite
hello bite
hello bite
... # 每页显示约20行(默认值,取决于终端大小)
--More--(0%)
输出说明:默认每页显示终端高度对应的行数,底部显示当前查看进度(0%),按空格可查看下一页,按 q 退出。
示例 2:指定每页显示行数
使用 - n 选项指定每页显示 10 行,精确控制分页效果:
[whb@bite-alicloud test]$ more -10 temp.txt
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
--More--(0%)
输出说明:每页仅显示 10 行内容,底部进度条提示当前查看进度,适合需要逐行仔细阅读的场景。
六、less 指令:分页查看的 “增强版工具”
less 指令是 more 指令的增强版,功能更强大、更灵活。它支持向前 / 向后翻页、关键词搜索等功能,且在查看前不会加载整个文件,对大文件的查看效率更高,是 Linux 系统中查看文件内容的首选工具。
6.1 指令语法
less [选项] [文件]
6.2 常用选项与操作快捷键
选项
- -i:搜索时忽略大小写。
- -N:显示每行的行号。
快捷键
- / 字符串:向下搜索指定字符串。
- ? 字符串:向上搜索指定字符串。
- n:重复前一次搜索(与 / 或?配合使用)。
- N:反向重复前一次搜索。
- PageUp:向上翻一页。
- PageDown:向下翻一页。
- q:退出 less 查看模式。
- G:跳转到文件末尾。
- gg:跳转到文件开头。
6.3 实战示例
示例 1:显示行号并查看文件
使用 - N 选项显示行号,便于定位内容位置:
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 2000 ]; do echo "hello $cnt"; let cnt++; done > temp.txt
[whb@bite-alicloud test]$ less -N temp.txt1 hello 02 hello 13 hello 24 hello 35 hello 46 hello 57 hello 68 hello 79 hello 810 hello 911 hello 10
...
输出说明:每行内容前都显示了对应的行号,便于快速定位到指定行。
示例 2:向下搜索关键词
在文件中向下搜索 “hello 100” 字符串:
[whb@bite-alicloud test]$ less -N temp.txt
# 进入查看模式后,输入 /hello 100 并回车
/hello 100
输出结果如下(截取):
101 hello 100
输出说明:系统自动跳转到第一个匹配 “hello 100” 的行,行号为 101,匹配的字符串会被高亮显示(不同终端颜色不同)。按 n 键可跳转到下一个匹配项,按 N 键跳转到上一个匹配项。
示例 3:向上搜索关键词
在文件中向上搜索 “hello 1999” 字符串:
[whb@bite-alicloud test]$ less -N temp.txt
# 先按G跳转到文件末尾,再输入 ?hello 1999 并回车
?hello 1999
输出结果如下(截取):
2000 hello 1999
输出说明:向上搜索从当前位置向文件开头查找匹配项,适合在文件末尾需要回溯查找的场景。
示例 4:忽略大小写搜索
使用 - i 选项搜索时忽略大小写,匹配 “HELLO 500”(大写):
[whb@bite-alicloud test]$ less -i -N temp.txt
# 输入 /HELLO 500 并回车
/HELLO 500
输出结果如下(截取):
501 hello 500
输出说明:尽管搜索的是大写 “HELLO 500”,但由于使用了 - i 选项,系统忽略大小写,成功匹配到小写的 “hello 500”。
七、head 指令:文件开头的 “截取工具”
head 指令用于显示文件的开头部分内容,默认显示前 10 行,可通过选项指定显示的行数,适合快速查看文件的头部信息(如配置文件的开头注释、日志文件的起始记录等)。
7.1 指令语法
head [选项] [文件]
7.2 常用选项
- -n <行数>:指定显示的行数,如 - n5 表示显示前 5 行,-n-100 表示显示除最后 100 行外的所有内容。
7.3 实战示例
示例 1:默认显示前 10 行
查看文件的前 10 行内容(默认行为):
[whb@bite-alicloud test]$ head temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
输出说明:默认显示文件的前 10 行,无需额外选项,适合快速预览文件开头。
示例 2:指定显示前 N 行
使用 - n 选项指定显示前 5 行:
[whb@bite-alicloud test]$ head -5 temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
输出说明:仅显示文件的前 5 行,精准控制显示行数,适合只关注文件开头少量内容的场景。
示例 3:显示除最后 N 行外的所有内容
使用 - n - 行数的格式,显示除最后 2000 行外的所有内容(即前 11 行):
[whb@bite-alicloud test]$ head -n-2000 temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
hello 10
输出说明:文件总共 2001 行,-n-2000 表示排除最后 2000 行,仅显示前 11 行,该用法适合需要排除文件尾部冗余内容的场景。
八、tail 指令:文件末尾的 “截取与实时监控工具”
tail 指令与 head 指令相对应,用于显示文件的末尾部分内容,默认显示最后 10 行。它最强大的功能是支持实时监控文件变化(如日志文件),是运维人员排查问题的常用工具。
8.1 指令语法
tail [选项] [文件]
8.2 常用选项
- -n <行数>:指定显示的末尾行数。
- -f:循环读取文件内容,实时监控文件变化,文件新增内容会立即显示在终端,按 Ctrl+C 退出监控。
8.3 实战示例
示例 1:默认显示最后 10 行
查看文件的最后 10 行内容:
[whb@bite-alicloud test]$ tail temp.txt
hello 1991
hello 1992
hello 1993
hello 1994
hello 1995
hello 1996
hello 1997
hello 1998
hello 1999
hello 2000
输出说明:默认显示文件的最后 10 行,适合快速查看文件的最新记录(如日志文件的末尾报错信息)。
示例 2:指定显示最后 N 行
使用 - n 选项指定显示最后 3 行:
[whb@bite-alicloud test]$ tail -3 temp.txt
hello 1998
hello 1999
hello 2000
输出说明:仅显示文件的最后 3 行,精准定位文件末尾的少量关键内容。
示例 3:实时监控文件变化
模拟动态日志文件,使用 tail -f 实时监控文件新增内容:
# 打开第一个终端,执行循环命令,每秒向文件写入一行内容
[whb@bite-alicloud test]$ while :; do echo "hello bite $(date +%H:%M:%S)"; sleep 1; done >> temp.txt# 打开第二个终端,使用tail -f监控文件变化
[whb@bite-alicloud test]$ tail -f temp.txt
hello 1998
hello 1999
hello 2000
hello bite 18:30:01
hello bite 18:30:02
hello bite 18:30:03
hello bite 18:30:04
... # 每秒新增一行内容,实时显示
输出说明:tail -f 指令会持续监控文件,每当文件有新增内容时,会立即输出到终端,按 Ctrl+C 可退出监控模式。该用法广泛应用于实时查看应用程序日志、系统日志等场景。
示例 4:显示文件指定范围的行
结合 head 和 tail 指令,显示文件第 180-200 行的内容(核心技巧):
[whb@bite-alicloud test]$ head -200 temp.txt | tail -21
hello 180
hello 181
hello 182
hello 183
hello 184
hello 185
hello 186
hello 187
hello 188
hello 189
hello 190
hello 191
hello 192
hello 193
hello 194
hello 195
hello 196
hello 197
hello 198
hello 199
hello 200
原理说明:head -200 temp.txt
显示文件前 200 行,通过管道符|
将结果传递给tail -21
,显示前 200 行中的最后 21 行,即第 180-200 行(200-21+1=180)。该方法是 Linux 中截取文件指定行范围的常用技巧。
九、date 指令:时间的 “显示与修改工具”
date 指令用于显示或设置系统时间,支持多种时间格式输出,还能进行时间戳与常规时间的转换,是处理时间相关任务的核心指令。
9.1 指令语法
date [选项] [+格式]
9.2 常用格式标记
- %Y:完整年份(如 2023)
- %m:月份(01-12)
- %d:日期(01-31)
- %H:小时(00-23)
- %M:分钟(00-59)
- %S:秒(00-61)
- %F:等同于 % Y-% m-% d(标准日期格式)
- %X:等同于 % H:% M:% S(标准时间格式)
- %s:Unix 时间戳(从 1970-01-01 00:00:00 UTC 到当前时间的秒数)
9.3 常用选项
- -s <时间字符串>:设置系统时间(仅 root 用户有权限)。
- -d @<时间戳>:将时间戳转换为常规时间格式。
9.4 实战示例
示例 1:显示常规时间格式
[whb@bite-alicloud test]$ date
Wed Jan 11 18:22:50 CST 2023
输出说明:默认显示系统当前时间,格式为 “星期 月份 日期 时:分: 秒 时区 年份”。
示例 2:自定义日期格式输出
按照 “年 / 月 / 日”“年 / 月 / 日 - 时:分: 秒” 格式显示时间:
[whb@bite-alicloud test]$ date +%Y/%m/%d
2023/01/11
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S
2023/01/11-18:23:20
输出说明:通过指定格式标记,自定义时间显示格式,满足不同场景的需求(如日志文件名中包含时间戳)。
示例 3:显示 Unix 时间戳
将当前时间转换为 Unix 时间戳:
[whb@bite-alicloud test]$ date +%s
1673432636
输出说明:Unix 时间戳是从 1970-01-01 00:00:00 UTC 开始的秒数,常用于程序开发中时间的存储和计算。
示例 4:时间戳转换为常规时间
将指定时间戳转换为可读的时间格式:
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @0
1970/01/01-08:00:00 # 由于时区差异,UTC时间0点对应北京时间8点
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @1000000000
2001/09/09-09:46:40
输出说明:-d @<时间戳> 选项可将时间戳转换为常规时间,适合将程序中存储的时间戳转换为人类可读格式。
示例 5:设置系统时间(root 用户)
root 用户可通过 - s 选项设置系统时间:
[root@bite-alicloud test]$ date -s "2023-01-12 09:00:00"
Thu Jan 12 09:00:00 CST 2023
[root@bite-alicloud test]$ date
Thu Jan 12 09:00:01 CST 2023
输出说明:仅 root 用户有权限修改系统时间,普通用户执行该命令会报错。设置时间时支持多种格式(如 “20230112 09:00:00”“09:00:00 2023-01-12” 等)。
十、cal 指令:日历的 “查看工具”
cal 指令用于显示公历日历,支持查看指定年份、月份的日历,还能显示当前月前后的月份日历,功能简洁实用。
10.1 指令语法
cal [选项] [年份] [月份]
10.2 常用选项
- -3:显示当前月的前一个月、当前月、后一个月的日历。
- -j:显示日期在当年中的天数(从 1 月 1 日开始计数)。
- -y:显示当前年份的完整日历。
10.3 实战示例
示例 1:显示当前月日历
默认显示当前系统月份的日历:
[whb@bite-alicloud test]$ calJanuary 2023
Su Mo Tu We Th Fr Sa1 2 3 4 5 6 78 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
输出说明:显示 2023 年 1 月的日历,每周从周日(Su)开始,清晰标注了日期对应的星期。
示例 2:显示指定年份的完整日历
显示 1949 年的完整日历(截取部分):
[whb@bite-alicloud test]$ cal 19491949January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa1 1 2 3 4 5 1 2 3 4 52 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 129 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
23 24 25 26 27 28 29 27 28 27 28 29 30 31
30 31April May June
... # 后续月份日历省略
输出说明:显示 1949 年 12 个月份的完整日历,适合查询历史日期对应的星期。
示例 3:显示三个月的日历
使用 - 3 选项显示当前月前后的三个月日历:
[whb@bite-alicloud test]$ cal -3December 2022 January 2023 February 2023
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa1 2 3 4 1 2 3 45 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11
12 13 14 15 16 17 18 12 13 14 15 16 17 18 12 13 14 15 16 17 18
19 20 21 22 23 24 25 19 20 21 22 23 24 25 19 20 21 22 23 24 25
26 27 28 29 30 31 26 27 28 29 30 31 26 27 28
输出说明:同时显示 2022 年 12 月、2023 年 1 月、2023 年 2 月的日历,便于跨月份查看日期。
示例 4:显示日期在当年的天数
使用 - j 选项显示当前月日期在当年的天数:
[whb@bite-alicloud test]$ cal -jJanuary 2023
Su Mo Tu We Th Fr Sa1 2 3 4 5 6 78 9 10 11 12 13 1415 16 17 18 19 20 2122 23 24 25 26 27 2829 30 31
输出说明:1 月 1 日对应当年的第 1 天,1 月 31 日对应第 31 天,适合计算两个日期之间的间隔天数。
十一、find 指令:文件系统的 “搜索神器”
find 指令是 Linux 下功能最强大的文件搜索工具,支持按文件名、文件类型、大小、修改时间等多种条件搜索文件,还能对搜索结果执行指定操作(如删除、复制等)。它在大型文件系统中依然能有效工作,是运维和开发人员的必备工具。
11.1 指令语法
find [搜索路径] [选项] [搜索条件] [动作]
11.2 常用选项与搜索条件
核心选项(按文件名搜索)
- -name <文件名>:按文件名精确搜索,区分大小写。
- -iname <文件名>:按文件名搜索,不区分大小写。
其他常用搜索条件(扩展)
- -type <文件类型>:按文件类型搜索,d(目录)、f(普通文件)、l(软链接)等。
- -size <文件大小>:按文件大小搜索,如 + 10M(大于 10MB)、-5K(小于 5KB)、100M(等于 100MB)。
- -mtime <天数>:按文件修改时间搜索,如 + 7(7 天前修改)、-3(3 天内修改)。
- -user <用户名>:按文件所有者搜索。
- -group <组名>:按文件所属组搜索。
动作(对搜索结果执行的操作)
- -print:默认动作,打印搜索结果(路径 + 文件名)。
- -delete:删除搜索到的文件 / 目录(慎用)。
- -exec <命令> {} ;:对搜索到的每个文件执行指定命令,{} 表示搜索结果,; 表示命令结束。
11.3 实战示例
示例 1:按文件名精确搜索文件
在当前用户的家目录(~)下搜索名为 test.c 的文件:
[whb@bite-alicloud test]$ find ~ -name test.c
/home/whb/test_code/old_code/test.c
/home/whb/test_code/test.c
输出说明:搜索路径为~(/home/whb),按文件名精确匹配 test.c,输出所有匹配文件的完整路径。
示例 2:按文件名模糊搜索文件
搜索当前目录及其子目录下所有.txt 后缀的文本文件:
[whb@bite-alicloud test]$ find . -name "*.txt"
./temp.txt
./dir/myfile.txt
./dir/myfile-backup.txt
输出说明:搜索路径为.(当前目录),使用通配符*.txt
模糊匹配所有文本文件,成功找到当前目录和子目录下的所有.txt 文件。
示例 3:按文件类型搜索目录
搜索 /etc 目录下所有名称包含 “conf” 的目录:
[whb@bite-alicloud test]$ find /etc -name "*conf*" -type d
/etc/selinux/targeted/active/modules/100/abrt/conf
/etc/selinux/targeted/active/modules/100/alsa/conf
/etc/selinux/targeted/active/modules/100/audit/conf
... # 后续结果省略
输出说明:-type d 指定搜索类型为目录,成功筛选出 /etc 目录下名称包含 “conf” 的所有子目录。
示例 4:搜索并删除文件(慎用)
搜索当前目录下 3 天前修改的.log 后缀文件,并删除:
[whb@bite-alicloud test]$ find . -name "*.log" -mtime +3 -delete
说明:该命令会直接删除符合条件的文件,无确认步骤,使用时需谨慎,建议先执行find . -name "*.log" -mtime +3
查看搜索结果,确认无误后再添加 - delete 选项。
示例 5:搜索并执行命令(复制文件)
搜索当前目录下所有.c 后缀的文件,复制到 /tmp/code 目录:
[whb@bite-alicloud test]$ mkdir -p /tmp/code
[whb@bite-alicloud test]$ find . -name "*.c" -exec cp {} /tmp/code/ \;
[whb@bite-alicloud test]$ ls /tmp/code/
test1.c test2.c test3.c
输出说明:-exec 选项指定对每个搜索结果执行 cp 命令,{} 代表搜索到的文件路径,; 表示命令结束,成功将所有.c 文件复制到 /tmp/code 目录。
十二、which 指令:命令路径的 “查找工具”
which 指令用于搜索系统中指定命令的可执行文件路径,它会在环境变量 $PATH 定义的目录中查找命令,适合确认命令是否安装、以及命令的具体执行路径。
12.1 指令语法
which [命令]
12.2 核心说明
- which 仅搜索可执行文件,不搜索帮助文档、源文件等。
- 若命令是别名(alias),which 会同时显示别名和实际命令路径。
12.3 实战示例
示例 1:查找基础命令的路径
查找 ls 和 pwd 命令的可执行文件路径:
[whb@bite-alicloud test]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
[whb@bite-alicloud test]$ which pwd
/usr/bin/pwd
输出说明:ls 命令是别名(默认带 --color=auto 选项显示颜色),实际执行路径为 /usr/bin/ls;pwd 命令的执行路径为 /usr/bin/pwd,两者均位于 $PATH 目录下。
示例 2:查找自定义命令的路径
若已安装自定义命令(如 gcc),查找其路径:
[whb@bite-alicloud test]$ which gcc
/usr/bin/gcc
输出说明:gcc 命令的可执行文件位于 /usr/bin 目录下,说明系统已安装 gcc 编译器。
示例 3:查找不存在的命令
查找系统中未安装的命令(如 java):
[whb@bite-alicloud test]$ which java
/usr/bin/which: no java in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/whb/.local/bin:/home/whb/bin)
输出说明:系统提示在 $PATH 定义的所有目录中均未找到 java 命令,说明 java 未安装或未配置环境变量。
十三、whereis 指令:文件的 “全方位查找工具”
whereis 指令比 which 功能更全面,它不仅搜索命令的可执行文件路径,还会搜索相关的源文件、帮助文档(man 手册)等,适合需要查找命令相关所有文件的场景。
13.1 指令语法
whereis [选项] [命令/文件名]
13.2 常用选项
- -b:仅搜索可执行文件(类似 which)。
- -s:仅搜索源文件。
- -m:仅搜索帮助文档(man 手册)。
13.3 实战示例
示例 1:全方位查找命令相关文件
查找 ls 命令的可执行文件、源文件和帮助文档:
[whb@bite-alicloud test]$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
输出说明:ls 命令的可执行文件路径为 /usr/bin/ls,帮助文档(man 手册)路径为 /usr/share/man/man1/ls.1.gz 和 /usr/share/man/man1p/ls.1p.gz,未找到源文件(通常系统命令的源文件需单独安装开发包)。
示例 2:查找库文件相关路径
查找 libc.so 库文件的相关路径:
[whb@bite-alicloud test]$ whereis libc.so
libc: /usr/lib64/libc.so /usr/lib64/libc.a /usr/share/man/man7/libc.7.gz
输出说明:找到 libc.so(动态库)、libc.a(静态库)的路径,以及对应的帮助文档路径,适合开发时链接库文件的场景。
示例 3:仅搜索可执行文件
使用 - b 选项仅搜索命令的可执行文件(类似 which):
[whb@bite-alicloud test]$ whereis -b ls
ls: /usr/bin/ls
输出说明:仅显示 ls 命令的可执行文件路径,与 which 指令的输出结果一致。
示例 4:仅搜索帮助文档
使用 - m 选项仅搜索命令的帮助文档:
[whb@bite-alicloud test]$ whereis -m ls
ls: /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
总结
本文详细介绍了 Linux 下 13 个核心指令的语法、选项、实战示例及输出结果,涵盖了文件查看(cat、more、less)、文件操作(cp、mv)、内容搜索(grep、find)、时间管理(date、cal)、命令查找(which、whereis)等多个常用场景。这些指令是 Linux 系统操作的基础,熟练掌握它们能极大提高工作效率。感谢大家的支持!