首页 > 系统相关 >Linux命令篇 - awk 命令

Linux命令篇 - awk 命令

时间:2022-08-19 16:35:07浏览次数:69  
标签:netstat tcp 命令 awk Linux print NR 80

awk

gawk - pattern scanning and processing language;

awk:gawk是Unix中原始awk程序的GNU版本,强大之处在于可以写脚本来读取文本行的数据,然后处理并显示数据;

格式:gawk [参数]

常用参数:

OPTIONS 意义
f 从文件程序文件读取AWK程序源,而不是从第一个命令行参数。可以使用多个-f(或--file)选项
-F 指定描绘一行中数据字段的文件分隔符
-v 定义gawk程序中使用的变量和默认值
-mr 指定数据文件中的最大记录大小

awk常用内建变量:

OPTIONS 意义
$0 当前记录(这个变量中存放着整个行的内容)
$1 ~ $n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始,如果有多个文件话,这个值也是不断累加中。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字

参考案例:

# 案例数据
$ vi netstat.txt
Proto Recv-Q Send-Q Local-Address          Foreign-Address             State
tcp        0      0 0.0.0.0:3306           0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:80             0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:9000         0.0.0.0:*                   LISTEN
tcp        0      0 coolshell.cn:80        124.205.5.146:18245         TIME_WAIT
tcp        0      0 coolshell.cn:80        61.140.101.185:37538        FIN_WAIT2
tcp        0      0 coolshell.cn:80        110.194.134.189:1032        ESTABLISHED
tcp        0      0 coolshell.cn:80        123.169.124.111:49809       ESTABLISHED
tcp        0      0 coolshell.cn:80        116.234.127.77:11502        FIN_WAIT2
tcp        0      0 coolshell.cn:80        123.169.124.111:49829       ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.215.36:36970         TIME_WAIT
tcp        0   4166 coolshell.cn:80        61.148.242.38:30901         ESTABLISHED
tcp        0      1 coolshell.cn:80        124.152.181.209:26825       FIN_WAIT1
tcp        0      0 coolshell.cn:80        110.194.134.189:4796        ESTABLISHED
tcp        0      0 coolshell.cn:80        183.60.212.163:51082        TIME_WAIT
tcp        0      1 coolshell.cn:80        208.115.113.92:50601        LAST_ACK
tcp        0      0 coolshell.cn:80        123.169.124.111:49840       ESTABLISHED
tcp        0      0 coolshell.cn:80        117.136.20.85:50025         FIN_WAIT2
tcp        0      0 :::22                  :::*                        LISTEN
  • 输出指定列(未指定格式)
# 其中单引号中的被大括号括着的就是awk的语句; 注意,其只能被单引号包含;
# 其中的$1..$n表示第几例;注:$0表示整个行
# 下面两个命令是等价的
$ awk '{print $1, $4}' netstat.out
$ cat netstat.out | awk '{print $1, $4}'
  • 输出指定列(指定格式)
# awk的格式化输出和C语言的printf没什么两样
$ awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.out
  • 过滤记录
# 过滤记录 - 简单过滤
# 过滤条件为: 第三列的值为0 && 第6列的值为LISTEN
# "=="为比较运算符; 其他比较运算符:!=、>、<、>=、<=
$ awk '$3==0 && $6=="LISTEN" ' netstat.txt

# 过滤记录 - 其它条件使用
$ awk '$6=="LISTEN" {print $0}' netstat.out 

# 过滤记录 - 表头显示
# 需要表头的话,可以引入内建变量NR
$ awk '$3==0 && $6=="LISTEN" || NR==1 ' netstat.out 

# 复杂过滤记录 - 格式化输出
$ awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.out 
  • 指定分隔符
# 下面两个命令是等价的
$ awk  'BEGIN{FS=":"} {print $1,$3,$6}' /etc/passwd
$ awk -F: '{print $1,$3,$6}' /etc/passwd

# 指定多个分隔符: awk -F '[;:]'

# 以\t作为分隔符输出
$ awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd
  • 正则匹配
# 匹配FIN状态
#  ~ 表示模式开始;  /xxx/中是模式,这是一个正则表达式的匹配;
$ awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.out

# 匹配WAIT字样的状态
$ awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.out

# 使用 “/FIN|TIME/” 来匹配 FIN 或者 TIME
$ awk '$6 ~ /FIN|TIME/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.out

# awk可以像grep一样的去匹配第一行
$ awk '/LISTEN/' netstat.out

# 模式取反
# 下面两个等价
$ awk '$6 !~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.out
$ awk '!/WAIT/ {print NR,$4,$5,$6}' OFS="\t" netstat.out
  • 拆分文件
# 按第6例分隔文件
$ awk 'NR!=1{print > $6}' netstat.out

# 把指定的列输出到文件
$ awk 'NR!=1{print $4,$5 > $6}' netstat.out

# 复杂拆分文件
$ awk 'NR!=1{if($6 ~ /TIME|ESTABLISHED/) print > "1.txt";
else if($6 ~ /LISTEN/) print > "2.txt";
else print > "3.txt" }' netstat.out
  • 统计
# 统计所有的C文件、CPP文件、H文件的文件大小总和
$ ls -l  *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'

# 统计各个connection状态的用法
$ awk 'NR!=1{a[$6]++;} END {for (i in a) print i ", " a[i];}' netstat.out

# 统计每个用户的进程的占了多少内存
$ ps aux | awk 'NR!=1{a[$1]+=$6;} END { for(i in a) print i ", " a[i]"KB";}'

标签:netstat,tcp,命令,awk,Linux,print,NR,80
From: https://www.cnblogs.com/HOsystem/p/16602397.html

相关文章

  • man命令帮助中文版&vim基本设置
    1,man命令帮助中文版:使用man命令的时候有时候想用中文版的,有时候又想用英文版的只需要以下几个骤:sudoapt-getinstallmanpages-zhvim~/.bashrc......
  • linux安装指定版本的docker
    场景:aptinstalldocker.io 安装的为默认最新版本的docker,但k8s不能使用最新版本docker实现:环境:ubuntu18.04aptinstallapt-transport-httpsca-certificatescurls......
  • Git常用命令
    学习就像闯关,慢慢来,多练习,熟练了总能通关!目录学习就像闯关,慢慢来,多练习,熟练了总能通关!Git学习总结1、全局设置2、新建仓库3、删除仓库4、清空暂存区5、增加删除文件6、提......
  • 解决 Linux /dev/mapper/ubuntu--vg-ubuntu--lv 磁盘空间不足的问题
    之前在 VMware 安装UbuntuServer的时候 磁盘分区 选择了LVM,所以系统根目录默认占用磁盘大小只有默认大小(10G),在安装软件时发现磁盘空间已经无法满足,所以需要利用LV......
  • Linux防火墙(iptables/firewalld)
    Linux防火墙(iptables/firewalld)一、iptables1.iptables概述Linux系统的防火墙:IP信息包过滤系统,它实际上由两个组件netfilter和iptables组成。主要工作在网络层,针对IP......
  • cmd 命令大全
    win+r输入cmd回车打开cmd窗口系统相关输入compmgmt.msc->打开计算机中的管理窗口输入services.msc->打开服务窗口输入control->打开控制面板输入regit-......
  • linux应用重启脚本
    参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1else......
  • linux zip
    linuxzip-A:调整可执行的自动解压缩文件;-b<工作目录>:指定暂时存放文件的目录;-c:替每个被压缩的文件加上注释;-d:从压缩文件内删除指定的文件;-D:压缩文件内不建立目录......
  • Linux部署-Net并配置进程守护
    注册Microsoft签名密钥并添加Microsoft产品提要sudorpm--importhttps://packages.microsoft.com/keys/microsoft.ascsudosh-c'echo-e"[packages-microsoft-......
  • 《Linux内核设计的艺术》——第5章 文件系统
    1.挂载文件系统当前系统已经完成了根文件系统的挂载,将要挂载新的文件系统。新的文件系统挂载在根文件系统的某个目录的inode上。1)将硬盘的超级块读出,载入系统的super_b......