1、文件目录操作
ls命令
所有ls可以进行组合使用
ls -a #列出目录所有文件,包含以.开始的隐藏文件
ls -A #列出除.及..的其它文件
ls -r #反序排列
ls -t #以文件修改时间排序
ls -S #以文件大小排序
ls -h #以易读大小显示
ls -l #除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来
#列出当前目录中以“l"开头的目录的详细内容
ls -l l*
cd命令
切换目录,其中 ./指当前目录
#进入根目录
cd /
#进去当前账户home目录
cd ~
#返回上次所在的目录
cd -
pwd命令
查看当前工作目录路径
#显示当前目录
pwd
#显示当前软连接的实际目录
pwd -P
mkdir 命令
创建文件夹
#在当前目录下创建目录
mkdir test
#在/tmp下创建建目录(不存在就创建)
mkdir -p /tmp/test
rmdir命令
删除文件夹,递归删除多个目录需要添加-P
,另外只能删除空目录
mv命令
移动或修改文件名
-f #force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i #若目标文件已经存在,就会询问是否覆盖
-u #若目标文件已经存在,且比目标文件新,才会更新
#重命名,不同路径代表移动文件
mv test.txt test.json
#将文件 file1 改名为 file2,如果 file2 已经存在,则询问是否覆盖
mv -i log1.txt log2.txt
#将本级所有文件移动到上一级
mv * ../
cp命令
复制文件或目录到新的路径,和mv操作类似
-i #提示
-r #复制目录及目录内所有项目
-a #复制的文件与原文件时间一样
-p #连同文件的属性一起复制过去,而非使用默认属性(备份常用)
-u #目标文件与源文件有差异时才会复制
rm命令
删除文件或目录
-f #忽略不存在的文件,不会出现警告,强制删除!
-r #递归删除目录!
-i #提示,删除询问是否删除
#删除任何 .log 文件,删除前逐一询问确认
rm -i *.log
ln命令
硬链接:A—B,假设B是A的硬链接,那么他们两个指向了同一个文件!允许一个文件拥有多个路径,用户可以通过这种机制建立硬链接到一些重要文件上,防止误删!
软链接: 类似Window下的快捷方式,删除的源文件,快捷方式也访问不了!
- -b 删除,覆盖以前建立的链接
- -d 允许超级用户制作目录的硬链接
- -f 强制执行
- -i 交互模式,文件存在则提示用户是否覆盖
- -n 把符号链接视为一般目录
- -s 软链接(符号链接)
- -v 显示详细的处理过程
ln [参数][源文件或目录][目标文件或目录]
#创建软连接
ln -s test1.log link2013
tar命令
文件打包与解压
-c #新建打包文件
-t #查看打包文件的内容含有哪些文件名
-x #解打包或解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
-j #通过bzip2的支持进行压缩/解压缩
-z #通过gzip的支持进行压缩/解压缩
-v #在压缩/解压缩过程中,将正在处理的文件名显示出来
-f filename #filename为要处理的文件
-C dir #指定压缩/解压缩的目录dir
#文件打包
tar -zcvf 打包名 文件
#举例
tar -zcvf design.tar.gz design/
#文件解压
tar -zxvf 文件名
scp命令
Linux远程拷贝文件
#上传文件
scp 文件名 用户名@ip:服务器绝对路径目录
#上传design.tar.gz到服务器/shawn目录下
scp design.tar.gz root@114.215.200.70:/shawn
#上传目录
scp -r 目录 用户名@ip:服务器绝对路径目录
echo命令
# 若不存在就创建,存在就覆盖,使用>>为追加
echo 'hello world' > hw.text
find命令
find 目录 参数
find [目录] -name "*.c"
find /usr/bin -type f -atime +100 #搜索在过去100天内未被使用过的执行文件
find /usr/bin -type f -mtime -10 #搜索在10天内被创建或者修改过的文件
whereis halt #显示一个二进制文件、源码或man的位置
which halt #显示一个二进制文件或可执行文件的完整路径
touch命令
创建新文件,也可以使用vim/vi创建
2、文本处理
grep 命令
分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工等等
grep Aug /var/log/messages #在文件 /var/log/messages中查找关键词"Aug"
grep ^Aug /var/log/messages #在文件 /var/log/messages中查找以"Aug"开始的词汇
grep [0-9] /var/log/messages #选择 /var/log/messages'文件中所有包含数字的行
grep Aug -R /var/log/* #在目录 /var/log'及随后的目录中搜索字符串"Aug"
sed 's/stringa1/stringa2/g' example.txt #将example.txt文件中的 "string1" 替换成 "string2"
sed '/^$/d' example.txt #从example.txt文件中删除所有空白行
paste 命令
paste file1 file2 #合并两个文件或两栏的内容
paste -d '+' file1 file2 #合并两个文件或两栏的内容,中间用"+"区分
sort 命令
sort file1 file2 #排序两个文件的内容
sort file1 file2 | uniq #取出两个文件的并集(重复的行只保留一份)
sort file1 file2 | uniq -u #删除交集,留下其他的行
sort file1 file2 | uniq -d #取出两个文件的交集(只留下同时存在于两个文件中的文件)
comm 命令
comm -1 file1 file2 #比较两个文件的内容只删除 'file1' 所包含的内容
comm -2 file1 file2 #比较两个文件的内容只删除 'file2' 所包含的内容
comm -3 file1 file2 #比较两个文件的内容只删除两个文件共有的部分
3、文件基本属性
Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。在Linux中我们可以使用 ll
或者 ls –l
命令来显示一个文件的属性以及文件所属的用户和组
lrwxrwxrwx. 1 root root 7 5月 11 2019 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 11月 14 14:11 boot
drwxr-xr-x 7 root root 73 1月 2 11:29 data
在Linux中第一个字符代表这个文件是目录、文件或者链接文件等等。
- 当为【d】则是目录
- 当为【-】则是文件
- 若是【l】则标识为链接文档(link file)
- 若是【b】则表示为装置文件里面的可供储存的接口设备(可随机存取装置)
- 若是【c】则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
从左至右用0-9这些数字来表示。
第0位确定文件类型,第1-3位确定属主(该文件的所有者)拥有该文件的权限。第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中:
- 第1、4、7位表示读权限,如果用"r"字符表示,则有读权限,如果用"-"字符表示,则没有读权限;
- 第2、5、8位表示写权限,如果用"w"字符表示,则有写权限,如果用"-"字符表示没有写权限;
- 第3、6、9位表示可执行权限,如果用"x"字符表示,则有执行权限,如果用"-"字符表示,则没有执行权限。
对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。同时,在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文件所有者的同组用户和其他用户。因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。
chgrp命令
更改文件属组
#-R表示递归更改文件属组,就是在更改某个文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
chgrp [-R] 属组名 文件名
chown命令
更改文件的属主,也可以同时更改文件的属组
chown [-R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
#将install.log的拥有者与属组改回root
chown root:root install.log
chmod命令(重要)
更改文件9个属性
Linux文件属性由两种设置方法,一种是数字,一种是符号。Linux文件的基本权限就有9个,分别是owner、group、others三种分别各有自己的read、write、execute权限。其中
- r:4
- w:2
- x:1
#将test目录下所有文件启动所有权限
chmod -R 777 test
#给文件增加执行权限
chown +x test
4、文件内容查看
Linux系统中使用以下命令来查看文件的内容:
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
- n 显示的时候,顺道输出行号
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
head -n 2 file #查看一个文件的前两行
tail -n 2 file #查看一个文件的最后两行
tail -n +1000 file #从1000行开始显示,显示1000行以后的
cat filename | head -n 3000 | tail -n +1000 #显示2000行到3000行
cat filename | tail -n +3000 | head -n 1000 #从第3000行开始,显示1000(即显示3000~3999行)
可以使用man [命令]
来查看各个命令的使用文档
cat 文件
nl [-bnw] 文件
head [-n number] 文件
#对于文本处理工具还有sed和awk两个强大的工具
wc命令
# 查看文件里有多少行
wc -l filename
# 看文件里有多少个word
wc -w filename
# 文件里最长的那一行是多少个字
wc -L filename
# 统计字节数
wc -c
5、磁盘管理
df命令
检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
df [-ahikHTm] [目录或文件名]
选项与参数:
- -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
- -k :以 KBytes 的容量显示各文件系统;
- -m :以 MBytes 的容量显示各文件系统;
- -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
- -H :以 M=1000K 取代 M=1024K 的进位方式;
- -T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
- -i :不用硬盘容量,而以 inode 的数量来显示
du命令
du [-ahskm] 文件或目录名称
选项与参数:
- -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
- -h :以人们较易读的容量格式 (G/M) 显示;
- -s :列出总量而已,而不列出每个各别的目录占用容量;
- -S :不包括子目录下的总计,与 -s 有点差别。
- -k :以 KBytes 列出容量显示;
- -m :以 MBytes 列出容量显示;
# 查询目录大小
du -sh design/
6、账户管理
useradd命令
添加用户
- -m: 自动创建这个用户的主目录 /home/shawn
- -G : 给用户分配组!
#创建用户,主目录 /home/shawn,本质往/etc/passwd写入了信息
useradd -m shawn
userdel命令
删除用户
#加上-r即删除时将目录空间一并删除
userdel [-r] shawn
usermod命令
修改账户信息
#修改主目录
usermod -d /home/shawn22 shawn
passwd命令
用户口令的管理,用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
passwd 选项 用户名
可使用的选项:
- -l 锁定口令,即禁用账号。
- -u 口令解锁。
- -d 使账号无口令。
- -f 强迫用户下次登录时修改口令。
普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。
具体账户管理可以参考:Linux账户管理
7、进程管理
- 在Linux中,每一个程序都是有自己的一个进程,每一个进程都有一个id号
- 每一个进程呢,都会有一个父进程!
- 进程可以有两种存在方式:前台/后台运行
- 一般的话服务都是后台运行的,基本的程序都是前台运行的!
ps命令
查看系统当前正在执行的各种进程信息
ps -xx
命令参数:
- a 显示所有进程
- -a 显示同一终端下的所有程序
- -A 显示所有进程
- c 显示进程的真实名称
- -N 反向选择
- -e 等于“-A”
- e 显示环境变量
- f 显示程序间的关系
- -H 显示树状结构
- r 显示当前终端的进程
- T 显示当前终端的所有程序
- u 指定用户的所有进程
- -au 显示较详细的资讯
- -aux 显示所有包含其他使用者的行程
# ps -aux 查看所有的进程
ps -aux|grep mysql
# | 在Linux这个叫做管道符 A|B 相当于前面的操作结果通过管道当做后面命令的输入
# grep 查找文件中符合条件的字符串!
# 看父进程我们一般可以通过目录树结构来查看!
ps -ef|grep mysql
#进程树,-p显示父id, -u显示用户组
pstree -pu
top命令
cpu状态显示:
- us, user: 运行(未调整优先级的) 用户进程的CPU时间
- sy,system: 运行内核进程的CPU时间
- ni,niced:运行已调整优先级的用户进程的CPU时间
- wa,IO wait: 用于等待IO完成的CPU时间
- hi:处理硬件中断的CPU时间
- si: 处理软件中断的CPU时间
- st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。
各进程(任务)的状态监控:
PID:进程ID,进程的唯一标识符
USER:进程所有者的实际用户名。
PR:进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。
NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:SHR是进程使用的共享内存。共享内存大小,单位kb
S:这个是进程的状态。它有以下不同的值:
- D - 不可中断的睡眠态。
- R – 运行态
- S – 睡眠态
- T – 被跟踪或已停止
- Z – 僵尸态
%CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。
%MEM:进程使用的可用物理内存百分比。
TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)
c: 显示完整的命令
d: 更改刷新频率
f: 增加或减少要显示的列(选中的会变成大写并加*号)
F: 选择排序的列
h: 显示帮助画面
H: 显示线程
i: 忽略闲置和僵死进程
k: 通过给予一个PID和一个signal来终止一个进程。(默认signal为15。在安全模式中此命令被屏蔽)
l: 显示平均负载以及启动时间(即显示影藏第一行)
m: 显示内存信息
M: 根据内存资源使用大小进行排序
N: 按PID由高到低排列
o: 改变列显示的顺序
O: 选择排序的列,与F完全相同
P: 根据CPU资源使用大小进行排序
q: 退出top命令
r: 修改进程的nice值(优先级)。优先级默认为10,正值使优先级降低,反之则提高的优先级
s: 设置刷新频率(默认单位为秒,如有小数则换算成ms)。默认值是5s,输入0值则系统将不断刷新
S: 累计模式(把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+ )
T: 根据进程使用CPU的累积时间排序
t: 显示进程和CPU状态信息(即显示影藏CPU行)
u: 指定用户进程
W: 将当前设置写入~/.toprc文件,下次启动自动调用toprc文件的设置
<: 向前翻页
>: 向后翻页
?: 显示帮助画面
1(数字1): 显示每个CPU的详细情况
kill命令
杀死进程,结束任务
#表示强制结束该进程,进程id可通过ps查看
kill -9 进程的id
#正常停止一个进程
kill -15 进程的id
#杀死所有相关的进程
killall 进程名字
#强制关闭进程名包含xxx的所有进程
ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9
nohup命令(后台)
后台执行程序(no hang up不挂起)
nohup command > myout.file 2>&1 &
- command>out.file是将command的输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中
- 2>&1 也就表示将错误重定向到标准输出上
- & 放在命令到结尾,表示后台运行
#启动python程序并将输出输出到python.txt文件中,后台
nohup python tools/train.py> python.txt 2>&1 &
- ctrl + z 可以将一个正在前台执行的命令放到后台,并且处于暂停状态。
- Ctrl+c 终止前台命令。
- jobs 查看当前有多少在后台运行的命令。jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。
8、系统命令
- shutdown -h now 关闭系统(1)
- init 0 关闭系统(2)
- telinit 0 关闭系统(3)
- shutdown -h hours:minutes & 按预定时间关闭系统
- shutdown -c 取消按预定时间关闭系统
- shutdown -r now 重启(1)
- reboot 重启(2)
- logout 注销
- time 测算一个命令(即程序)的执行时间
- uname -a # 查看系统内核信息
- cat /proc/version # 查看系统内核版本
9、网络相关
#配置dns
vim /etc/resolv.conf
#查看域名路由表
nslookup google.com
# 最近登录的5个账号
#可以参考https://blog.csdn.net/lemon_TT/article/details/121140378
last -n 5
#查看什么进程使用了该端口
lsof -i:port
#另外还会有nc、tcpdump、traceroute、ss等tcp调试命令
# ssh相关可以参考https://blog.csdn.net/lemon_TT/article/details/115253490
还有iperf3带宽测试,iperf3是一款带宽测试工具,它支持调节各种参数,比如通信协议,数据包个数,发送持续时间,测试完会报告网络带宽,丢包率和其他参数
# 首先安装
sudo apt install iperf3
# Interval表示时间间隔,Transfer表示时间间隔里面转输的数据量,Bandwidth是时间间隔里的传输速率
# 服务端先开启iperf服务器模式,指定TCP端口1314
iperf3 -s -i 1 -p 1314
# 然后打开A(内)做client端,连接服务器端1314端口
iperf3 -c 10.10.0.2 -i 1 -t 60 -p 1314
# 下面是测试UDP
iperf3 -s -i 1 -p 1314
iperf3 -u -c 10.10.0.2 -b 100m -t 60 -p 1314
# 进行上下行带宽测试(TCP双向传输)
iperf3 -c 192.168.0.120 -d -t 60
# 测试多线程TCP吞吐量,如果没有指定发送方式,iPerf客户端只会使用单线程
iperf3 -c 192.168.0.120 -P 30 -t 60
# 测试上下行带宽(UDP双向传输)
iperf3 -u -c 192.168.1.1 -b 100M -d -t 60
# iperf3常用参数
# -s,--server:iperf服务器模式,默认启动的监听端口为5201,eg:iperf -s
# -c,--client host:iperf客户端模式,host是server端地址,eg:iperf -c 222.35.11.23
# -i,--interval:指定每次报告之间的时间间隔,单位为秒,eg:iperf3 -c 192.168.12.168 -i 2
# -p,--port:指定服务器端监听的端口或客户端所连接的端口,默认是5001端口。
# -u,--udp:表示采用UDP协议发送报文,不带该参数表示采用TCP协议。
# -l,--len:设置读写缓冲区的长度,单位为 Byte。TCP方式默认为8KB,UDP方式默认为1470字节。通常测试 PPS 的时候该值为16,测试BPS时该值为1400。
# -b,--bandwidth [K|M|G]:指定UDP模式使用的带宽,单位bits/sec,默认值是1 Mbit/sec。
# -t,--time:指定数据传输的总时间,即在指定的时间内,重复发送指定长度的数据包。默认10秒。
# -A:CPU亲和性,可以将具体的iperf3进程绑定对应编号的逻辑CPU,避免iperf进程在不同的CPU间调度。
加深版:https://mp.weixin.qq.com/s/iWST4cIIhf12rjYWAZqURQ
对于shell的学习,可以参考:
https://book.apeland.cn/details/274/