awk实例

目录

插入几个新字段

格式化空白

读取.ini配置文件中的某段

根据某字段去重

筛选给定时间范围内的日志


插入几个新字段

        在"a b c d"的b后面插入3个字段e f g

echo "a b c d" | awk '{$2=$2" e f g";print}'

  1. echo "a b c d":这将在终端输出字符串 "a b c d",并通过管道将其传递给下一个命令。

  2. |:这是一个管道操作符,用于将前一个命令的输出作为后一个命令的输入。

  3. awk '{$2=$2" e f g";print}':这是 awk 的脚本部分,用来对输入进行处理。

    • {$2=$2" e f g";print} 是一个 awk 的动作块,由大括号 {} 包围。

    • $2 表示当前处理的行的第二个字段(使用空格分隔的字段),即 "b"$2=$2" e f g" 的意思是将第二个字段(即 "b")与 "e f g" 连接起来,形成 "b e f g"

    • print 是一个 awk 的内置函数,用于打印当前处理的行。因此,这个命令将打印修改后的行,即 "a b e f g c d"

格式化空白

        移除每行的前缀、后缀空白,并将各部分左对齐。

  1. awk '{$1=$1;print}' 2.txt:这是 awk 的脚本部分,用来对输入进行处理。

    • {$1=$1;print} 是一个 awk 的动作块,由大括号 {} 包围。

    • $1=$1 是一个空操作,它将重新分配第一个字段(即 $1)的值给它自己。这实际上是 awk 中的一个常见技巧,它可以使 awk 对输入行进行重新格式化,去除多余的空格,并将字段之间的空格调整为单个空格。

    • print 是一个 awk 的内置函数,用于打印当前处理的行。因此,这个命令将打印经过处理后的行,其中字段之间只有一个空格,多余的空格已被删除。

    • 2.txt 是要处理的输入文件。

    

  • BEGIN{OFS="\t"} 这一部分是 awk 的 BEGIN 块。BEGIN 块在处理输入之前执行一次,并且可以用于设置初始条件和变量。这里的意思是在处理输入之前,将输出字段分隔符 (OFS) 设置为制表符(\t)。

读取.ini配置文件中的某段

  • BEGIN{RS=""}:在处理输入之前,将输入记录分隔符 RS 设置为空字符串。这样设置可以使 awk 将空行作为记录分隔符,从而将文件中的每个段落作为一个记录。

  • /\[mysql\]/:这是一个模式匹配条件,用于匹配包含 [mysql] 的行。当遇到这样的行时,以下动作块将被执行。

  • {print; while((getline)>0){ if(/\[.*\]/) {exit} print} }:这是匹配成功时执行的动作块。

    • print 语句用于打印匹配到的行。

    • while ((getline)>0) 用于循环读取下一行。当 getline 函数返回非零值时,表示成功读取了一行。循环会一直继续,直到遇到新的段落(以 [ 开头的行)。

    • if (/\[.*\]/) {exit}:如果读取到新的段落开始的行,则退出循环。

    • print 语句在循环内部,用于打印每行数据(该行不是新的段落开始的行)。

根据某字段去重

  • -F"? ":这个选项用于指定字段分隔符为问号(?),-F表示字段分隔符选项,"?"是指定的分隔符。

  • !arr[$2]++{print}:这是一个条件和动作的组合。

    • arr[$2]:创建一个数组arr,使用第二个字段($2)作为索引。

    • !arr[$2]++:如果数组中指定的索引值为0,则条件成立(即之前没有出现过该索引值)。

    • {print}:在条件满足时打印当前行。

筛选给定时间范围内的日志

BEGIN{
  # 要筛选什么时间的日志,将其时间构建成epoch值
  which_time = mktime("2023 08 5 13 30 01")
}
 
{
  # 取出日志中的日期时间字符串部分
  match($0,"^.*\\[(.*)\\].*",arr)
 
  # 将日期时间字符串转换为epoch值
  tmp_time = strptime2(arr[1])
 
  # 通过比较epoch值来比较时间大小
  if(tmp_time > which_time){
    print
  }
}
 
# 构建的时间字符串格式为:"18/Jul/2023:13:30:00 +0800"
function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
  dt_str = gensub("[/:+]"," ","g",str)
  # dt_sr = "18 Jul 2023 13 30 00 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"]=01
  mons["Feb"]=02
  mons["Mar"]=03
  mons["Apr"]=04
  mons["May"]=05
  mons["Jun"]=06
  mons["Jul"]=07
  mons["Aug"]=08
  mons["Sep"]=09
  mons["Oct"]=10
  mons["Nov"]=11
  mons["Dec"]=12
  return mons[str]
}
  1. BEGIN块:

    • BEGIN块中,我们使用mktime函数将指定的时间("2023 08 05 13 30 01")转换为epoch值,并将其赋值给which_time变量。
  2. 主循环:

    • 在主循环中,使用正则表达式匹配整行日志中的日期时间部分,并将匹配结果保存在数组arr中。
  3. strptime2函数:

    • strptime2函数用于将日期时间字符串转换为epoch值。
    • 首先,通过使用gensub函数将日期时间字符串中的分隔符("/", ":", "+")替换为空格,生成格式为"18 Jul 2023 13 30 00 08 00"的日期时间字符串,保存在变量dt_str中。
    • 然后,使用split函数将dt_str按空格分割,并将结果保存在数组arr中。
    • 接下来,根据数组arr中的元素,提取年份、月份、日期、小时、分钟和秒,并赋值给变量YMDHmS
    • 最后,使用mktime函数将组合后的日期时间值转换为epoch值,并返回。
  4. mon_map函数:

    • mon_map函数用于将英文月份缩写映射为对应的数字。
    • 在函数内部,使用一个关联数组mons,将英文月份缩写作为键,数字作为值进行映射。
    • 根据传入的英文月份缩写str,返回相应的数字。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dlluo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值