awk的基本使用

目录

1、awk的变量使用

2、筛选给定范围内的日志写出来

3、统计TCP连接状态数量

4、awk的基础小练习

4.1、只显示/etc/passwd的账户

4.2、搜索/etc/passwd有关键字root的所有行

4.3、输出/etc/passwd文件中以nologin结尾的行

4. 4、在 a b f g h 的b后面插入三个字段c d e

4.5、打印奇数行


1、awk的变量使用

    变量:内置和自定义变量,每个变量前加 -v 命令选项

FS输入字段分隔符,默认为空白字符
OFS输出字段分隔符,默认为空白字符
RS输入记录分隔符,指定输入时的换行符,原换行符仍有效
ORS输出记录分隔符,输出时用指定符号代替换行符
NF字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列
NR行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
FNR各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
FILENAME当前文件名
ARGC命令行参数的个数
ARGV

数组,保存的是命令行所给定的各参数,查看参数

 1)FS的使用

 2)ARGC的使用

2、筛选给定范围内的日志写出来

 1)首先我们需要用到的是awk提供的函数mktime();

mktime() 函数功能:将时间转换为自1970年1月1日以来逝去时间的秒数,发生错误时返回-1。也就是是把获取的时间转换成时间戳

例子:

 本实例是 2019-11-10 3-42-41 距离1970年的1月1日,相差了1573375361秒

2)将2019-11-10T03:42:40+08:00格式的字符串转换成epoch值:我们用到的patsplit,它是将我们匹配成功的放入一个数组中

BEGIN{
  str="2019-11-10T03:42:40+08:00"
  patsplit(str,arr,"[0-9]{1,4}")
  Y=arr[1]
  M=arr[2]
  D=arr[3]
  H=arr[4]
  m=arr[5]
  S=arr[6]
 print mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S ))
}

最后我们打印输出的用到了mktime()函数,即得出的是距离上一个时间的秒数

3)输出2019-11-10 3-42-40以后的日志

BEGIN{
  which_time = mktime("2019 11 10 03 42 40")
}
{
  match($0,"^.*\\[(.*)\\].*",arr) //取出日志中的时期时间字符串部分
   tmp_time = strptime1(arr[1])  //将日期时间转换
  if(tmp_time > which_time){print} //打印which_time之后的
}

function strptime1(str ,arr,Y,M,D,H,m,S){
patsplit(str,arr,"[0-9]{1,4}")
  Y=arr[1]
  M=arr[2]
  D=arr[3]
  H=arr[4]
  m=arr[5]
  S=arr[6]
 return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S ))
}

4)当我们的时间里有英文的缩写处理方式

例如: 构建的时间字符串格式为:"10/Nov/2019:23:53:44+08:00"

gensu() :是一个通用的替代函数

function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
  dt_str = gensub("[/:+]"," ","g",str)
  # 经过gensub函数的处理得到:dt_sr = "10 Nov 2019 23 53 44 08 00" 
  split(dt_str,arr," ")
  Y=arr[3]
  M=mon_map(arr[2]) #第二个字段是月份,故我们需要对它进行转换
  D=arr[1]
  H=arr[4]
  m=arr[5]
  S=arr[6]
  return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}

function mon_map(str,mons){
  mons["Jan"]=1
  mons["Feb"]=2
  mons["Mar"]=3
  mons["Apr"]=4
  mons["May"]=5
  mons["Jun"]=6
  mons["Jul"]=7
  mons["Aug"]=8
  mons["Sep"]=9
  mons["Oct"]=10
  mons["Nov"]=11
  mons["Dec"]=12
  return mons[str]
}

3、统计TCP连接状态数量

 先查看自己本机:

统计状态数量:

netstat -antp | awk '{arr[$6]++}END{for (i in arr){print arr[i], i}}'
# $6的意思就是统计的第六列

 得出的结果有 enstablished 和Foreign 是不和题意的,故我们需要修改表达式:

netstat -antp | awk '/^tcp/{arr[$6]++}END{for (i in arr){print arr[i], i}}'
# 我们加了一个tcp ,即仅仅统计tcp中的,就不会统计上面的

4、awk的基础小练习

4.1、只显示/etc/passwd的账户
awk -F ":" '{print $1}' /etc/passwd
4.2、搜索/etc/passwd有关键字root的所有行
[root@localhost ~]# awk -F ":" '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
4.3、输出/etc/passwd文件中以nologin结尾的行
 
[root@localhost ~]# awk -F ":" '/root/{print}' /etc/passwd

输出结果:

4. 4、在 a b f g h 的b后面插入三个字段c d e
[root@localhost ~]# echo a b f g h | awk '{$2=$2 " c d e"}1'
a b c d e f g h
4.5、打印奇数行
 awk 'NR % 2 ==1' 3.txt 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值