awk

作者: xyz098 | 来源:发表于2020-01-21 16:22 被阅读0次
  • 选项
  • 变量
  • 模式
  • 处理
  • 操作
  • 条件声明
  • I/O声明
  • 函数

功能
pattern scanning and processing language. awk is a line-oriented language. The pattern comes first, and then the action.

选项

-F  ":"      # input时分割符,默认空格
-v  VAR=val  # 给变量赋初始值
-d  file     # 全局变量打印到文件

变量

  • Records 记录,RS分割的文件后的内容为记录
  • Fields 字段,F分割Record的内容后为字段
# var
$0       # 所有Fields
$1,$n    # 分割Fields后的第1~n字段
RS       # 默认输入记录分割符为换行
ORS      # 默认输出记录分隔符为换行
NF       # 每个record有多少个Field字段
NR       # 第几个records
OFS      # 输出连接符,默认空格

# example
# 多行替换为一行: 设置变量RS为文件结束,因此只有一个record,在换行符替换为空格
awk -v RS=EOF '{ gsub(/\n/," "); print }' 1.txt 
cat 1.txt | xargs echo 

# 设置倒数第二个字段为空
awk '{$(NF-1)=" "; print $0}' tmp.sh

# 输出连接符为-,最后字段替换为hi
awk '{OFS="-"; $NF="hi"; print $0}' tmp.sh

模式

先patterns后action

# pattern
BEGIN                 # 在任何input之前执行
END                   # 在所有input之后执行
BEGINFILE
ENDFILE                
/regular expression/   # 处理each input record
relational expression  
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
pattern1, pattern2

处理

# action
{}       # 大括号括起来

操作

# Operators
(...)       Grouping
$           Field reference.
++ --       Increment and decrement
|   |&      Piped I/O for getline, print, printf.
in          Array membership.

条件声明

# Control Statements
if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (var in array) statement
for (expr1; expr2; expr3) statement
break
continue

# example
# 统计tcp各状态个数
netstat -nt | awk '{t[$NF]++}END{ for(i in t) print i,t[i] }'

# 计算es中某类索引的每天日志量大小
curl -s http://127.0.0.1:9200/_cat/indices | 
awk '{print $3,$(NF-1)}' | grep ^tel | grep `date +%Y.%m.%d` | 
awk '{ 
    if($NF~/kb/) { gsub(/kb/,//,$NF);kb += $NF } 
    else if($NF~/mb/)  { gsub(/mb/,//,$NF); mb += $NF } 
    else if($NF~/gb/) { gsub(/gb/,//,$NF) ; gb += $NF } 
}
END { 
  sum=(kb/1024/1024+mb/1024+gb); printf ("%.2fG\n",sum)
}'

I/O声明

# I/O Statements
getline                  Set $0 from next input record; set NF, NR, FNR.
getline <file            Set $0 from next record of file; set NF.
getline var              Set var from next input record; set NR, FNR.
getline var <file        Set var from next record of file.
command | getline [var]  Run command piping the output either into $0 or var, as above.
next                     Stop  processing  the  current  input record. 
print                    Print the current record.
print ... >> file        Appends output to the file.

# example
# 打印文件偶数行内容
awk '{ getline; print $0}' tmp.sh

# 每行前部分增日期信息:执行命令存入变量
awk 'BEGIN{"date"| getline today } {print today,$0}' tmp.sh
2020年 01月 21日 星期二 14:59:05 CST  happy new year

# 扫描IP:执行系统命令
tail -f access_log | awk '/myhome.html/ { system("nmap " $1 ">> logdir/myhome.html") }'          

函数

# String Functions
substr(s, i [, n])    # 源s,i起始位置 ; 从第i位截取s
gsub(r, s [, t])      # 正则r,目标s, 源t 默认t是$0 ;替换源s中正则r配到的为模板s
match(s, r [, a])     # 源字段s, 正则r, 匹配后存入数组a

# example
# 计算1分钟内网卡速率
a=`ifconfig em1 | awk '/RX bytes/ {print substr($2,7)}'` &&  sleep 60 && a1=`ifconfig em1 | awk '/RX bytes/ {print substr($2,7)}'` && echo "($a1-$a)/60" | bc 

# 替换第二字段hot为hi
awk '{ gsub(/hot/,"hi",$2); print $0}' tmp.sh 

# 打印匹配第二字端elk后面的内容
awk '{ match($2,"elk(.*)",a); print a[1] }' tmp.sh 
# 统计平均数
# cat 1.txt 
a 1
a 2
a 3
a 4
a 5
b 1
b 5
d 9
d 0

cat 1.txt | awk '{ arr[$1]=arr[$1]+$2; num[$1]++ } END{ print "key\tavg"; for(i in arr) print i"\t"arr[i]/num[i] }'
key avg
a   3
b   3
d   4.5

相关文章

  • 18-文本处理三剑客之awk

    本章内容 ◆ awk介绍◆ awk基本用法◆ awk变量◆ awk格式化◆ awk操作符◆ awk条件判断◆ aw...

  • 2017 09-04 AWK

    本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...

  • 【技术案例】跟老男孩学运维-awk项目案例

    一个awk数组应用案例 [TOC] 0.技术点: awk awk数组 awk判断 awk数组赋值 awk函数spl...

  • awk

    awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...

  • awk

    Linux System Environment awk功能 awk格式 awk 参数 一、awk截取列 二、显示...

  • 笔记-awk

    1.Awk基础介绍 2.awk语法格式 2.Awk工作原理 3.Awk内部变量 4.Awk格式输出 5.Awk模式...

  • awk用法详解

    awk 用法 awk ' pattern {action} ' 1、awk '/101/' file ...

  • Day64-shell编程_正则表达式_awk

    1.Awk基础介绍 2.Awk工作原理 3.Awk内部变量 4.Awk格式输出 5.Awk模式匹配 5.1符号 ...

  • linux-awk

    linux-awk awk基本结构 awk ‘BEGIN{ print “start”} pattern { co...

  • awk小说

    awk awk脚本的结构基本如下: awk ' BEGIN{ print "start" } patern { c...

网友评论

      本文标题:awk

      本文链接:https://www.haomeiwen.com/subject/dauezctx.html