当前位置:   article > 正文

Linux ps、netstat、awk_ps awk

ps awk

ps

在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]
  • 1

参数:(常用)

  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 :标准的格式显示进程
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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. ps aux:BSD的格式来显示:
	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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

netstat

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、列出当前所有的连接。

netstat -a
  • 1

2、列出所有tcp连接:

netstat -at
  • 1

3、列出所有udp连接

netstat -au
  • 1

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

netstat -ant
  • 1

6、只列出所有监听端口:

netstat -l
  • 1

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

netstat -lt
  • 1

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

netstat -lu
  • 1

9、只列出监听uninx端口:

netstat -lx
  • 1

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

netstat -s
  • 1

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

netstat -st
netstat -su
  • 1
  • 2

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

netstat -p
  • 1

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

netstat -an
  • 1

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

netstat -a --numeric-ports
netstat -a --numeric-hosts
netstat -a --numeric-users
  • 1
  • 2
  • 3

14、持续输出netstat信息:

netstat -c
  • 1

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
  • 1

16、TCP各种状态列表

netstat -nat|awk '{print $6}'
  • 1

统计数量

netstat -nat|awk '{print $6}'|sort|uniq -c
  • 1

排序

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]}'
  • 1
  • 2

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

netstat -nat| wc -l
  • 1

top

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

top [-d number] |top [-bnp]
  • 1

选项与参数:

  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命令是给其他命令传递参数的一个过滤器,也是组合多个命令道额一个工具。它可以将标准输入或管道中的数据转换成特特定命令的命令行参数,也可以将单行或多行文本输入为其他格式的数据,比如将单行变多行或者多行变单行。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
  • 1
  • 2

选项与参数:

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

awk

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

awk [选项参数] 'script' var=value file(s)
awk [选项参数] -f scriptfile var=value file(s)
  • 1
  • 2

选项与参数

  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. \t 制表符
  7. \n 换行符
  8. FS BEGIN时定义分隔符
  9. RS 输入的记录分隔符,默认为换行符(即文本是安一行一行输入)
  10. ~ 匹配,与==相比不是精确比较
  11. !~ 不匹配,不精确比较
  12. == 等于,必须全部相等,精确比较
  13. != 不等于,精确比较
  14. && 逻辑与
  15. || 逻辑或
    •  匹配时表示一个或一个以上
      
      • 1
  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}’ /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
  • 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/969031
推荐阅读
相关标签
  

闽ICP备14008679号