最新动态
Linux ps、netstat、awk
2024-10-31 20:38

在Linux中,ps(Process Status)用于列出系统中当前运行的进程(process)的状态,ps命令列出的是当前那些进程的快照。如果要动态的显示进程信息,需要使用top命令。使用ps命令可以确定当前有哪些进程正在运行中与运行的状态、进程是否结束、进程是否僵死、哪些进程占用过多资源等。

Linux ps、netstat、awk

进程的五种状态

进程状态含义对应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

语法

参数:(常用)

  1. -e 显示所有进程,环境变量
  2. -f 全格式
  3. -h 不显示标题
  4. -l 长格式
  5. -A 列出所有进程,包括其他用户的进程
  6. -w 显示加宽可以显示加多的咨询
  7. -r 只显示正在运行的进程
  8. -x 显示没有控制终端的进程
  9. -u 亿用户为主的格式来显示进程状态
  10. au 显示较详细的咨询
  11. -aux 显示所有包含其他使用者的进程
  12. -C<命令> 列出指定命令的状态
  13. –lines<行数> 每页显示的行数
  14. –width<字符数> 每页显示的字符数
  15. –help 显示帮助信息
  16. –version 显示版本显示

ps -ef 与 ps aux:
在Linux下显示进程最常用的命令:

  1. ps -ef :标准的格式显示进程
  1. ps aux:BSD的格式来显示

netstat是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括tcp、udp以及unix套接字,另外他还能列出处于监听状态(即等待接入)的套接字。如果想确认系统上的web服务有没有起来,可以使用netstat查看。

  1. -a(all) 显示所有选项,默认不显示LISTEN相关
  2. -t(TCP:仅显示tcp相关的选项
  3. -u(udp:仅显示udp相关的选项
  4. -n:拒绝显示别名,能显示数字的全部转化为数字
  5. -l:仅列出有在LISTEN(监听)的服务状态
  6. -p:显示建立相关连接的程序名
  7. -r:显示路由信息,路由表
  8. -e:显示扩展信息,例如uid等
  9. -s:按各个协议进行统计
    10.-c:每隔一个固定时间,执行该netstat命令
    LISTEN和LISTENING的状态只有用-a或者-l才能看到

常用命令:

1、列出当前所有的连接。

2、列出所有tcp连接

3、列出所有udp连接

5、禁用反向域名解析,加快查询速度(TCP连接
使用-n选项禁用解析功能

6、只列出所有监听端口

7、只列出所有监听tcp端口

8、只列出所有udp监听端口

9、只列出监听uninx端口

10、显示所有端口的统计信息

11、显示tcp端口或udp端口的统计信息

12、输出中显示pid和名称名称

13、netstat 输出中不显示主机,端口和用户名(host、port、user),使用:netstat -n;将会使用数字代替那些名称
同样可以加速输出,因为不用进行比对查询

如果只是不想让某一个被现实,可以使用下面命令

14、持续输出netstat信息

15、查看链接某服务端口最多的ip地址(前20个

16、TCP各种状态列表

统计数量

排序

17、直接统计tcp数量监听的数量

经常用来监听linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。
语法

  1. -d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。
  2. -b:以批次的方式执行top.
  3. -n:与-b配合使用,表示需要进行几次top命令的输出结果。
  4. -p:指定特定的pid进程号进行观察

在top命令显示的页面还可以输入一下按键执行相应功能(区分大小写

  1. :显示在top当中可以输入的命令
  2. P:以CPU的使用资源排序显示
  3. M:以内存的使用资源排序显示
  4. N:以pid排序显示
  5. T:由进程使用的时间累积排序显示
  6. k:给某一个pid一个信号。可以用来杀死进程
  7. r:给某个pid重新订制一个nice值(优先级
  8. q:退出top(Ctrl+c也可以退出

xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令道额一个工具。它可以将标准输入或管道中的数据转换成特特定命令的命令行参数,也可以将单行或多行文本输入为其他格式的数据,比如将单行变多行或者多行变单行。xargs的默认命令是echo,默认分隔符是空格。通过xargs的处理,换行和空白都会被替换为空格。

实例

  1. -n:指定列数,并多行输出
  1. -d:制定一个域分隔符,将特定列打散,并制定格式输出
  1. -I:使用-I选项制定一个替换字符串,这个字符串在xargs进行扩展时会被替换掉,每个参数命令都会被执行一次
    在这里插入图片描述
  2. -0:将‘0’作为定界符
    在这里插入图片描述

AWK:是一种处理文本文件的语言,是一个强大的文本分析工具
相比较屏幕处理的优点,在处理庞大文件时***不会出现内存溢出或是处理缓慢***的问题,通常用来***格式化文本信息***
语法

选项与参数

  1. -F fs or --file-separator fs
    指定输入文本拆分隔符,fs是一个字符串或者是一个正则表达式。如-F
  2. -v var=value or --asign var=value
    赋值一个用户定义变量
  3. -f scripfile or --file scriptfile
    从脚本文件中读取awk命令
  4. -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大快数目;-mr选项限制记录的最大数目。这两个功能是扩展功能,在标准的awk中不适用
  5. -W compact or --compat, -W traditional or --traditional
    在兼容模式下运行awk。所以gawk的行为与标准和awk是完全一样的,所有的awk扩展都被忽略。
  6. -W copyleft or --copyleft, -W copyright or --copyright
    打印简短的版权信息
  7. -W help or --help, -W usage or --usage
    打印全部的awk选项和每个选项的简短说明
  8. -W lint or --lint
    打印不能向传统unix平台移植的结构的警告
  9. -W lint-old or --lint-old
    打印关于不能向传统unix平台移植的结构的警告
  10. -W posix
    打开兼容模式。但有限制:不识别:/x、函数关键字、func、换吗序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符=不能代替=;fflush无效。
  11. -W re-interval or --re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类,如括号表达式[[:alpha:]]。
  12. -W source program-text or --source program-text
    使用program-text作为源代码,可与-f命令混合
  13. -W version or --version
    打印bug报告信息的版本

awk处理过程:依次对每一行进行处理,然后输出
awk命令形式
awk [-F|-f|-v] ‘BEGIN{} //{command1;command2} END{}’ file
[-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
‘ ’ 引用代码块
BEGIN 初始化代码块,在对每一行进行处理前,初始化代码,主要是引用全局变量,设置FS分隔符。
// 匹配代码块,可以是字符串或正则表达式
{} 命令代码块,包含一条或多条命令
; 多条命令使用的分隔符
END 结尾代码块,在对每一块进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息。

特殊要点

  1. $0 表示整个当前行
  2. $1 每一行第一个字段
  3. NF 字段数量变量
  4. NR 每行的记录号,多文件记录递增
  5. FNR 与NF类似,不过多文件记录不递增,每个文件都从1开始
  6. 制表符
  7. 换行符
  8. FS BEGIN时定义分隔符
  9. RS 输入的记录分隔符,默认为换行符(即文本是安一行一行输入
  10. ~ 匹配,与==相比不是精确比较
  11. !~ 不匹配,不精确比较
  12. == 等于,必须全部相等,精确比较
  13. = 不等于,精确比较
  14. && 逻辑与
  15. || 逻辑或
    •  
  16. /[0-9][0-9]+/ 两个或两个以上数字
  17. /[0-9][0-9]*/ 一个或一个以上数字
  18. FILENAME 文件名
  19. OFS 输出字段分隔符,默认也是空格,可以改为制表符等
  20. ORS 输出的记录分隔符。默认为换行符,即处理结果也是一行一行输出到屏幕
  21. -F’[:#/]’ 定义三个分隔符

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; print $2}’ /etc/passwd //将每一行的前二个字段,分行输出,进一步理解一行一行处理文本

awk -F: ‘{print $1,$3,$6}’ OFS=" " /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第三个字段, 是制表符

一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格

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 “ 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," ",$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

必须用在{}中,且比较内容用()扩起来

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=" " netstat.txt

awk ‘$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}’ OFS=" " netstat.txt

//输出字段6匹配WAIT的行,其中输出每行行号,字段4,5,6,并使用制表符分割字段

输出处理结果到文件

①在命令代码块中直接输出 route -n|awk ‘NR!=1{print > “https://blog.csdn.net/weixin_41092139/article/details/fs”}’

②使用重定向进行输出 route -n|awk ‘NR!=1{print}’ > https://blog.csdn.net/weixin_41092139/article/details/fs

格式化输出

netstat -anp|awk ‘{printf “%-8s %-8s %-10s

printf表示格式输出

%格式化输出分隔符

-8长度为8个字符

s表示字符串类型

打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),

第三个字段输出字符串类型(长度为10)

netstat -anp|awk ‘$6==“LISTEN” || NR==1 {printf “%-10s %-10s %-10s

netstat -anp|awk ‘$6==“LISTEN” || NR==1 {printf “%-3s %-10s %-10s %-10s ”,NR,$1,$2,$3}’

awk -F: ‘{if($3>100) print “large”; else print “small”}’ /etc/passwd

large

awk -F: ‘BEGIN{A=0;B=0} {if($3>100) {A++; print “large”} else {B++; print “small”}} END{print A," ",B}’ /etc/passwd

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": yes":$3": no")}’ /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," ",a[i]}’

netstat -anp|awk ‘NR!=1{a[$6]++} END{for (i in a) printf “%-20s %-10s %-5s ”, i," ",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=’ ’ helloworld.sh //输出前5个字段并使用制表符分隔输出

awk -F: ‘{print NR,$1,$2,$3,$4,$5}’ OFS=’ ’ helloworld.sh //制表符分隔输出前5个字段,并打印行号

应用2

awk -F’[:#]’ ‘{print NF}’ helloworld.sh //指定多个分隔符: #,输出每行多少字段

awk -F’[:#]’ ‘{print $1,$2,$3,$4,$5,$6,$7}’ OFS=’ ’ 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 ”, i," ",sum[i]}’

应用6

统计/home目录下不同用户的普通文件的总数是多少

ls -l|awk ‘NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf “%-6s %-5s %-3s ”,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 ”,i," ",sum[i]/1024/1024,“MB”}’

应用7

输出成绩表

awk ‘BEGIN{math=0;eng=0;com=0;printf “Lineno. Name No. Math English Computer Total ”;printf “------------------------------------------------------------ ”}{math+=$3; eng+=$4; com+=$5;printf “%-8s %-7s %-7s %-7s %-9s %-10s %-7s ”,NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf “------------------------------------------------------------ ”;printf “%-24s %-7s %-9s %-20s ”,“Total:”,math,eng,com;printf “%-24s %-7s %-9s %-20s ”,“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

    以上就是本篇文章【Linux ps、netstat、awk】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/1985.html 
     行业      资讯      企业新闻      行情      企业黄页      同类资讯      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多