文章目录
10个重要的Linux ps命令实战
Linux查找并杀死僵尸进程
Linux lsof
在虚拟机目录
/home/yao/linux命令
下有部分相关的文件
tar
参考:
打包提tgz:
# 将XXXX文件夹压缩成 --> XXXX.tgz
tar zcvf XXXX.tgz XXXX
解包tgz:
tar zxvf XXX.tgz
grep
grep -r 'int' .
在当前文件夹下的所有文件中查找'int'
grep int main.c
显示main.c中i包含int的行
grep Int main.c -i
-i:忽略大小写
grep int main.c -c
-c:显示main.c中i包含int的行数
grep 'int' main.c -n
-n:显示行号
grep -d update /etc/acpi
-d 当指定要查找的是目录而非文件时,必须使用这项参数
grep '2020-05-18 12:34' *.log
用在查找日志
grep '12:34' *.log -n
-n:显示行号
grep '12:34' *.log -n -c
-c:显示行数
grep -v 'info' *.log
-v:反向查找,找不是info的行
grep –e "正则表达式" 文件名
^符号用于限定开始字符
awk
log.txt:
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
awk '{print $1,$4}' log.txt
打印第1列、第4列的内容,打印结果如下:
2 a
3 like
This's
10 orange,apple,mongo
awk '{printf "%-8s %10s\n" ,$1, $4}' log.txt
格式化打印第1/4列的内容:
2 a
3 like
This's
10 orange,apple,mongo
awk -F, '{print $1}' log.txt
-F:指定分隔符为",",打印第1列:
2 this is a test
3 Are you like awk
This's a test
10 There are orangeapple
awk -va=1 '{print $1,$2+a}' log.txt
设置变量a=1,打印第1列以及第1列+a的值:
2 3
3 4
This's 1
10 11
awk '$1>2' log.txt
打印满足条件'$1>2'的行:
3 Are you like awk
This's a test
10 There are orange,apple,mongo
awk '$1==2' log.txt
打印满足条件'$1==2'的行:
3 Are you like awk
This's a test
10 There are orange,apple,mongo
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt
打印满足条件'$1>2 && $2==are'的行的第1/2/3列:
3 Are you
运行awk脚本
1)先准备好一个普通的文件score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
2)cal.awk文件用于对score.txt进行操作
#运行前执行的语句,需要注意{和bEGIN必须在同一行
BEGIN{
math = 0
english = 0
computer = 0
printf "NAME NO. MATH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
#运行时执行的语句
{
math += $3
english += $4
computer += $5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后执行的语句,NR表示已经读出的行数
END{
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
3)执行awk命令,用-f参数指定awk文件
awk -f cal.awk score.txt
运行结果如下:
NAME NO. MATH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00
locate
locate的左右类似于find,用于查找目录或文件,但是locate一般比find要快,因为它是在一个数据库里面去查;
sudo updatedb
: 由于是在数据库里面查,而不是在硬盘里面查,所以数据库可能会需要更新:
locate version4
: 在/
目录下查找文件名或目录名中包含version4
的目录或文件,注意只要绝对路径包含version4就会被找到:
ps
-a:all with tty,不会显示TTY为?的进程
-x:也会显示TTY项为?的进程
-e:显示所有进程(包括TTY为?的)
-A:与-e同义
-f:full-format,显示全部格式
--sort -pXXX:以XXX排序,例如以CPU利用率等
u:user-oriented format,面向用户的格式
-u XXX:显示用户XXX拥有的进程(包括TTY为?的)
-p XX:进程号为p的进程
-o 列1,列2:指定需要输出的列
输出格式:
UID | PID | PPID | STAT | C/%CPU | %MEM | STIME | TTY | TIME | CMD |
---|---|---|---|---|---|---|---|---|---|
用户id | 进程号 | 父进程号 | 进程状态 | CPU利用率 | 内存利用率 | 创建时间 | 终端 | 执行时间 | 启动命令 |
R:Runnable(运行):正在运行或在运行队列中等待
S:Sleeping(休眠):休眠中,受阻,等待某个条件的形成或接收信号
D:un interruptible sleep:不可中断状态,表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不允许其他进程或中断打断这个进程。进程长时间处于不可中断状态,通常表示系统有 I/O 性能问题。
Z:zombie:僵死进程,进程已经终止但是尚未被其父进程获取信息
T:stopped:结束,
后缀:
<:优先级高的进程
N:优先级低的进程
L:有些页被锁进内存
s:进程的领导者(在它之下有子进程)
+:位于后台的进程组
ps
,显示进程信息
ps -ef | less
,查看所有进程(-e),全部格式(-f)
ps -u yao | less
,显示用户yao的进程:
ps -x | less
:会输出当前用户yao的所有进程(包括那些没有tty的),因此它的结果与ps -u yao
类似,但出的格式不同:
ps -ax | less
,显示所有进程,包括那些没有tty的,因此输出的进程会跟ps -e
类似,但是格式不同:
ps -aux | less
,以面向用户的格式,输出所有进程:
ps -aux --sort -pcpu
,输出以cpu利用率排序:
ps -aux --sort -pcpu
,输出以内存占用率排序:
ps -p 1
,查找进程号为1的进程:
- 找到僵尸进程
1)使用-o
参数指定输出pid、ppid、stat:
2)ps -aux|awk '{print $8}|grep Z
再使用grep进行查找,c此时系统中没有僵尸进程,所以没有结果:
3)可以用top看一下是不是真的没有僵尸进程,结果是没有:
4)假设存在僵尸进程,那么如果想清除僵尸进程,就必须杀死其父进程。
kill
kill其实是向进程发送一个信号:
kill 12345 #杀死进程(默认发送信号是15)
kill -HUP 12345 #向进程发送SIGHUP信号
kill -9 12345 #彻底杀死进程(9是信号SIGKILL,不能被进程忽略或者捕获)
kill -l #显示信号列表
信号含义的列表如下:

netstat
-n:--numeric,会显示IP和端口,一般都会带上
-p:显示对应的进程PID
-a:显示所有连线中的Socket。
-l:--listening,显示监听中的服务器的Socket
-t:显示tcp
-u:显示udp
netstat -anp | less
显示所有网络连接信息:
netstat -npl | grep 21
查找正在监听21号端口的进程,注意-a与-l不能混用,否则会显示所有连接:
lsof
是一个列出当前系统打开文件的工具,在Linux中任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。最好在root权限下执行,否则可能权限不够:
lsof -u yao
查看用户yao的进程所打开的文件
lsof -p 1| less
,查看进程号PID为1的进程打开的文件:
lsof -c systemd
,-c
表示可执行文件名称(COMMAND列):
lsof -i:21
,查看占用21端口的进程状态:
lsof -i:1-1024
,查看占用端口1-1024的进程状态:
lsof -t -i:21
,-t
只输出PID,在杀死进程时十分有用
find
man find
查看帮助,或者参考:菜鸟教程。
# 命令的格式为:
find [path...] [expression]
# 常用格式如下:
find [目录路径,默认为.] [-maxdepth n] [-size [+-]XXb] [-user XXX] [-type X] [-name XXXX]
# expression说明
-maxdepth n:搜索的最深层次为n,n = 0 时表示只在指定路径查找;
-size [+-]XXb:目标文件文件的大小,b代表512位元组的区块,k表示kilo bytes,M表示MB
-user XXX:查找所有者为XXX的文件;
-type X:目标类型为X,X的取值:d代表目录,f代表普通文件;
-name XXX:目标文件或目录名为XXX;
用法举例:
-
查找最大深度为2,所有者为root:
-
查找最大深度为5,名称为lock的文件或目录:
-
查找./network文件夹下,最大深度为5,大小大于20000 KB(kilo bytes)/ 大于10MB 的文件;
-
查找在目录./network/myhttp/version4下,最大目录深度为1,类型为目录:
du
主要用于显示目录/文件的大小。
-a:既显示目录又显示文件(默认条件下du只会显示目录,不显示文件)
--max-depth=XX:规定最大目录深度为XX,这可以避免递归层数太深
-h:用人性化方式显示,但需要注意,用-h之后再用sort就不能完成正确的排序了
-s:只显示统计大小,也就是只显示`.`这一项;
du
:递归显示当前目录下的目录大小:
du -a
既显示目录又显示文件
du -s -h
:人性化方式显示统计数据(只显示当前目录大小):
du --max-dept=2 | sort -nr
找出/home/yao
目录下的大目录
,并用sort进行排序(对于sort -n表示按数值排序,-r表示倒序)
- 与上面的类似,
-m
表示以MB为单位:
- 不能使用
-h
进行排序,原因是单位不同(有的是KB,有的是MB…):
df
用于显示文件系统的磁盘使用情况
统计,常用参数:

df
显示文件系统的磁盘使用情况统计:
df -h
打开超大文件
head -1000 '2020-07-01(1).log' > tmp.log
,将日志文件最后的1000行写入到tmp.log中;tail - 1000 '2020-07-01(1).log' > tmp.log
,将日志文件最前面的1000行写入到tmp.log中;sed -n '10,1000p' '2020-07-01(1).log' > tmp.log
,将日志文件的10到1000行写入到tmp.log中(共991行);
tail
4. tail -n 100 '1.log' 或 tail -n -100 '1.log'
:显示最后100行数据
5. tail -n +100 ''
:显示第100行(包括第100行)到最后1行
head
6. head -n 100 1.log 或 head- n +100 1.log
:显示前100行数据
7. head -n -100 1.log
:显示第1行到倒数第100行的数据(不包括第100行)
more/less
- more:按照页来显示文本,"空格"键向下翻页,"b"键往上翻页,还支持vi的查找之类的;
- less:不是一次性显示文本的,"向上"键往上看,"向下"键往下看,"空格"键向下翻页,"b"键往上翻页,还支持vi的查找之类的。
链接
掘金“软链接” 和“硬链接”的区别
知乎:linux为什么不能硬链接目录
- 硬链接是:将硬链接的名称与对应文件的inode号链接,会使该inode的引用计数加1,。只有当inode的引用计数为0 时才会被删除。
- 软链接是:相当于windows下的快捷方式,它实际上是一个特殊的文件,有自己的inode和自己的内容,而它的内容就是对应文件(或目录)的绝对路径;
- 硬链接只能作用在文件上,不能作用在目录上;
- 软链接既可以作用在文件上,又可以作用在目录上;
例子
1)首先创建一个文件,并写入一行内容:
2)对它创建一个硬链接,可以看到它们的inode号都是524942:
通过硬链接修改文件,可以看到,可以通过硬链接修改文件的内容(软链接也可以)。
3)创建一个软链接,可以看到软链接拥有自己的inode号524947,并且它的类型是"l":
4)如果把myfile删掉,那么对应的inode引用计数减一,硬链接hard依然能访问;而绝对路径(…/…/…/myfile)失效,导致软链接失效(失效不代表被删除):
画个图来看就是:
为什么硬链接不能作用在目录上面
假设上述行为被允许。ln1是目录dir2的链接,dir2下面有ln2,于是ln1下面也会有ln2,也就是/dir1/ln1/ln2;而ln2是dir1的链接,dir1目录下有ln1,于是/dir1/ln1/ln2下也有ln1,也就是/dir1/ln1/ln2/ln1;以此类推,将会是无限的循环,因此不允许硬链接作用在目录上。
top
常见问题
杀死指定端口下的进程
# 一条命令
kill -9 'lsof -t -i:8080' # lsof -t -i:8080 只输出进程号PID
# 两条命令
# 先找到pid
lsof -i:8080 或者 netstat -anp|grep 8080
# 再用kill
kill -9 pid
找到大于XXMB的文件并删除
再用rm即可
which
查看二进制文件安装的位置:
which cd
which ls
which mysql
其他
在vim中执行外部命令::! ls