基本概念
Shell与Bash:
用户>服务程序>系统调用接口>内核>硬件
- 硬件设备由系统内核直接管理,但由于内核的复杂性太高,在访问时存在较大的风险,因此用户不能直接访问内核。
- Shell是终端程序的统称,充当了人与内核(硬件)的“翻译官”,会根据用户的命令去调用相应的服务程序去完成某项工作。
- 目前主流Linux系统默认使用的终端程序是Bash(Bourne-Again SHell)解释器。
Bash解释器的优势:
- 通过上下方向键来调取执行过的Linux命令;
- 命令或参数仅需输入前几位就可以用Tab键补全;
- 具有强大的批处理脚本;
- 具有使用的环境变量功能。
常见的Linux命令格式:
命令名称 [命令参数] 命令对象
命令名称:想要做的事情,如创建用户、查看文件、重启系统等;
命令参数:用于对命令进行调整,如创建一个编码为888的用户、仅查看文件的前20行等;
命令对象:一般指要处理的文件、目录、用户等资源名称,也就是命令执行的承受方,例如查看一个叫工资表的文件、重启一个IP为192.168.1.1的系统。
注意事项:
命令参数分为长格式(man --help)和短格式(man -h)
命令名称、命令参数和命令对象之间要用空格进行分隔,且字母严格区分大小写
查看命令的帮助信息:
这里以【在命令行终端中输入man man命令来查看man命令自身的帮助信息】为例:
结构名称 | 代表意义 |
---|---|
NAME | 命令的名称 |
SYNOPSIS | 参数的大致使用方法 |
DESCRIPTION | 介绍说明 |
EXAMPLES | 演示(附带简单说明) |
OVERVIEW | 概述 |
DEFAULTS | 默认功能 |
OPTIONS | 具体的可用选项(带介绍) |
ENVIRONMENT | 环境变量 |
FILES | 用到的文件 |
SEE ALSO | 相关的资料 |
HISTORY | 维护历史与联系方式 |
常用的四个快捷键:
Tab键:实现对命令名称、命令参数、命令对象名称的自动补全,有效避免了手动输入容易输错的问题
Ctrl+C键:终止当前进程的运行
Ctrl+D键:表示键盘输入结束
Ctrl+I键:清空当前终端中已有的内容(相当于清屏操作)
常用系统工作命令
1.echo命令
echo命令用于在终端设备上输出字符串或变量提取后的值,语法格式为:
echo [字符串] [$变量]
例:分别输出字符串和变量的值
2.date命令
date命令用于显示或设置系统的时间与日期,语法格式为:
date [+指定的格式]
参数 | 作用 |
---|---|
%S | 秒(00~59) |
%M | 分钟(00~59) |
%H | 小时(00~23) |
%I | 小时(00~12) |
%P | 显示出AM或PM |
%m | 月份(1~12) |
%a | 缩写的星期名称(例如,Sun) |
%A | 完整的星期名称(例如,Sunday) |
%b | 缩写的月份名称(例如,Jan) |
%B | 完整的月份名称(例如,January) |
%q | 季度(1~4) |
%y | 简写年份(例如,22) |
%Y | 完整年份(例如,2022) |
%d | 本月中的第几天 |
%j | 本年中的第几天 |
%n | 换行符(相当于按下回车键) |
%t | 跳格(相当于按下Tab键) |
例:
按照默认格式打印当前系统时间
按照指定格式打印当前系统时间
修改系统时间为指定时间
查看今天是当年中的第几天(可以用于区分备份时间的早晚)
3.timedatectl命令
timedatectl命令用于设置系统的时间,英文全称为“time date control”,语法格式为:
timedatectl [参数]
参数 | 作用 |
---|---|
status | 显示状态信息 |
list-timezones | 列出已知时区 |
set-time | 设置系统时间 |
set-timezone | 设置生效时区 |
例:
查看系统时间与时区
手动设置时区
手动修改系统日期
手动修改系统时间
4.reboot命令
reboot命令用于重启系统,输入该命令后按回车执行即可(这种操作会涉及硬件资源的管理权限,因此最好以root管理员身份来重启,普通用户在执行该命令时可能会被拒绝),语法格式为:
reboot
5.poweroff命令
poweroff命令用于关闭系统,输入该命令后按回车执行即可(同样最好以root管理员身份来操作),语法格式:
poweroff
6.wget命令
wget命令用于在终端命令行中下载网络文件,英文全称为“web get”,语法格式为:
wget [参数] 网址
参数 | 作用 |
---|---|
-b | 后台下载模式 |
-p | 下载到指定目录 |
-t | 最大尝试次数 |
-c | 断点续传 |
-p | 下载页面内所有资源,包括图片、视频等 |
-r | 递归下载 |
例:下载图灵社区的一张图片
例:递归下载网站内的所有页面数据以及文件
wget -r -p https://www.baidu.com
7.ps命令
ps命令用于查看系统中的进程状态,英文全称为“processes”,语法格式为:
ps [参数]
(通常会将ps命令与管道符技术搭配使用,用来抓取与某个指定服务进程相对应的PID号码)
参数 | 作用 |
---|---|
-a | 显示所有进程(包括其他用户的进程) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
例:输入ps aux命令查看所有进程
标题栏:进程的所有者、进程ID号、运算器占用率、内存占用率、虚拟内存使用量(单位:KB)、占用的固定内存量(单位:KB)、所在终端、进程状态、被启动的时间、实际使用CPU的时间、命令名称与参数
Linux系统中时刻运行着许多进程,需要进行合理的管理,以优化系统的性能。
Linux系统中五种常见的进程状态(STAT):
- R(运行):进程正在运行活在运行队列中等待
- S(中断):进程处于休眠中(当某个条件形成后或者接收到信号时,则脱离该状态)
- D(不可中断):进程不响应系统异步信号(即便kill命令也不能将其中断)
- Z(僵死):进程已经终止,但进程描述符依然存在(直到父进程调用wait4()系统函数后将进程释放)
- T(停止):进程收到停止信号后停止运行
五种进程状态的补充形式:
- <(高优先级)
- N(低优先级)
- L(被锁进内存)
- s(包含子进程)
- l(多线程)
8.pstree命令
pstree命令用于以树状图的形式展示进程之间的关系,英文全称为“process tree”,输入该命令后按回车键执行即可。
pstree
▲ps命令产生的信息量太大又没有规律,而pstree能够有层次地展示进程之间的关系。
9.top命令
top命令用于动态地监视进程活动及系统负载等信息,输入该命令后按回车键执行即可。
top
top命令执行结果的前5行是系统整体的统计信息,其所代表的含义如下:
第1行:系统时间、运行时间、登陆终端数、系统负载(3个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低。)
第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数
第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为CPU数据并以百分比格式显示(“98.7 id”表示有98.7%的CPU处理器资源处于空闲)
第4行:物理内存总量、内存空闲总量、内存使用量、作为内核缓存的内存量
第5行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量
10.nice命令
nice命令用于调整进程的优先级,语法格式为:
nice 优先级数字 服务名称
在top命令输出的结果中,PR和NI值代表的事进程的优先级(数字越低,优先级越高,取值范围:-20~19)。可以将重要进程的优先级调高,来让它更多地利用CPU和内存资源。
例:将bash服务的优先级调整到最高
11.pidof命令
pidof命令用于查询某个指定服务进程的PID号码值,语法格式为:
pidof [参数] 服务名称
例:执行命令来查询本机上sshd服务程序的PID
(每个进程的进程号码值PID都是唯一的,可以用于区分不同的进程)
12.kill命令
kill命令用于终止某个指定PID值的服务进程,语法格式为:
kill [参数] 进程的PID
例:使用命令将PID为1105的进程终止掉
如果系统提示进程无法被终止,可以加参数-9(表示最高级别地强制杀死进程):
kill -9 进程的PID
13.killall命令
kinllall命令用于终止某个指定名称的服务所对应的全部进程,语法格式为:
killall [参数] 服务名称
14.补充小技巧
- 如果在系统终端中执行一个命令后想要立即停止它,可以按下Ctrl+C组合键;
- 如果有些命令在执行时会不断地在屏幕上输出信息,影响到后续命令的输入,可以在执行命令时在末尾添加一个“&”符号,这样命令就会进入系统后台来执行。
系统状态检测命令
1.ifconfig命令
ifconfig命令用于获取网卡配置与网络状态等信息,英文全称是“interface config”,语法格式为:
ifconfig [参数] [网络设备]
主要查看的信息包括:
- 网卡名称
- inet参数后面的IP地址
- ether参数后面的网卡物理地址(又称为MAC地址)
- RX、TX的接收数据包与发送数据包的个数以及累计流量
2.uname命令
uname命令用于查看系统内核版本与系统架构等信息,英文全称为“unix name”,语法格式为:
uname [-a](在使用uname命令时,一般会搭配上-a参数来查看完整信息)
其中的信息包括:
系统的内核名称、主机名、内核发行版本、节点名、压制时间、硬件名称、硬件平台、处理器类型、操作系统名称
如果想要查看的是当前系统版本的详细信息,则需要查看redhat-release文件:
3.uptime命令
uptime命令用于查看系统的负载信息,输入该命令后按回车键执行即可:
uptime
其中的信息包括:
当前系统时间、系统已运行时间、启用终端数量、平均负载值等信息。
(负载值越低表示越安全省心,但是如果硬件设备长期处于空闲状态是一种资源浪费,建议负载值保持在1左右,在生产环境中不要超过5即可)
4.free命令
free命令用于显示当前系统中内存的使用量信息,语法格式为:
free [-h]
带上参数-h会给数据自动匹配上合适的单位,更易于阅读(不带-h的话,默认以KB为单位)。
标题行从左往右:
内存总量、已用量、空闲量、进程功效的内存量、磁盘缓存的内存量、缓存的内存存量、可用量
5.who命令
who命令用于查看当前登入主机的用户终端信息(如果有远程用户,还会显示来访者的IP地址),输入该命令后按回车键执行即可:
who
6.last命令
last命令用于调取主机的被访记录(每次的登陆信息都会记录),输入该命令后按回车键即执行可:
last
7.ping命令
ping命令用于测试主机之间的网络连通性,语法格式为:
ping [参数] 主机地址
参数 | 作用 |
---|---|
-c | 总共发送次数 |
-i | 指定网卡名称 |
-I | 每次间隔时间(秒) |
-W | 最长等待时间(秒) |
例:分别ping一个在线的主机和一个不在线的主机
8.tracepath命令
tracepath命令用于显示数据包到达目的主机时途中经过的所有路由信息(当两台主机之间无法正常ping通时,可以用tracepath命令追踪一下数据包到达目的主机时途中所有路由信息),语法格式为:
tracepath [参数] 域名
9.netstat命令
netstat命令用于显示如网络连接、路由表、接口状态等的网络相关信息,英文全称为“network status”,语法格式为:
netstat [参数]
参数 | 作用 |
---|---|
-a | 显示所有连接中的Socket |
-p | 显示所有正在使用的Socket信息 |
-t | 显示TCP协议的连接状态 |
-u | 显示UDP协议的连接状态 |
-n | 显示IP地址,不使用域名 |
-l | 仅列出正在监听的服务状态 |
-i | 显示网卡列表信息 |
-r | 显示路由表信息 |
例:分别查询详细的网络状况和网卡列表信息
10.history命令
history命令用于显示执行过的命令历史(默认为最近1000条命令记录,可以通过/etc/profile文件中的HISTSIZE变量值自定义数量),语法格式为:
history [参数]
历史命令会被保存在用户家目录中的.bash_histort文件中(Linux系统中以点.开头的文件均代表隐藏文件,这些文件大多数为系统服务文件,可以用cat命令查看其文件内容)
例:
查询执行过的命令历史
使用-c参数来清空所有的命令历史记录
使用“!编码数字”的方式来重复执行某一次的命令
11.sosreport命令
sosreport命令用于收集系统配置及架构信息并输出诊断文档,输入该命令后按回车键执行即可:
sosreport
(当Linux系统出现故障需要联系技术支持人员时,需要用这个命令先收集系统的运行状态和服务配置信息。)
查找定位文件命令
1.pwd命令
pwd命令用于显示用户当前所处的工作目录,英文全称是“print working directory”,输入该命令后直接回车键执行即可:
pwd
2.cd命令
cd命令用于切换当前的工作路径,英文全称为“change directory”,语法格式为:
cd [参数] [目录]
例:
使用cd /etc命令进入/etc目录
使用cd ~命令切换到当前用户的家目录
使用cd Music进入当前用户的家目录下的音乐目录
使用cd -命令返回到上次所处的目录
使用命令进入/etc/gdm/Init目录
使用cd ..命令进入上级目录
使用cd ~ username命令切换到其他用户的家目录
3.ls命令
ls命令用于显示目录中的文件信息,英文全称为“list”,语法格式为:
ls [参数] [文件名称]
例:
加上-a参数可以查看当前目录中的全部文件(包括隐藏文件)
加上-l参数可以查看文件的属性、大小等详细信息
组合一下
加上-d参数,查看指定目录的属性信息
4.tree命令
tree命令用于以树状图形式列出目录内容及结构,输入该命令后按回车键执行即可。:
tree
5.find命令
find命令用于按照指定条件来查找文件所对应的位置,语法格式为:
find [查找范围] 寻找条件
参数 | 作用 |
---|---|
-name | 匹配名称 |
-perm | 匹配权限(mode为完全匹配,-mode为包含即可) |
-user | 匹配所有者 |
-group | 匹配所属组 |
-mtime -n +n | 匹配修改内容的时间(-n指n天以内,+n指n天以前) |
-atime -n +n | 匹配访问文件的时间(-n指n天以内,+n指n天以前) |
-ctime -n +n | 匹配修改文件权限的时间(-n指n天以内,+n指n天以前) |
-nouser | 匹配无所有者的文件 |
-nogroup | 匹配无所属组的文件 |
-newer f1 !f2 | 匹配比文件f1新但是比f2旧的文件 |
--type b/d/c/p/l/f | 匹配文件类型(字母依次表示:块设备、目录、字符设备、管道、链接文件、文本文件) |
-size | 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) |
-prune | 忽略某个目录 |
-exec...... {}\; | 后面可跟用于进一步处理搜索结构的命令 |
例:
在/etc目录中,查找所有以host开头的文件列表
在整个系统中,查找所有权限中包括SUID权限的文件
在整个文件系统中,查找所有归属于linuxprobe用户的文件,并复制到/root/findresults目录中
find / -user linuxprobe -exec cp -a {} /root/findresults/ \;
6.locate命令
locate命令用于按照名称快速搜索文件所对应的位置(使用find命令进行全盘搜索虽然准确但是效率低),语法格式为:
locate 文件名称
(在使用locate命令时,先使用update命令生成一个索引库文件,这个库文件的名字是/var/lin/mlocate/mlocate/db,后续在使用locate命令搜索文件时,就是在该库中进行查找操作,速度会快很多)
例:
生成索引数据库
使用locate命令搜索出所有包含“whereis”名称的文件所在的位置
7.whereis命令
whereis命令用于按照名称快速搜索二进制程序(命令)、源代码以及帮助文件所对应的位置(同样基于updatedb命令生成的索引库文件进行搜索),语法位置为:
whereis 命令名称
例:
分别查找出whereis和ls命令所在的位置
8.which命令
which命令用于按照指定名称快速搜索出二进制程序(命令)所对应的位置,语法格式为:
which 命令名称
如果想找同名文件用——find或者locate
如果想直接找到命令对应的源代码和帮助文件用——whereis
如果只是想要找到命令本身的所在位置用——which
例:
分别找到命令whereis和locate的所在位置
文本文件编辑命令
1.cat命令
cat命令用于查看纯文本文件(适合内容较少的),英文全称为“concatenate”,语法格式为:
cat [参数] 文件名称
例:
加上参数-n,可以在显示文本内容的同时显示行号
2.more命令
more命令用于查看纯文本内容(适合内容较多的,会用百分比表示阅读进度,可以用空格键或者回车键向下翻页),语法格式为:
more [参数] 文件名称
3.head命令
head命令用于查看纯文本内容的前N行,语法格式为:
head [参数] 文件名称
4.tail命令
tail命令用于查看纯文本文件的后N行或持续刷新文件的最新内容,语法格式为:
tail [参数] 文件名称
加上-f参数,可以持续刷新一个文件的内容(适合需要实时查看足心的日志文件时)
5.tr命令
tr命令用于替换文本内容中的字符,英文全称是“transform”,语法格式为:
tr [原始字符] [目标字符]
例:
将文本中的英文全部替换成大写
cat anaconda-ks.cfg | tr [a-z] [A-Z]
6.wc命令
wc命令用于统计指定文本文件的行数、字数和字节数,英文全称为“word counts”,语法格式为:
wc [参数] 文件名称
参数 | 作用 |
---|---|
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 是显示字节数 |
例:
在Linux系统中,/etc/passwd是用于保存所有用户信息的文件,要统计当前系统中有多少个用户,可以使用一下命令来查询
7.stat命令
stat命令用于查看文件的具体存储细节和时间等信息,英文全称为“status”,语法格式为:
stat 文件名称
Linux系统中的文件包含的3种时间状态:
Access Time:内容最后一次被访问的时间,简称Aitme
Modify Time:内容最后一次被修改的时间,简称Mtime
Change Time:文件属性最后一次被修改的时间,简称Ctime
8.grep命令
grep命令用于按行提取文本内容,语法格式为:
grep [参数] 文件名称
参数 | 作用 |
---|---|
-b | 将可执行文件(binary)当作文本文件(text)来搜索 |
-c | 仅显示找到的行数 |
-I | 忽略大小写 |
-n | 显示行号 |
-v | 反向选择(仅列出没有包含“关键词”的行) |
在Linux系统中,/etc/passwd文件保存着所有的用户信息,一旦用户的登陆终端被设置成/sbin/nologin,则不再允许登录系统,因此可以使用grep命令查找出当前系统中不允许登陆系统的所有用户的信息:
9.cut命令
cut命令用于按“列”提取文本内容,语法格式为:
cut [参数] 文件名称
查看系统文件的原始信息的前十行(每一项值之间都用冒号来间隔)
用“列”的方式来提取文本内容(用-d参数设置间隔符号,用-f参数设置需要查看的列)
10.diff命令
diff命令用于比较多个文件之间内容的差异,英文全称是“different”,语法格式为:
diff [参数] 文件名称A 文件名称B
加上--brief参数来确认两个文件是否相同
加上-c参数来详细比较多个文件的差异之处
例:
比较anaconda-ks.cfg和initial-setup-ks.cfg是否相同
列出anaconda-ks.cfg和initial-setup-ks.cfg的差异
11.uniq命令
uniq命令用于去除文本中连续的重复行(非相邻的默认不会去重),英文全称为“unique”(独特的,唯一的),语法格式为:
uniq [参数] 文本名称
12.sort命令
sort命令用于对文本内容进行再排序,语法格式为:
sort [参数] 文件名称
参数 | 作用 |
---|---|
-f | 忽略大小写 |
-b | 忽略缩进与空格 |
-n | 以数值型排序 |
-r | 反向排序 |
-u | 去除重复行 |
-t | 指定间隔符 |
-k | 设置字段范围 |
例:
默认根据字母进行排序
加上参数-u进行去重(与uniq命令不同,就算内容不是相邻的也能去重)
加上参数-n对数字进行排序(不同位数的数字也能正常排序)
组合用法:用-t参数指定间隔符,用-k参数指定第几列,用-n参数指定数字排序
文件目录管理命令
1.touch命令
touch命令用于创建空白文件或设置文件的时间,语法格式为:
touch [参数] 文件名称
参数 | 作用 |
---|---|
-a | 仅修改“访问时间”(Aitme) |
-m | 仅修改“修改时间”(Mtime) |
-d | 同时修改Atime与Mtime |
例:
用touch命令创建一个名为linuxstudy的空白文件
查询这个文件的修改时间(Jan 29 23:06)
往这个文件插入一段字符串
再次查询这个文件的修改时间(Jan 29 23:07)
用touch命令修改这个文件的修改时间(Jan 29 23:06)
再次查询这个文件的修改时间(Jan 29 23:06)
2.mkdir命令
mkdir命令用于创建空白的目录,英文全称为“make directory” ,语法格式是:
mkdir [参数] 目录名称
例:
正常创建一个空目录
加上参数-p,递归创建出具有嵌套层叠关系的文件目录
3.cp命令
cp命令用于复制文件或目录,英文全称为“copy”,语法格式为:
cp [参数] 源文件名称 目标文件名称
复制操作分三种情况:
- 如果目标文件是目录,则会把源文件复制到该目录中
- 如果目标文件也是普通文件,则会询问是否要覆盖它
- 如果目标文件不存在,则执行正常的复制操作
参数 | 作用 |
---|---|
-p | 保留原始文件的属性 |
-d | 若对象为“链接文件”,则保留该“链接文件”的属性 |
-r | 递归持续复制(复制目录时要加上) |
-i | 若目标文件存在则询问是否覆盖 |
-a | 相当于-pdr组合 |
例:
用touch命令创建一个名为“install.log”的普通空白文件,然后复制为一份名为x.log的备份文件,最后再使用ls命令查看目录中的文件
4.mv命令
mv命令用于剪切或重命名文件(原地剪切粘贴相当于重命名),英文全称为“move”,语法格式为:
mv [参数] 源文件名称 目标文件名称
例:
5.rm命令
rm命令用于删除文件或目录,英文全称为“remove”,语法格式为:
rm [参数] 文件名称
参数 | 作用 |
---|---|
-f | 强制执行(免除确认信息) |
-i | 删除前询问 |
-r | 删除目录 |
-v | 显示过程 |
例:
查看当前目录文件
删除happy
再次查看当前目录文件(发现happy删除失败)
加上参数-f,再次执行删除happy
再次查看当前目录文件(确认删除成功)
......
6.dd命令
dd命令用于按照指定大小和个数的数据块来复制文件或转换文件,语法格式为:
dd if=参数值 of=参数值 count=参数值 bs=参数值
参数 | 作用 |
---|---|
if | 输入的文件名称 |
of | 输出的文件名称 |
bs | 设置每个“块”的大小 |
count | 设置要复制“块”的个数 |
例:
用dd命令从/dev/zero设备文件中取出一个大小为560MB的数据块,然后保存为一个名为560_file的文件。
7.file命令
file命令用于查看文件的类型(在Linux系统中,由于文件、目录、设备等所有一切都统称为文件,但是它们又不一定有后缀),语法格式为:
file 文件名称
例:
查看当前文件夹下所有文件各自的类型
(在Windows系统中,用户双击鼠标,系统会自动匹配文件类型和用来打开的应用。而在Linux系统中,系统则是根据用户执行的命令来钓鱼你那个文件,比如执行cat命令查看文件,执行bash命令执行脚本等,所以不要求文件都要有后缀)
8.tar命令
tar命令用于对文件进行打包压缩或解压(在Linux中,主要使用的格式:.tar、.tar.gz、.tar.bz2),语法格式为:
tar 参数 文件名称
参数 | 作用 |
---|---|
-c | 创建压缩文件 |
-x | 解压文件 |
-t | 查看压缩包内有哪些文件 |
-z | 用gzip压缩或解压 |
-j | 用bzip2压缩或解压 |
-v | 显示压缩或解压的过程 |
-f | 目标文件名 |
-P | 保留原始的权限与属性 |
-p | 使用绝对路径来压缩 |
-C | 指定压缩到的目录 |
注意事项:
-c参数和 -x参数不能同时使用(一个压缩,一个解压)
-z参数对应gzip格式的文件,-j参数对应bzip2格式的文件
-v参数推荐使用,对于长时间的压缩或解压操作来讲,方便判断是不是系统死机
-f参数特别重要,一定要放在参数的最后一位
例:
指定路径进行压缩
指定路径进行解压
<完>