ps 命令是 Process Status 的缩写,用于显示当前运行在系统上的进程信息,包括进程 ID(PID)、状态、运行时间、CPU 和内存占用等。ps 命令列出的是当前那些进程的快照,就是执行 ps 命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用 top 命令。
ps 命令有许多参数,用于控制输出的格式和内容。常用的参数包括:
-e:显示所有进程,包括没有终端的进程,等同于 -A。
-f:显示完整格式的输出,包括进程的父进程 ID(PPID)、用户 ID(UID)、CPU 占用等。通常和其他选项联用。用树形格式来显示进程;如:ps -ef 等
u:使用详细格式显示进程信息,包括进程的所有者、CPU 占用率(%)、内存占用率(%)等
-r:按 CPU 使用率排序,显示 CPU 使用率最高的进程
显示所有进程的详细信息(包括后台运行的进程)
TTY :进程是在哪个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
S :中断;该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
Z :僵尸:该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (僵尸) 程序的状态
TIME :进程从启动后到现在,实际占用 CPU 的总时间
IME:表示进程执行起到现在总的 CPU 占用时间
查看系统负载情况 :通过 ps aux 命令查看当前系统所有进程的 CPU 和内存占用情况,帮助排查系统负载高的原因。
查找特定进程 :通过 ps -ef | grep process_name 查找特定进程的信息,用于监控和管理。
定时监控进程 :结合 watch 命令,定时执行 ps 命令,实时监控系统中的进程运行情况。
top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器
查看 top 输出的信息含义arrow-up-right
按 CPU 使用率从大到小排序
按 Memory 占用率从大到小排序
按累计运行时间 Time 从大到小排序
通过”shift + >”或”shift + <”可以向右或左改变排序列
改变内存的显示单位,默认为 KB
忽略闲置和僵死进程,这是一个开关式命令
sort 的工作原理是将文件的每一行作为一个单位,相互比较,比较原则是从收字符向后,依次按照 ASCII 码值进行比较,最后将它们按升序输出 。
-u 去除重复行
-r 指定排序方式为降序(从大到小),sort 默认的排序方式是升序
-o 将排序结果写入文件(包括原文件),sort 默认是吧结果输出到标准输出,所以需要用重定向才能将结果写入文件,例如 sort filename > newfile,但是,重定向不能把排序结果输出到原文件(重定向到原文件会清空原文件)
-n 以数值来排序,默认的 ASCII 码值会出现 10 比 2 小的情况
-t 设置间隔符,指定间隔符后就可以用 -k 来指定列数了
-k 指定排序的列数
-f 忽略大小写,会将小写字母都转换为大写字母来进行比较
-b 忽略每行前面的所有空白部分,从第一个可见字符开始比较
-c 检查文件是否已经排好序,如果乱序则输出第一个乱序的行
-M 按月份排序
-V 按版本号排序
详细的语法格式:
[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]
这个语法格式可以被其中的逗号(“,”)分为两大部分,Start 部分和 End 部分。
“如果不设定 End 部分,那么就认为 End 被设定为行尾”。这个概念很重要的。
Start 部分也由三部分组成,其中的 Modifier 部分就是我们之前说过的类似 n 和 r 的选项部分。我们重点说说 Start 部分的 FStart 和 C.Start。
C.Start 也是可以省略的,省略的话就表示从本域的开头部分开始。之前例子中的-k 2 和-k 3 就是省略了 C.Start 的例子喽。
FStart.CStart,其中 FStart 就是表示使用的域,而 CStart 则表示在 FStart 域中从第几个字符开始算“排序首字符”。
同理,在 End 部分中,你可以设定 FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将 CEnd 设定为 0(零),也是表示结尾到“域尾”
-name:仅可以对文件的 file_name 匹配
-path:可以对文件的 dir_name、file_name 匹配
查找的文件名最好使用引号包围,可以配合通配符进行查找
查找 ~/test 下的.txt 文件
在~/test 下查找 cool 文件夹下的.txt 文件
-type : d 目录、f 文件、b 块设备、c 字符设备、p 管道、l 符号链接
在~/test 目录下查找所有的目录
在~/test 目录下查找所有的文件
在~/test 目录下查找修改时间在 5 日以内的文件
在~/test 目录下查找修改时间在 3 日以前的.txt 文件
在~/test 目录下查找更改时间在 5 分钟以内的.txt 文件
在~/test 目录下查找修改时间在 10 分钟以前的文件
-size n[cwbkMG]
n 为:
w:等价于两个 bytes,1w=2c,一般用户匹配中文
G:1GB,1GB=1024MB=2048*1024b
在~/test 目录下查找所有 size=0 字节的文件
在~/test 目录下查找所有 size<100k 的文件
在~/test 目录下查找所有 size>1MB 的文件
通过编程中的“与、或、非”来搜索
在~/test 目录下查找文件大小在 1kb 和 10kb 内的所有文件
在~/test 目录下查找大于 1kb 或类型为普通文件的文件
在~/test 目录下查找非空文件
通过文件所属组 group 搜索
curl 全称 Command Line URL viewer
curl 是常用的命令行工具,用来请求 Web 服务器
它的名字就是客户端(client)的 URL 工具的意思
如果熟练的话,完全可以取代 Postman 接口测试工具
提供强大的功能
支持的协议
DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS
IMAP、IMAPS、LDAP、LDAP、POP3、POP3、RTMP、RTSP、SCP、SFTP、SMB
SMBS、SMTP、SMTPS、TELNET、TFTP
语法格式: curl [options / URLs]
查看请求详细过程
等价参数: --request <command>
--data-urlencode(常用)
作用:参数等同于 -d,发送 POST 请求的数据体,但它会自动将发送的数据进行 URL 编码
作用:POST 请求体,可以接收一个完整的 json 字符串
作用:将服务器的 Responses 保存成文件,等同于 wget 命令
作用:将服务器 Responses 保存成文件,并将 URL 的最后部分当作文件名
等价参数: --user-agent <name>
等价参数: --cookie <data|file>
作用:向服务器发送 Cookie,可以是 data 也可以是一个文件
等价参数: --cookie-jar <filename>
作用:将服务器返回需要设置的 Cookie 写入一个文件
作用:设置 HTTP Headers 里面的 Referer,表示请求的来源
等价参数: --form <name=content>
作用:打印 Responses Headers 和响应内容
作用:让 HTTP 请求跟随服务器的重定向,curl 默认不跟随重定向
作用:限制 HTTP 请求和回应的带宽,模拟慢网速的环境
作用:静默模式,将不输出错误和进度信息,不发生错误的话,会正常显示运行结果
常用方法,如果正确,则正常输出,如果错误则只输出错误信息,不输出运行结果
作用:输出通信的整个过程,比 -v 更详细
记录所有的传输数据,包括二进制数据,输出文件可以是一个指定的文件,也可以是标准输出。这个选项非常适用于需要详细了解传输过程的场景。
--trace-ascii 选项与 --trace 类似,但它只记录 ASCII 格式的数据,不会记录二进制数据。这对于只关心文本内容的传输调试非常有用。
等价参数: --write-out <format>
完成请求传输后,使 curl 在 stdout 上显示自定义信息
格式是一个字符串,可以包含纯文本和任意数量的变量
输出格式
所有变量的格式为: %{variable name}
可以使用 \n、带 \r 的回车符和带 \t 的制表符来输出换行符
如果想通过文件来传入变量,可以用 @filename 的格式
content_type(有用)
HTTP 请求的 Content-type
response_code(有用)
和 http_code 一样,都是响应码
local_ip(有用)
ip 地址,可以是 ipv4,也可以是 ipv6
remote_ip(有用)
目标服务器的远程 IP,可以是 ipv4、ipv6
remote_port(有用)
目标服务器的远程端口
size_request(有用)
HTTP 请求中发送的总字节数
time_namelookup(有用)
DNS 域名解析的耗时,就是把 https://zhihu.com 转换成 ip 地址的过程
time_connect(有用)
TCP 连接建立的时间,就是三次握手的时间
time_appconnect(有用)
SSL/SSH 等上层协议建立连接的时间,比如 connect/handshake 的时间
time_redirect(有用)
在最终事务开始之前,所有重定向步骤(包括名称查找、连接、预传输和传输)所用的时间(以秒为单位)
time_redirect 显示多个重定向的完整执行时间
time_pretransfer(有用)
从请求开始到响应开始传输的时间
time_starttransfer(有用)
从请求开始到第一个字节将要传输的时间
包括预传输时间和服务器处理结果所需的时间。
time_total(有用)
这次请求花费的全部时间
url_effective(有用)
最后获取的 URL
如果 curl 添加了 -L 且真的重定向之后,这个就很有用了
功能类似 cat ,cat 命令是将整个文件的内容从上到下显示在屏幕上。 more 命令会一页一页的显示,方便使用者逐页阅读
若遇到连续两行以上的空白行,合并为一行空白行
执行 more 命令后,常用的操作
向下滚动一屏
向上滚动一屏
输出文件名和当前行的行号
less 命令也是对文件或其它输出进行分页显示的工具,应该说是 linux 正统查看文件内容的工具,功能极其强大
ps 查看进程并通过 less 分页显示
进入 less 模式之后的操作
g:移动到第一行
G:移动到最后一行
u:向前移动半屏
d:向后移动半屏
f:向后移动指定行数或一屏
b:向前移动指定行数或一屏
j:向下移动一行
k:向上移动一行
q:结束 less 模式
主要是用来显示文档的开头至标准输出中,默认 head 命令打印其相应文件的开头 10 行。
显示文件的前 5 行(两种方式)
显示文件倒数第 5 行之前的内容
显示文件的第 10 - 20 行
tail 命令主要用于显示指定文档末尾内容。常用查看日志文件。
实时刷新最新 50 条 log
显示最后 5 条 log(两种写法)
sed 是一个强大的流编辑器(sed 的全称是 “stream editor”),用于在 Unix 和 Linux 系统中处理和转换文本。它可以用于插入、删除、替换和检索文本内容。
[options]:一些可选的参数,例如 -i(直接修改文件),-e(多个编辑命令)等。
示例:
假设有一个文件 example.txt,内容如下:
使用 sed 替换 Hello 为 Hi:
输出:
默认情况下,sed 只会替换每行中的第一个匹配项。如果想要替换每行中的所有匹配项,可以在命令末尾添加 g(全局替换):
输出:
使用 -i 选项可以直接修改文件内容,而不是输出到终端:
现在 example.txt 的内容被直接修改为:
删除包含特定模式的行:
示例:
删除包含 Hello 的行:
输出:
(所有行都被删除,因为每行都包含 Hello)
在特定行之前插入文本:
示例:
在第一行前插入 Welcome to:
输出:
替换特定行的文本:
示例:
替换第二行的 Hi 为 Hello:
输出:
可以组合多个命令来处理文件:
示例:
先删除包含 Hello 的行,再将 Hi 替换为 Hello:
输出:
awk 是一种强大的文本处理工具,常用于分析和处理文本文件中的数据。它基于一种编程语言,能够扫描文本文件,并对匹配的行执行指定的操作。
{ action }:动作,表示 awk 对匹配行进行哪些操作。
1. 打印指定列
假设有一个文件 example.txt,内容如下:
要打印文件中的第一列和第三列,可以使用:
输出:
$1 表示第一列,$3 表示第三列。
2. 基于模式进行匹配和操作
打印包含 Jane 的行:
输出:
3. 计算列的总和
假设有一个文件 numbers.txt,内容如下:
计算第一列的总和:
输出:
{ sum += $1 }:遍历每一行,将第一列的值累加到变量 sum 中。END { print sum }:在处理完所有行后,打印 sum 的值。
4. 条件判断和操作
假设有一个文件 students.txt,内容如下:
打印分数大于 80 的学生:
输出:
$2 > 80:条件,表示分数大于 80。
awk 是一个强大的文本处理工具,其 print 和 printf 命令分别用于输出数据。虽然它们都能输出文本,但使用方法和场景有所不同。
print 命令和 printf 命令
print :简单灵活,适用于基本的输出需求,使用默认分隔符输出各字段,支持自定义分隔符。
printf :精确格式化输出,适用于需要特定格式的场景,类似于 C 语言的 printf,支持更复杂的格式控制。
print 基本用法
,:分隔符,print 会在各字段之间添加默认的输出分隔符(通常是空格)。
print 示例
假设有一个文件 data.txt,内容如下:
输出:
输出:
printf 基本用法
printf 示例
继续使用 data.txt 文件。
输出:
假设我们有一个文件 grades.txt,内容如下:
使用 printf 格式化输出:
输出:
print 和 printf 详细示例
假设有一个文件 employees.txt,内容如下:
输出:
输出:
%10.2f:浮点数,占 10 个字符宽度,保留两位小数。
通过这些示例,你可以看到 print 和 printf 各自的特点和适用场景,选择合适的命令来满足你的输出需求。
1. 处理 CSV 文件
假设有一个 CSV 文件 employees.csv,内容如下:
打印员工姓名和工资:
输出:
-F,:指定逗号作为分隔符。
2. 条件过滤和统计
统计工资大于 5500 的员工数量:
输出:
$3 > 5500:条件,表示工资大于 5500。{ count++ }:如果条件满足,则计数器 count 增加 1。END { print "Number of employees with salary > 5500: " count }:在处理完所有行后,打印计数器 count 的值。
grep 用于在文件或文本输出中搜索特定的模式。它支持正则表达式,可以进行复杂的文本匹配和筛选操作。
pattern:要搜索的模式,可以是普通字符串或正则表达式。
-e: 只能传递一个参数。在单条命令中使用多个 -e 选项,得到多个 pattern,以此实现 OR 操作。
-E: 选项可以用来扩展选项为正则表达式。 如果使用了 grep 命令的选项 -E,则应该使用 | 来分割多个 pattern,以此实现 OR 操作
1. 基本搜索
在文件 example.txt 中搜索包含 Hello 的行:
假设 example.txt 的内容如下:
输出:
2. 忽略大小写搜索
在文件 example.txt 中搜索包含 hello(不区分大小写)的行:
输出:
3. 反转匹配
显示文件 example.txt 中不包含 Hello 的行:
输出:
4. 显示行号
显示文件 example.txt 中包含 Hello 的行及其行号:
输出:
5. 搜索多个文件
在文件 file1.txt 和 file2.txt 中搜索包含 pattern 的行:
输出示例(假设两个文件都有匹配项):
6. 递归搜索
在目录 mydir 中递归搜索包含 pattern 的文件:
输出示例(假设目录中有匹配项):
7. 只显示文件名
显示包含 pattern 的文件名,而不显示匹配的具体内容:
输出示例(假设匹配的文件是 file1.txt 和 file2.txt):
8. 显示匹配的行数
统计文件 example.txt 中包含 Hello 的行数:
输出:
9. 只显示匹配的部分
在文件 example.txt 中只显示匹配到的 Hello:
输出:
你可以将 grep 与其他命令组合使用,以实现更复杂的功能。例如,使用管道将 ls 的输出传递给 grep,以搜索包含特定模式的文件名:
假设当前目录中的文件名如下:
输出: