大河向东流
4859字约16分钟
Linux
2024-10-07
作者:大河向东流
签名:愿头发如星辰,永不凋零于这片数据之海。
🐾 友情链接 🌵 CC BY-NC-ND 协议
熟练掌握Linux常用命令对Java开发工程师而言,具有诸多显著优势。首先,它极大地提升了开发效率,使得工程师能够在Linux环境下迅速执行编译、运行、测试等开发流程,从而加速Java应用的开发进度。其次,这有助于开发工程师更好地熟悉和理解生产环境中的Linux系统,为应用的顺利部署和后续维护奠定坚实基础。最后,掌握Linux命令还能使开发工程师在调试应用和追踪问题时更加得心应手,快速定位并解决潜在问题,确保应用的稳定性和可靠性。
命令 | 描述 | 命令 | 描述 |
---|---|---|---|
ls | 1.查看文件列表 | cd | 2.切换目录 |
cp | 3.拷贝 | mv | 4.移动 |
rm | 5.删除 | lrzsz | 6.文件上传 |
tar, zip | 7.压缩、解压 | scp | 8.文件远程拷贝 |
grep, find | 9.查找、搜索 | md5sum | 10.文件md5值 |
pwd | 11.当前位置 | pwdx | 12.进程位置 |
vi, vim | 13.编辑文本 | diff, vimdiff | 14.差异对比 |
cat, more, less | 15.查看文本 | sed, awk | 16.文本处理 |
ping | 17.网络是否可达 | telnet, ssh | 18.端口连通 |
free | 19.内存查看 | df, du | 20.磁盘查看 |
lsof | 21.进程和端口 | ps, top | 22.进程查看 |
sh | 23.执行脚本 | tail | 24.查看日志 |
kill | 25.终止进程 | nslookup | 26.域名解析 |
# 基本用法
ls
# 列出特定目录(文件和子目录)
ls /path/to/directory
# 列出详细信息(使用长格式列出文件,包括权限、所有者、大小和修改时间等)
ls -l
# 以长格式列出包括隐藏文件在内的所有文件和子目录
ls -la
# 修改时间排序
ls -lt
# 按反向字母顺序排序
ls -lr
# 递归列出目录及其子目录中的内容
ls -R
# 进入指定目录
cd /path/to/directory
# 返回上级目录
cd ..
# 返回用户主目录
cd ~
# 查看当前位置
pwd
# 复制并重命名单个文件,或将文件内容复制到target文件中
cp source.txt target.txt
# 将文件复制到目录中
cp source.txt /path/to/directory/
# 递归复制整个目录
cp -r source_directory target_directory
# 复制多个文件到同一目录中
cp a.txt b.txt /path/to/directory/
# 使用通配符批量复制文件
cp *.txt /path/to/directory/
# 将文件移动到目录中
mv source.txt /path/to/directory/
# 移动文件并重命名
mv source.txt /path/to/directory/target.txt
# 将目录移动到目录中
mv source_directory /path/to/directory/
# 重命名目录
mv source_directory new_source_directory
# 使用通配符批量移动文件
mv *.txt /path/to/directory/
# 删除单文件并确认
rm source.txt
# 删除多个文件并确认
rm source_1.txt source_2.txt
# 使用通配符批量删除文件
rm *.txt
# 删除目录及其所有子目录和文件
rm -r source_directory
# 删除目录并显示详细信息
rm -rv source_directory
# 强制删除文件
rm -f source.txt
# 服务器若无lrzsz,可安装(部分ssh工具支持该命令)
yum install lrzsz
# 上传文件至当前目录中
rz
# 下载文件
sz source.txt
# 将当前目录下的所有文件压缩
zip -r myfiles.zip *
# 指定文件压缩
zip backup.zip file1.txt file2.txt
# 查看压缩包内文件
unzip -l myfiles.zip
# 解压文件
unzip myfiles.zip
tar [选项] 目标文件 源文件或目录...
-c:创建一个新的归档文件。
-x:解压归档文件。
-v:显示归档过程中的详细信息。
-f:指定归档文件名称。
-z:使用gzip进行压缩或解压。
-j:使用bzip2进行压缩或解压。
-J:使用xz进行压缩或解压。
-C:指定解压到的目录。
--exclude:排除指定的文件或目录。
# 压缩文件
tar -czvf /backup/etc.tar.gz /etc
# 解压文件
tar -xzvf myapp.tar.gz
# 解压文件至指定目录
tar -xzvf myapp.tar.gz -C /path/to/target
# 从本地主机复制到远程主机
scp /path/to/local/file username@remote:/path/to/remote/directory
# 从远程主机复制到本地主机
scp username@remote:/path/to/remote/file /path/to/local/directory
# 复制文件夹
scp -r ...(同上)
# 使用压缩功能传输文件
scp -C ...(同上)
# 指定私钥文件进行身份验证
scp -i /path/to/private_key ...(同上)
find 命令用于搜索文件及过滤
# 列出当前目录及子目录中的文件
find .
# 列出当前目录下(不含子目录)文件
find *.txt
# 根据文件名字查找目录下的文件
find /path/ -name a.txt
# 模糊搜索
find /path/ -name *.txt
# 查找当前目录下大于100MB的文件,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)
find . -size +100M
# 查找当前目录下7天内修改过的文件
find . -mtime -7
# 查找当前目录下7天前修改过的文件
find . -mtime +7
# 查找权限为755的文件
find . -perm 755
# 搜索当前目录下的文件并拷贝到指定文件夹下(同理,查找并删除、移动文件、查看文件属性,在-exec后使用对应的命令即可)
mkdir tmp
touch a.txt b.txt
find . -name *.txt -exec cp {} tmp/ \;
# 时间参数
-amin n:查找在 n 分钟内被访问过的文件。
-atime n:查找在 n*24 小时内被访问过的文件。
-cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
-ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。
-mmin n:查找在 n 分钟内被修改过的文件。
-mtime n:查找在 n*24 小时内被修改过的文件。
grep 命令用于搜索文本类内容
# 查找当前目录下所有log文件中的包含2024-11-10时间打印的行信息及行数
grep -n '2024-11-10' *.log
# 查找文件中的指定字符串
grep '2024-11-10' a.log
# 参数信息
-i:忽略大小写进行匹配。
-v:反向查找,只打印不匹配的行。
-n:显示匹配行的行号。
-r:递归查找子目录中的文件。
-l:只打印匹配的文件名。
-c:只打印匹配的行数。
-a 或 --text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --invert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。
# 查看字符串的md5值(-n 是为了移除输出空格 cut是为了移除最后的输出)
echo -n 'hello world' | md5sum |cut -d" " -f1
# 生成文件md5值,平时可用来校验两个文件是否一致
md5sum a.txt
# 查看当前所在目录
pwd
# 例如查看java进程号
jps -l
5432 top.p8r.TestApplication.java
5434 top.p8r.Test2Application.java
# 根据进程号,查看文件位置,即可查看该进程所在的文件目录
pwdx 5432
常用的编辑文本为vi或者vim,常用命令基本相同,够用就好。只是为了防止运维时的不时之需,一般还是可视化窗口好用。
# 打开或创建文件
vim a.txt
# 进入输入模式
i
# 切换到底部命令模式
:
# 在当前行的下方插入一个新行,并进入插入模式
o(小写字母)
# 剪切单行(可当删除使用)
dd
# 剪切5行(可当删除使用)
5dd
# 粘贴剪切板内容到光标下方
p
# 撤销上一次操作
u
# 重做上一次撤销的操作
Ctrl + r
# 保存文件
w
# 保存并退出编辑文件
wq
# 退出文件
q
# 强制退出文件
q!
# 下一页
Ctrl + f
# 上一页
Ctrl + b
# 向下移动半页
Ctrl + d
# 向上移动半页
Ctrl + u
# 移动到文档的最后一行
G
# 移动到文档的第一行
gg
# 光标向下移动5行
5 + Enter
# 搜索文本
:
/word + Enter
# 向下搜索
n
# 向上搜索
N
vimdiff 文件内容对比
# 双窗口对比文本内容,a.txt位于左边窗口,b.txt位于右边窗口
vimdiff a.txt b.txt
也可比对多个文件,编辑同vim操作。编辑过程中依次保存,将会陆续关闭最左侧文件,开始编辑右侧文件。
diff 可用于文件名和文本内容比较
# 比较文本差异,会提示第几行有差异,并进行输出
diff a.txt b.txt
# 比较文件夹,会输出文件名不同的差异,如果文件中有同名文本也会进行输出差异
diff /tmp/1/ /tmp/2/
cat 输入文本内容到窗口中查看
# 查看文本内容
cat a.txt
# 查看行号文本内容
cat -n a.txt
# 将标准输出内容重定向,并覆盖文件的内容
cat a.txt > tmp.txt
# 将标准输出内容重定向,并追加到文件的末尾
cat b.txt >> tmp.txt
# 查看文本的最后2行
cat a.txt | tail -n 2
# 清空文档内容
cat /dev/null > a.txt
more 分页查看
# Enter 向下n行,需要定义。默认为1行
# Ctrl+F 向下滚动一屏
# 空格键 向下滚动一屏
# Ctrl+B 返回上一屏
# q 退出
# 从第三行开始显示内容
more +3 tmp.txt
# 每屏显示4行查看
more -4 tmp.txt
# 查找server字符串,该处前两行开始显示输出
more +/server tmp.txt
# cat查看文件内容也可以用管道符,和more结合使用
cat tmp.txt | more -10
# 同理,当类似一些输出的标准内容,都可以用管道符结合more使用
# 例如,查看进程,并以每页5行显示
ps -ef | more -5
less 同more一样,也是对文本或输入进行分页显示的工具
# 功能比more更强大,但是参数页更多,使用也更复杂,此处不在赘述,more够用了
https://www.runoob.com/linux/linux-comm-more.html
sed 行处理
# 替换将application.yml文件中 IP1 字符串替换为 192.1681.1.100
sed 's/要替换的文本/新文本/g' 文件名
sed -i 's/IP1/192.1681.1.100/g' application.yml
awk 行处理-分段 (重点)
# 打印前十进程的第一列内容,默认以空格分割内容
ps -ef | head -10 | awk '{print $1}'
# 打印前十进程的第一列和第三列内容,默认以空格分割内容,打印内容自定义空格(\t)输出
ps -ef | head -10 | awk '{print $1"\t"$3}'
# 指定以冒号分割内容,打印第二列内容
cat a.txt | awk -F ':' '{print $2}'
ping 探测ip是否可达
# 探测IP
ping 127.0.0.1
# 探测域名(实质上还是先通过DNS解析成IP)
ping www.baidu.com
# 每隔3秒发送一次
ping -i 3 www.baidu.com
# 发送2次,就停止
ping -c 2 www.baidu.com
telnet 工作中经常使用,用于探测当前机器是否和对方机器端口连通,若不同,一般需要申请开通防火墙策略
# 探测对方8088端口是否能通
telnet 192.168.1.100 8088
# 退出
Ctrl + c
# 若无法退出
Ctrl + ] 然后输入 quit
ssh 也可用于测试端口连通性
# 测试
ssh -v 192.168.1.100 -p 8080
free 查看内存
# 查看内存
free -g
# 相关显示参数说明
Mem:
total:表示系统总的物理内存数量
used:已使用的内存量(包含了被缓存和缓冲的内存)
free:表示当前未被分配的内存数量
shared:表示多个进程共享的内存数量,通常为0
buff/cache:表示系统已分配但未被使用的缓冲区内存数量
available:表示系统已分配但未被使用的缓存内存数
Swap:
total:总内存量(包括物理内存和交换空间)
used:已使用的内存量(包含了被缓存和缓冲的内存)
free:未使用的内存量
# 提到内存,需要划重点
系统剩余内存= free + available
# 提到swap分区,需要划重点
Swap交换分区通常会在物理内存不足时被使用,这会导致额外的I/O操作和延迟。当服务器内存不够用时,swap分区可以占用一部分磁盘空间。
一般在生产环境中,申请机器时都会填写几项参数
1.cpu核数
2.内存大小
3.硬盘大小
4.网卡带宽
申请生产的资源前要做好评估,已申请资源不足就提申请扩容。关闭服务器swap分区,具备提高性能、减少磁盘使用、减少系统管理的复杂性的好处。
1.关闭swap分区 swapoff -a
2.开启swap分区 swapon -a
(free -h 命令执行后,swap那一行都是0,就是关闭了)
df 查看系统磁盘使用情况
# 以可读的格式显示输出结果
df -h
# 相关显示参数说明
Filesystem:文件系统名称
Size:总大小
Used:已使用
Avail:空闲
Use%:已使用百分比
Mounted on:文件系统挂载的目录
du 统计文件夹占用大小
# 查看当前目录所有文件的总和
du -sh .
# 查看指定目录以及子目录下的每个文件的大小
du -sh /etc
# 查看目录以及子目录下的所有文件的最后修改时间
du -h --time /etc
lsof 列出进程相关的文件、端口
# 显示占用文件的进程
lsof a.txt
# 使用进程号列出进程打开的文件
lsof -p 23456
# 显示用户打开的文件信息
lsof -u root
# 列出特定端口被哪些进程打开
lsof -i :8080
# 列出等候连接的端口
lsof -i | grep -i LISTEN
# 列出ipv4连接信息
lsof -i 4
# 列出ipv6连接信息
lsof -i 6
# 列出tcp连接信息
lsof -i tcp
lsof -i tcp:8080
# 列出udp连接信息
lsof -i udp
# 列出除了某个用户之外被打开的文件
lsof -u ^root
# 相关参数说明
COMMAND:进程的名称
PID :进程标识符
TID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件
TYPE:文件类型
DEVICE:指定磁盘的名称
SIZE/OFF:文件的大小
NODE:文件的大小
NAME:打开文件的确切名称
ps 查看进程
# 查找cpu占用高的前十进程
ps -eo pid,ppid,%mem,%cpu,comm --sort=-%cpu | head -10
# 查找内存占用高的前十进程
ps -eo pid,ppid,%mem,%cpu,comm --sort=-%mem | head -10
# 查看所有进程(配合grep可以搜索执行进程)
ps -ef
top 查看进程
# 实时显示进程状态
top
# 查看PID=5656的每一个线程
top -p 5656
# 相关参数
PID:进程的ID
USER:进程所有者
PR:进程的优先级别,越小越优先被执行
NInice:值
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
COMMAND:进程启动命令名称
sh 执行脚本
# 执行脚本
sh run.sh
# 使用./执行脚本
chmod +x run.sh 文件赋可执行权
./run.sh
tail 监听文件内容变动
# 监听日志文件
tail -f info.log
# 监听多个文件(打印的时候会输出来内容自于xx文件)
tail -f info.log error.log warn.log
tail -f *.log
# 搜索TestController.java打印的日志
tail -f info.log error.log warn.log | grep 'TestController'
# 监听日志文件,并输出后200行
tail -200f info.log
kill 终止进程
# 查询进程
ps -ef | grep TestJava
# 优雅退出 PID=3452 进程(程序会执行完毕后再终止)
kill 3452
# 强制杀死 PID=3452 进程(生产中少用,以避免数据丢失)
kill -9 3452
# 查看信号量列表(就是参数上述 -9 )
kill -l
1) SIGHUP 挂起信号。
2) SIGINT 中断信号,类似Ctrl+C键。
3) SIGQUIT 退出信号。
4) SIGILL 非法指令信号,通常表示进程执行了非法的机器指令。
5) SIGTRAP 跟踪陷阱信号,通常用于调试目的。
6) SIGABRT 中止信号,通常由进程自己发送并反馈已经崩溃。
7) SIGBUS 总线错误信号,通常表示进程访问了无效的内存地址。
8) SIGFPE 浮点异常信号,通常表示进程执行了无效的浮点操作。
9) SIGKILL 强制终止信号,通常用于强制终止进程。
......等等(共64个)
nslookup 域名解析
# 常用于统计目标域名所解析的IP,然后开通防火墙策略
nslookup www.baidu.com
# 指定dns解析
nslookup www.baidu.com 8.8.8.8
# 若没有该命令,centos可安装
yum install -y bind-utils