Linux常用工具
netstat
netstat
是一个用于显示网络连接状态、路由表、网络接口统计信息等的命令行工具。
- -a 实现连接类型
- -c 持续显示netstat信息
- -g 显示多播组成员身份信息
- -i 显示网络接口统计信息
- -l 显示监听状态的嵌套字(listen)
- -n 使用数字形式显示IP和端口号
- -p 显示每个嵌套子关联的PID和进程名
- -r 显示内核路由表
- -s 显示网络统计信息
- -t 显示TCP连接
- -u 显示UDP连接
- -x 显示UNIX域嵌套字
- -4 显示IPv4连接
- -6 显示IPv6连接
示例
#显示当前正在占用的端口和IP
netstat -tunlp
ps
查看系统运行的进程信息
-e
或-A
: 显示所有进程-f
: 显示完整格式的进程信息,包括父进程ID(PPID)、启动时间等-l
: 显示长格式的进程信息,包括进程的优先级、Nice值等-u
或--user
: 显示指定用户的进程-p
或--pid
: 显示指定PID的进程-C
或--command
: 显示指定命令名的进程-o
或--format
: 自定义输出格式,可以选择显示的字段-a
: 显示所有进程,包括未关联终端的进程-x
: 显示没有控制终端的进程
示例:
#显示所有进程与它们的详细信息
ps -Af
#显示PID为123456的进程
ps -p 123456
#按PID降序排列进程,并显示PID、用户和命令
ps -eo pid,user,cmd --sort=-pid
awk
文本处理工具
基本语法: awk [options] 'pattern {action}' file
模式(pattern)可以是:
- 正则表达式:
/regular expression/
- 关系表达式:
$1 == "foo"
- 组合表达式:
$1 == "foo" && $2 == "bar"
- 行范围:
NR == 1, NR == 10
或NR % 2 == 0
动作(action)可以是:
- 打印:
print
,printf
- 变量赋值:
var = value
- 条件语句:
if (condition) {actions} else {actions}
- 循环语句:
for (init; condition; increment) {actions}
内置变量:
$0
: 整个文本内容$1
,$2
, …: 第1、2、…个字段NF
: 当前行的字段数NR
: 当前行的行号FS
: 输入字段分隔符,默认为空格或制表符OFS
: 输出字段分隔符,默认为空格RS
: 输入记录分隔符,默认为换行符ORS
: 输出记录分隔符,默认为换行符
示例文本文件file1.txt:
1 Alice 25 New York 75000
2 Bob 32 Chicago 82000
3 Carol 27 Los Angeles 69000
4 David 41 Houston 95000
5 Emma 36 Philadelphia 88000
6 Frank 29 Phoenix 71000
7 Grace 33 San Antonio 79000
8 Henry 38 San Diego 86000
9 Ivy 30 Dallas 76000
10 Jack 43 San Jose 98000
- 打印整个文本
awk '{print $0}' file1.txt
- 打印第一列、第二列
awk '{print $1,$2}' file1.txt
- 打印第五列与第六页,当列数不存在时显示
[root@bigdata fishpie]# awk '{print $1,$5}' file1.txt
1 York
2 82000
3 Angeles
4 95000
5 88000
6 71000
7 Antonio
8 Diego
9 76000
10 Jose
[root@bigdata fishpie]# awk '{print $1,$6}' file1.txt
1 75000
2
3 69000
4
5
6
7 79000
8 86000
9
10 98000
- 打印所有包含
New York
的行
awk '/New York/' file1.txt
- 打印第三列等于 25 的行
awk '$3 == 25' file1.txt
或是
awk '$3 == "25"' file1.txt
(bash shell的流程控制语法很严格,但是bash命令的语法不是那么严格UwU)
- 打印行号在 5-15 之间的行
awk 'NR >= 5 && NR <= 15' file1.txt
如果行数不存在的话就显示存在的行数
- 统计文件file1.txt第一列值出现的次数
awk '{count[$1]++} END {for (key in count) print key, count[key]}' file
(可使用管道符 | 与sort命令来实现正序输出结果)
awk '{count[$1]++} END {for (key in count) print key,count[key] | "sort -n"}' file1.txt
为了更详细地演示awk的 NF、NR、FS、OFS、RS、ORS的用法,我们这里创建一个新的 file2.txt 文件
John,Doe,25,New York
Alice,Smith,30,Chicago
Bob,Johnson,27,Los Angeles
- 显示第三行的字段数(以
,
分割)
NF、NR、FS 的使用
注:-v FS=‘,’
相当于-F ','
,但还是推荐写为 -v FS
awk -F ',' 'NR == 3 {print NF}' file2.txt
[root@bigdata fishpie]# cat file2.txt
John,Doe,25,New York
Alice,Smith,30,Chicago
Bob,Johnson,27,Los Angeles
[root@bigdata fishpie]# awk -F ',' 'NR == 3 {print NF}' file2.txt
4
- 输出 file2.txt 第一列、第二列,设置输出结果以
|
做分割
OPS的使用
awk -v FS=',' -v OFS='|' '{print $1,$2}' file2.txt
OFS设置的分隔符可以有空格
为了更详细地演示awk的RS、ORS的用法,我们这里创建一个新的 file3.txt 文件
John,Doe,25,New York|Alice,Smith,30,Chicago|Bob,Johnson,27,Los Angeles
- 设置记录的分割规则为
|
,且输出每条记录的第一第二列
RS(输入记录分隔符)
RS用法,设置记录被分成条的规则,默认是换行符\n
,
就是说一般awk会将每行数据看作一条记录,如果是一整行长数据数据就需要手动设置记录的分割规则,不然awk默认会看作一条记录这对于文本处理非常非常有用
awk -v RS='|' -v FS=',' '{print $1,$2}' file3.txt
- 将上面的输出结果以
---
分割
ORS(输入记录分隔符)
ORS用法,规定每条记录之间的分割方式,默认是换行符
\n
awk -v RS='|' -v FS=',' -v ORS=' ---UwU--- ' '{print $1,$2}' file3.txt
UwU
(为什么命令提示符被移到行尾了)
vim
文本编辑工具
模式切换:
i
: 进入插入模式,在当前光标位置开始编辑Esc
: 退出插入模式,返回普通模式:
: 进入命令行模式,可以执行各种Vim命令
普通模式下光标移动:
0
: 移动到行首$
: 移动到行尾w
: 移到到下一个单词的开头b
: 移动到上一个单词的开头G
: 移动到文件的最后一行gg
: 移动到文件的第一行Ctrl+f
: 向下翻页Ctrl+b
: 向上翻页
普通模式下进行文本编辑:
x
: 删除当前光标所在字符dd
: 删除当前行dw
: 删除当前单词d$
: 删除从当前光标位置到行尾的内容yy
: 复制当前行p
: 粘贴之前复制或删除的内容u
: 撤销上一次操作Ctrl+r
: 重做上一次撤销的操作o
: 在当前行下方插入新行O
: 在当前行上方插入新行>
: 将选中的文本向右缩进<
: 将选中的文本向左缩进:set number
: 显示行号:set nonumber
: 隐藏行号
普通模式下搜索与替换:
/pattern
: 搜索指定的模式(pattern)n
: 移动到下一个匹配项N
: 移动到上一个匹配项:s/old/new
: 将当前行中的第一个old
替换为new
:s/old/new/g
: 将当前行中的所有old
替换为new
:%s/old/new/g
: 将文件中的所有old
替换为new
普通模式下保存与退出
:w
: 保存当前文件:q
: 退出文件:q!
: 不保存强制退出:wq
或ZZ
: 保存并退出文件wq!
: 强制保存退出(例如修改sudoers文件)
普通模式下查看Vim更多信息
:help
: 查阅Vim帮助文档
find
根据名称找文件和目录
- type d 类型为目录
f 类型为文件 - name 文件或目录名称
- iname 忽略大小写的文件或目录名称
- size 文件或目录的大小
- mtime 文件修改时间范围(天)
- mmin 文件修改时间范围(分钟)
- exec 可执行命令
- print 打印找到的文件的路径名
#查找当前目录中的所有目录和文件
find .
#只查找 /home/apps 目录下
find /home/apps/ -type d #目录
find /home/apps/ -type f #文件
#查找当前目录下名为yum.log文件位置(支持 通配符* 查找)
find . -name "yum.log"
find . -iname "yum.log" #忽略大小写
#查找当前目录下文件大小小于 1M 的文件和目录
find . -size -1M
#查找当前目录中 7 天内有改动的文件
find . -type f -mtime -7
find . -type f -mtime +7 #7天外有改动的文件
#查找并删除 7 天外有改动的文件
find . -type f -mtime +7 -exec rm -rf {} \;
#查找当前目录下所有者为Tom的文件
find . -user Tom
#查找当前目录下权限为644的文件
find . -perm 644
grep
搜索匹配文本模式,支持正则表达式
常用于文本处理和分析,在文件或输入中查找和过滤符合条件的内容常与管道符 | 配合使用
非常非常重要
-i
: 忽略大小写进行匹配-v
: 反向匹配,输出不匹配的行-n
: 显示匹配行的行号-c
: 统计匹配行的数量-l
: 只输出包含匹配内容的文件名-L
: 只输出不包含匹配内容的文件名-w
: 匹配整个单词,而不是字符串的一部分-x
: 匹配整行,而不是行中的一部分-E
或--extended-regexp
: 使用扩展正则表达式进行匹配-F
或--fixed-strings
: 将模式视为固定字符串,而不是正则表达式-r
或--recursive
: 递归搜索目录及其子目录-h
或--no-filename
: 输出匹配行时不显示文件名-H
或--with-filename
: 输出匹配行时显示文件名-o
或--only-matching
: 只输出匹配的部分,而不是整行-q
或--quiet
或--silent
: 不输出任何结果,只返回状态码-A NUM
或--after-context=NUM
: 输出匹配行及其后面的NUM行-B NUM
或--before-context=NUM
: 输出匹配行及其前面的NUM行-C NUM
或--context=NUM
: 输出匹配行及其前后各NUM行
示例文件file1.txt:
1 Alice 25 New York 75000
2 Bob 32 Chicago 82000
3 Carol 27 Los Angeles 69000
4 David 41 Houston 95000
5 Emma 36 Philadelphia 88000
6 Frank 29 Phoenix 71000
7 Grace 33 San Antonio 79000
8 Henry 38 San Diego 86000
9 Ivy 30 Dallas 76000
10 Jack 43 San Jose 98000
- 过滤文件中包含 25 的行
[root@bigdata workspace]# grep 25 file1.txt
1 Alice 25 New York 75000
- 过滤
/home/fishpie/workspace/
目录中包含25
grep -r 25 /home/fishpie/workspace/
- 反向匹配,匹配 file1.txt 不包括 25 的行
grep -v 25 file1.txt
- 反向匹配,匹配 file1.txt 不包括 25 的行,同时显示行号
grep -n -v 25 file1.txt
- 反向匹配,匹配 file1.txt 不包括 25 的行,同时显示行号,并将结果保存到 result.txt 文件
grep -n -v 25 file1.txt > result.txt
- 匹配包含 25 和 32 的行
[root@bigdata workspace]# grep -E "25|32" file1.txt
1 Alice 25 New York 75000
2 Bob 32 Chicago 82000
- 显示正在监听的 80 端口
netstat -tunlp | grep :80
date
用于显示和设置系统日期和时间
像curl、wget那种涉及到 SSL 证书的命令,一定要保证日期的准确性(日期不准确这俩命令很可能不能用)
导致时间不一致的原因可能可运行时快照的创建有关
示例:
- 显示当前日期和时间
date
- 设置日期显示格式
date +"%Y-%m-%d %H:%M:%S"
%Y: 年份(四位数)
%m: 月份(两位数,01-12)
%d: 日期(两位数,01-31)
%H: 小时(两位数,00-23)
%M: 分钟(两位数,00-59)
%S: 秒(两位数,00-59)
- 设置系统日期和时间
sudo date -s "2023-05-30 12:34:56"
- 显示指定日期的时间
date -d "2023-05-30"
- 计算时间差
date -d "2023-05-30 12:34:56" +%s
- 显示日期的其他信息
date +"%A, %B %d, %Y" # 显示星期、月份、日期和年份
date +"%j" # 显示一年中的第几天
date +"%U" # 显示一年中的第几周(以周日为一周的开始)
date +"%W" # 显示一年中的第几周(以周一为一周的开始)
通过ntdate工具一键矫正时间
先下载 ntpdate 工具
sudo yum install ntpdate
直接矫正时间
sudo ntpdate pool.ntp.org
再次检查时间
date
ps:一定要注意时间的一致性,有些软件安装脚本里面有curl和wget命令,日期对不上真的坑的一批
echo
用于在终端或脚本中输出文本内容
-n
: 不输出结尾换行符(还没想好它的应用场景)-e
: 启用 \ 的转义解释(字符串中的 \n 会看做换行,\t 看作制表符号-四个空格)-E
: 禁用用 \ 的转义解释(默认)
示例:
输出一些字符串
echo -e 'Hello World!\nApple\tBanana'
-
-n
的使用
-
将内容保存至 file1.txt 文件(会清空文件原内容)
echo 'This is a new line!!' > file1.txt
- 将内容追加到文件file1.txt
echo 'THIS IS A NEW LINE!!' >> file1.txt
- 输出颜色和格式化文本(一般用不到)
echo -e "\033[31mRed text\033[0m" #红色
echo -e "\033[1mBold text\033[0m" #加粗
- echo也常与变量使用
#格式化显示当前日期
echo "现在的日期是: $(date +%Y-%m-%d)"
echo "现在的时间是: $(date +%H:%M:%S)"
top
用于实时监控系统性能
命令模式下参数
-b
: 以批处理模式运行top,可以将输出重定向到文件或其他命令-c
: 显示完整的命令行而不是只显示命令名-d <秒>
: 设置刷新间隔,以秒为单位-n <次数>
: 设置top命令的刷新次数,达到指定次数后退出-p <进程ID>
: 只监控指定的进程ID-u <用户名>
: 只监控指定用户的进程-U <用户ID>
: 只监控指定用户ID的进程-o <字段>
: 按指定字段对进程进行排序-i
: 忽略闲置和僵死进程-H
: 显示线程而不是进程
交互模式下控制
- 按
h
键显示帮助信息 - 按
q
键退出top命令 - 按
m
键切换内存使用信息的显示方式 - 按
P
键按CPU使用率对进程进行排序 - 按
M
键按内存使用量对进程进行排序
示例
显示系统的实时状态
top
- 设置刷新间隔为 2 秒,刷新 10 次后退出
top -d 2 -n 10
- 只监控 PID 为1234 的进程
top -p 1234
- 只监视用户 fishpie 的进程
top -u username
- 按 CPU 使用率从高到底排序
top -o %CPU
- 显示线程而不是进程
top -H
sysdig
很强大的系统监控工具,简洁高效
添加 sysdig 官方仓库
sudo tee /etc/yum.repos.d/draios.repo <<-'EOF'
[draios]
name=Draios Inc. - $basearch
baseurl=https://download.sysdig.com/stable/rpm/$basearch
enabled=1
gpgcheck=1
gpgkey=https://download.sysdig.com/DRAIOS-GPG-KEY.public
EOF
更新 yum 包
yum update
安装 sysdig 0.36.0 版本,GitHub下载地址:https://github.com/draios/sysdig/releases
sudo yum install -y sysdig-0.36.0
常用命令:
- 查看当前 CPU 使用最高的进程
sysdig -c topprocs_cpu
- 查看当前网络使用最高的进程
sysdig -c topprocs_net
- 查看当前磁盘使用最高的进程
sysdig -c topprocs_file
- 显示所有网络连接,与直接使用netstat类似
sysdig -c netstat
- 列出当前系统的所有进程
sysdig -c ps
- 查看 /etc 目录与其中内容的打开情况
sysdig fd.name contains /etc
sed
流编辑器,常用于文本处理和转化
可以对文本文件进行逐行处理,修改、过滤、替换
语法
sed [options] 'command' input_file
option部分
-n
: 抑制自动打印模式空间,只打印匹配的行-e
: 允许在命令行中指定多个sed
命令-f
: 从文件中读取sed
命令-i
: 直接修改输入文件,而不是将结果输出到标准输出-r
: 使用扩展正则表达式
command部分
p
: 打印匹配的行d
: 删除匹配的行s/pattern/replacement/
: 替换匹配的文本g
: 全局替换,默认只替换每行的第一个匹配项i
: 在匹配行之前插入文本a
: 在匹配行之后追加文本c
: 用新文本替换匹配的行y/set1/set2/
: 将set1
中的字符转换为set2
中对应位置的字符q
: 退出sed
示例:
有文件file2.txt
John,Doe,25,New York
Alice,Smith,30,Chicago
Bob,Johnson,27,Los Angeles
- 打印文件的第 3 行
sed -n '3p' file.txt
- 删除文件第 5 行
sed '5d' file.txt
- 将 file2.txt 文件中的 New York 替换为 Washington
sed 's/New York/Washington/g' file2.txt
- 在 file2.txt 第二行后追加一行文本
sed '2a New line' file2.txt
- 删除 file2.txt 文件中包含 25 的行
sed '/25/d' file2.txt
systemctl
服务管理器,用于管理系统服务,可以自定义服务
- 列出所有服务(包括运行中的和未运行的服务):
systemctl list-units --type=service
- 仅列出运行中的服务:
systemctl list-units --type=service --state=running
- 查看特定服务的状态:
systemctl status <服务名称>
#示例:
systemctl status NetworkManager
- 设置服务开机自启动
systemctl enable <服务名称>
自定义自己需要的后台程序为一个服务,再将这个服务设置为开机自启动,相对于直接使用 nohup
命令使服务长时间后台运行效果要好
- 关闭服务的开机自启动
systemctl disable <服务名称>
- 自定义服务
需要管理员权限
例如创建一个名为 blog-backend.service
的自定义服务
- 在
/etc/systemd/system/
目录下创建 blog-backend.service 文件
vim /etc/systemd/system/blog-backend.service
blog-backend.service 文件内容
[Unit]
Description=这里是一个做成服务的后台程序
[Service]
ExecStart=/usr/bin/java -jar /home/fishpie/blog/backedn.jar
User=fishpie
Restart=always
StandardOutput=file:/home/fishpie/bloglog/logfile.log
StandardError=file:/home/fishpie/blog/log/logfile.log
[Install]
WantedBy=multi-user.target
[Unit] 中的 Description 是服务描述部分
[Service]部分
ExecStart ——— 指定启动服务所执行的命令
User ——— 运行这个服务的用户身份(即使使用 sudo 运行这个服务,该服务的运行身份依然是fishpie )
Restart ——— 服务的重启策略,always
表示无论服务是什么原因停止,都将自动重启服务
StandardOutput ———– 指定标准输出的文件
StandardError ——– 指定标准输出的错误文件
[Install]部分
WantedBy ———– 指定服务的目标单元,multi-user.target
表示当系统运行在多用户模式时,这个服务将被启用
此时可以启动该 blog-backend.service
服务
sudo systemctl start blog-backend.service
也可以查看服务状态与设置开机自启动
相对于 nohup
命令可靠性更高,因为在进程崩溃时会自动重启(服务设置文件中配置),日志收集也更加方便,便于管理
curl
用于请求 Web 服务器,命令行版 postman
语法:
curl [options] [URL]
参数:
请求方法与数据传输相关:
-X
/--request
:指定请求方法(默认为 GET 请求)-d
/--data
:发送 POST 数据--json
:发送 JSON 数据-H
/--header
:设置请求标头-i
/--include
显示请求标头-u
/--user
:基本认证-b
/--cookie
:发送 cookie
# 向网站 https://api.example.com/login 发送 POST 请求,并在请求头指定数据类型为 JSON 数据,参数为 {"username":"admin","password":"123456"}
方式一:
curl -X POST -H "Content-Type": application/json \
-d '{"username":"admin","password":"123456"}' \
https://api.example.com/login
方式二:
curl -X POST -json '{"username":"admin","password":"123456"}' \
https://api.example.com/login
# 发送 cookie 数据(session是存放在服务器端的特殊cookie)
curl -b "session=123" https://example.com
输出控制:
-o
/--output
:将服务器回应输出写入文件,可以当成 wget 命令来用-O
/--remote-name
:将服务器回应输出写入文件,使用 URL 结尾部分作为文件名
# 将 http://fishpie.top 网页内容保存为 fishpie.html 文件
curl -o fishpie.html http://fishpie.top
# 将 https://example.com/file.zip 保存为 file.zip 文件
# 即下载 https://example.com/file.zip 文件
curl -O https://example.com/file.zip
调试相关:
-v
/--verbose
:显示详细信息-I
/--head
:仅显示响应头
代理相关:
-x
[代理网站] [目标网站] :通过代理网站访问目标网站
重定向相关:
-L
:跟随重定向,让 HTTP 请求跟随服务器的重定向(默认不进行重定向)
显示 curl 的版本信息:
curl -V