赞
踩
在Linux中,ps(Process Status)用于列出系统中当前运行的进程(process)的状态,ps命令列出的是当前那些进程的快照。如果要动态的显示进程信息,需要使用top命令。使用ps命令可以确定当前有哪些进程正在运行中与运行的状态、进程是否结束、进程是否僵死、哪些进程占用过多资源等。
进程的五种状态:
进程状态 | 含义 | 对应ps命令的状态码 |
---|---|---|
运行 | 正在运行或在运行队列中等待 | R运行 runnable(on run queue) |
中断 | 休眠中,受阻,在等待某个条件的形成或接受到信号 | S 中断 sleeping |
不可中断 | 收到信号不唤醒和不可运行,进程必须等待直到有中断发生 | D 不可中断 uninterruptible sleep (usually IO) |
僵死 | 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放 | Z 僵死 a defunct (”zombie”) process |
停止 | 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行 | T 停止 traced or stopped |
语法:
ps [options] [--help]
参数:(常用)
ps -ef 与 ps aux:
在Linux下显示进程最常用的命令:
ps -ef #显示所有命令,连带命令行
UID PID PPID C STIME TTY TIME CMD
# 父进程id cpu 启动时间 在哪个终端运行 启动时间 命令名称和参数
root 1 0 0 May13 ? 00:00:03 /usr/lib/systemd/systemd --switched-root --system
root 2 0 0 May13 ? 00:00:00 [kthreadd]
root 4 2 0 May13 ? 00:00:00 [kworker/0:0H]
root 5 2 0 May13 ? 00:00:00 [kworker/u2:0]
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 43448 3768 ? Ss May13 0:03 /usr/lib/systemd/systemd --switch root 2 0.0 0.0 0 0 ? S May13 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? S< May13 0:00 [kworker/0:0H] root 5 0.0 0.0 0 0 ? S May13 0:00 [kworker/u2:0] root 6 0.0 0.0 0 0 ? S May13 0:01 [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S May13 0:00 [migration/0] ``` -au(x) 输出格式: 4. USER PID %CPU%MEM VSZ RSS TTY STAT START TIME COMMAND 5. USER:形成拥有者 6. PID:pid 7. %CPU/C :占用的cpu使用率 8. %MEM:占用的记忆体使用率 9. VSZ:占用的虚拟记忆体大小 10. RSS:占用的记忆体大小 11. TTY:终端的次要装置号码 12. STAT:该行程的状态 1. D:无法中断的休眠状态0通常(通常IO的进程) 2. R:正在执行中 3. S:静止状态/休眠状态 4. T:暂停状态/停止或被追踪 5. Z:不存在但暂时无法消除/僵死状态 6. W:没有足够的记忆体分页可分配,进入内存交换(从内核2.6开始失效) 7. <:高优先序的形行程 8. N:低优先序的行程 9. L:有记忆体分页非配并锁在记忆体内(实时系统或捱AI/O),有些页被锁进内存 10. s:进程的领导者(它之下有子进程) 11. l:多进程,克隆进程(使用CLONE_THREAD,类似NPTL pthreads) 12. +:位于后台的进程组 13. START:行程开始时间 14. COMMAND:所执行的指令 实例: ```bash ps -e | grep nginx #查看nginx进程 1027 ? 00:00:00 nginx 1028 ? 00:00:00 nginx ps -A #显示全部进程 PID TTY TIME CMD 1 ? 00:00:03 systemd 2 ? 00:00:00 kthreadd 4 ? 00:00:00 kworker/0:0H 5 ? 00:00:00 kworker/u2:0 6 ? 00:00:01 ksoftirqd/0 7 ? 00:00:00 migration/0 8 ? 00:00:00 rcu_bh #中间省略部分 16040 pts/0 00:00:00 ps 30396 ? 00:00:00 sshd 30398 ? 00:00:00 sftp-server ps -u root #显示root进程用户信息 PID TTY TIME CMD 1 ? 00:00:03 systemd 2 ? 00:00:00 kthreadd 4 ? 00:00:00 kworker/0:0H 5 ? 00:00:00 kworker/u2:0 6 ? 00:00:01 ksoftirqd/0 7 ? 00:00:00 migration/0 8 ? 00:00:00 rcu_bh #中间省略部分 16040 pts/0 00:00:00 ps 30396 ? 00:00:00 sshd 30398 ? 00:00:00 sftp-server ps -ef #显示所有命令,连带命令行 UID PID PPID C STIME TTY TIME CMD # 父进程id cpu 启动时间 在哪个终端运行 命令名称和参数 root 1 0 0 May13 ? 00:00:03 /usr/lib/systemd/systemd --switched-root --system root 2 0 0 May13 ? 00:00:00 [kthreadd] root 4 2 0 May13 ? 00:00:00 [kworker/0:0H] root 5 2 0 May13 ? 00:00:00 [kworker/u2:0] #中间省略部分 sshd 16098 16097 0 16:17 ? 00:00:00 sshd: root [net] root 16115 12703 0 16:17 pts/0 00:00:00 ps -ef root 30396 1110 0 13:59 ? 00:00:00 sshd: root@notty root 30398 30396 0 13:59 ? 00:00:00 /usr/libexec/openssh/sftp-server
netstat是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括tcp、udp以及unix套接字,另外他还能列出处于监听状态(即等待接入)的套接字。如果想确认系统上的web服务有没有起来,可以使用netstat查看。
选项与参数:
常用命令:
1、列出当前所有的连接。
netstat -a
2、列出所有tcp连接:
netstat -at
3、列出所有udp连接
netstat -au
5、禁用反向域名解析,加快查询速度(TCP连接)
使用-n选项禁用解析功能
netstat -ant
6、只列出所有监听端口:
netstat -l
7、只列出所有监听tcp端口:
netstat -lt
8、只列出所有udp监听端口:
netstat -lu
9、只列出监听uninx端口:
netstat -lx
10、显示所有端口的统计信息:
netstat -s
11、显示tcp端口或udp端口的统计信息:
netstat -st
netstat -su
12、输出中显示pid和名称名称
netstat -p
13、netstat 输出中不显示主机,端口和用户名(host、port、user),使用:netstat -n;将会使用数字代替那些名称
同样可以加速输出,因为不用进行比对查询
netstat -an
如果只是不想让某一个被现实,可以使用下面命令:
netstat -a --numeric-ports
netstat -a --numeric-hosts
netstat -a --numeric-users
14、持续输出netstat信息:
netstat -c
15、查看链接某服务端口最多的ip地址(前20个)
netstat -nat | grep "111.36.58.102:80" |awk '{print %5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20
16、TCP各种状态列表
netstat -nat|awk '{print $6}'
统计数量
netstat -nat|awk '{print $6}'|sort|uniq -c
排序
netstat -nat|awk '{print $6}'|sort|uniq -c|sort -rn
netstat -nat|awk '/^tcp/{++S[$NF]} END {for(a in S) print a,S[a]}'
17、直接统计tcp数量监听的数量
netstat -nat| wc -l
经常用来监听linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
语法:
top [-d number] |top [-bnp]
选项与参数:
在top命令显示的页面还可以输入一下按键执行相应功能(区分大小写):
xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令道额一个工具。它可以将标准输入或管道中的数据转换成特特定命令的命令行参数,也可以将单行或多行文本输入为其他格式的数据,比如将单行变多行或者多行变单行。xargs的默认命令是echo,默认分隔符是空格。通过xargs的处理,换行和空白都会被替换为空格。
实例:
cat text.txt | xargs
#k k k k k l l l l l p p p p p q q q q q
选项与参数:
cat text.txt |xargs -n3 #显示三列
#k k k
#k k l
#l l l
#l p p
#p p p
#q q q
#q q
echo “a*b*c*d*e*f*g” | xargs -d*
#a b c d e f h g
echo "a*b*c*d*e*f*g" | xargs -d* -n2 #以*为分隔符,将列打散,并设置为两列显示
#a b
#c d
#e f
#g
AWK:是一种处理文本文件的语言,是一个强大的文本分析工具
相比较屏幕处理的优点,在处理庞大文件时***不会出现内存溢出或是处理缓慢***的问题,通常用来***格式化文本信息***
语法:
awk [选项参数] 'script' var=value file(s)
awk [选项参数] -f scriptfile var=value file(s)
选项与参数
awk处理过程:依次对每一行进行处理,然后输出
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1;command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
‘ ’ 引用代码块
BEGIN 初始化代码块,在对每一行进行处理前,初始化代码,主要是引用全局变量,设置FS分隔符。
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用的分隔符
END 结尾代码块,在对每一块进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息。
特殊要点:
匹配时表示一个或一个以上
print & $0
print 是awk打印指定内容的主要命令
awk ‘{print}’ /etc/passwd == awk ‘{print $0}’ /etc/passwd
awk ‘{print " "}’ /etc/passwd //不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
awk ‘{print “a”}’ /etc/passwd //输出相同个数的a行,一行只有一个a字母
awk -F":" ‘{print $1}’ /etc/passwd
awk -F: ‘{print $1; print $2}’ /etc/passwd //将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
awk -F: ‘{print $1,$3,$6}’ OFS="\t" /etc/passwd //输出字段1,3,6,以制表符作为分隔符
-f指定脚本文件
awk -f script.awk file
BEGIN{
FS=":"
}
{print $1} //效果与awk -F":" '{print $1}'相同,只是分隔符使用FS在代码自身中指定
awk ‘BEGIN{X=0} /^$/{ X+=1 } END{print “I find”,X,“blank lines.”}’ test
I find 4 blank lines.
ls -l|awk ‘BEGIN{sum=0} !/^d/{sum+=$5} END{print “total size is”,sum}’ //计算文件大小
total size is 17487
-F指定分隔符
$1 指指定分隔符后,第一个字段,$3第三个字段, \t是制表符
一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格
awk -F":" ‘{print $1}’ /etc/passwd
awk -F":" ‘{print $1 $3}’ /etc/passwd //$1与$3相连输出,不分隔
awk -F":" ‘{print $1,$3}’ /etc/passwd //多了一个逗号,$1与$3使用空格分隔
awk -F":" ‘{print $1 " " $3}’ /etc/passwd //$1与$3之间手动添加空格分隔
awk -F":" ‘{print “Username:” $1 “\t\t Uid:” $3 }’ /etc/passwd //自定义输出
awk -F: ‘{print NF}’ /etc/passwd //显示每行有多少字段
awk -F: ‘{print $NF}’ /etc/passwd //将每行第NF个字段的值打印出来
awk -F: ‘NF==4 {print }’ /etc/passwd //显示只有4个字段的行
awk -F: ‘NF>2{print $0}’ /etc/passwd //显示每行字段数量大于2的行
awk ‘{print NR,$0}’ /etc/passwd //输出每行的行号
awk -F: ‘{print NR,NF,$NF,"\t",$0}’ /etc/passwd //依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: ‘NR==5{print}’ /etc/passwd //显示第5行
awk -F: ‘NR5 || NR6{print}’ /etc/passwd //显示第5行和第6行
route -n|awk ‘NR!=1{print}’ //不显示第一行
//匹配代码块
//纯字符匹配 !//纯字符不匹配 ~//字段值匹配 !~//字段值不匹配 ~/a1|a2/字段值匹配a1或a2
awk ‘/mysql/’ /etc/passwd
awk ‘/mysql/{print }’ /etc/passwd
awk ‘/mysql/{print $0}’ /etc/passwd //三条指令结果一样
awk ‘!/mysql/{print $0}’ /etc/passwd //输出不匹配mysql的行
awk ‘/mysql|mail/{print}’ /etc/passwd
awk ‘!/mysql|mail/{print}’ /etc/passwd
awk -F: ‘/mail/,/mysql/{print}’ /etc/passwd //区间匹配
awk ‘/[2][7][7]*/{print $0}’ /etc/passwd //匹配包含27为数字开头的行,如27,277,2777…
awk -F: ‘$1~/mail/{print $1}’ /etc/passwd //$1匹配指定内容才显示
awk -F: ‘{if($1~/mail/) print $1}’ /etc/passwd //与上面相同
awk -F: ‘$1!~/mail/{print $1}’ /etc/passwd //不匹配
awk -F: ‘$1!~/mail|mysql/{print $1}’ /etc/passwd
IF语句
必须用在{}中,且比较内容用()扩起来
awk -F: ‘{if($1~/mail/) print $1}’ /etc/passwd //简写
awk -F: ‘{if($1~/mail/) {print $1}}’ /etc/passwd //全写
awk -F: ‘{if($1~/mail/) {print $1} else {print $2}}’ /etc/passwd //if…else…
条件表达式
== != > >=
awk -F":" ‘$1==“mysql”{print $3}’ /etc/passwd
awk -F":" ‘{if($1==“mysql”) print $3}’ /etc/passwd //与上面相同
awk -F":" ‘$1!=“mysql”{print $3}’ /etc/passwd //不等于
awk -F":" ‘$3>1000{print $3}’ /etc/passwd //大于
awk -F":" ‘$3>=100{print $3}’ /etc/passwd //大于等于
awk -F":" ‘$3<1{print $3}’ /etc/passwd //小于
awk -F":" ‘$3<=1{print $3}’ /etc/passwd //小于等于
逻辑运算符
&& ||
awk -F: ‘$1~/mail/ && $3>8 {print }’ /etc/passwd //逻辑与,$1匹配mail,并且$3>8
awk -F: ‘{if($1~/mail/ && $3>8) print }’ /etc/passwd
awk -F: ‘$1~/mail/ || $3>1000 {print }’ /etc/passwd //逻辑或
awk -F: ‘{if($1~/mail/ || $3>1000) print }’ /etc/passwd
数值运算
awk -F: ‘$3 > 100’ /etc/passwd
awk -F: ‘$3 > 100 || $3 < 5’ /etc/passwd
awk -F: ‘$3+$4 > 200’ /etc/passwd
awk -F: ‘/mysql|mail/{print $3+10}’ /etc/passwd //第三个字段加10打印
awk -F: ‘/mysql/{print $3-$4}’ /etc/passwd //减法
awk -F: ‘/mysql/{print $3*$4}’ /etc/passwd //求乘积
awk ‘/MemFree/{print $2/1024}’ /proc/meminfo //除法
awk ‘/MemFree/{print int($2/1024)}’ /proc/meminfo //取整
输出分隔符OFS
awk ‘$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}’ OFS="\t" netstat.txt
awk ‘$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}’ OFS="\t" netstat.txt
//输出字段6匹配WAIT的行,其中输出每行行号,字段4,5,6,并使用制表符分割字段
输出处理结果到文件
①在命令代码块中直接输出 route -n|awk ‘NR!=1{print > “./fs”}’
②使用重定向进行输出 route -n|awk ‘NR!=1{print}’ > ./fs
格式化输出
netstat -anp|awk ‘{printf “%-8s %-8s %-10s\n”,$1,$2,$3}’
printf表示格式输出
%格式化输出分隔符
-8长度为8个字符
s表示字符串类型
打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),
第三个字段输出字符串类型(长度为10)
netstat -anp|awk ‘$6==“LISTEN” || NR==1 {printf “%-10s %-10s %-10s \n”,$1,$2,$3}’
netstat -anp|awk ‘$6==“LISTEN” || NR==1 {printf “%-3s %-10s %-10s %-10s \n”,NR,$1,$2,$3}’
IF语句
awk -F: ‘{if($3>100) print “large”; else print “small”}’ /etc/passwd
small
small
small
large
small
small
awk -F: ‘BEGIN{A=0;B=0} {if($3>100) {A++; print “large”} else {B++; print “small”}} END{print A,"\t",B}’ /etc/passwd
//ID大于100,A加1,否则B加1
awk -F: ‘{if($3<100) next; else print}’ /etc/passwd //小于100跳过,否则显示
awk -F: ‘BEGIN{i=1} {if(i<NF) print NR,NF,i++ }’ /etc/passwd
awk -F: ‘BEGIN{i=1} {if(i<NF) {print NR,NF} i++ }’ /etc/passwd
另一种形式
awk -F: ‘{print ($3>100 ? “yes”:“no”)}’ /etc/passwd
awk -F: ‘{print ($3>100 ? $3":\tyes":$3":\tno")}’ /etc/passwd
while语句
awk -F: ‘BEGIN{i=1} {while(i<NF) print NF,$i,i++}’ /etc/passwd
7 root 1
7 x 2
7 0 3
7 0 4
7 root 5
7 /root 6
数组
netstat -anp|awk ‘NR!=1{a[$6]++} END{for (i in a) print i,"\t",a[i]}’
netstat -anp|awk ‘NR!=1{a[$6]++} END{for (i in a) printf “%-20s %-10s %-5s \n”, i,"\t",a[i]}’
9523 1
9929 1
LISTEN 6
7903 1
3038/cupsd 1
7913 1
10837 1
9833 1
应用1
awk -F: ‘{print NF}’ helloworld.sh //输出文件每行有多少字段
awk -F: ‘{print $1,$2,$3,$4,$5}’ helloworld.sh //输出前5个字段
awk -F: ‘{print $1,$2,$3,$4,$5}’ OFS=’\t’ helloworld.sh //输出前5个字段并使用制表符分隔输出
awk -F: ‘{print NR,$1,$2,$3,$4,$5}’ OFS=’\t’ helloworld.sh //制表符分隔输出前5个字段,并打印行号
应用2
awk -F’[:#]’ ‘{print NF}’ helloworld.sh //指定多个分隔符: #,输出每行多少字段
awk -F’[:#]’ ‘{print $1,$2,$3,$4,$5,$6,$7}’ OFS=’\t’ helloworld.sh //制表符分隔输出多字段
应用3
awk -F’[:#/]’ ‘{print NF}’ helloworld.sh //指定三个分隔符,并输出每行字段数
awk -F’[:#/]’ ‘{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}’ helloworld.sh //制表符分隔输出多字段
应用4
计算/home目录下,普通文件的大小,使用KB作为单位
ls -l|awk ‘BEGIN{sum=0} !/^d/{sum+=$5} END{print “total size is:”,sum/1024,“KB”}’
ls -l|awk ‘BEGIN{sum=0} !/^d/{sum+=$5} END{print “total size is:”,int(sum/1024),“KB”}’ //int是取整的意思
应用5
统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少
netstat -anp|awk ‘$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf “%-10s %-6s %-3s \n”, i," ",sum[i]}’
应用6
统计/home目录下不同用户的普通文件的总数是多少?
ls -l|awk ‘NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf “%-6s %-5s %-3s \n”,i," ",sum[i]}’
mysql 199
root 374
统计/home目录下不同用户的普通文件的大小总size是多少?
ls -l|awk ‘NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf “%-6s %-5s %-3s %-2s \n”,i," ",sum[i]/1024/1024,“MB”}’
应用7
输出成绩表
awk ‘BEGIN{math=0;eng=0;com=0;printf “Lineno. Name No. Math English Computer Total\n”;printf “------------------------------------------------------------\n”}{math+=$3; eng+=$4; com+=$5;printf “%-8s %-7s %-7s %-7s %-9s %-10s %-7s \n”,NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf “------------------------------------------------------------\n”;printf “%-24s %-7s %-9s %-20s \n”,“Total:”,math,eng,com;printf “%-24s %-7s %-9s %-20s \n”,“Avg:”,math/NR,eng/NR,com/NR}’ test0
[root@localhost home]# cat test0
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。