因为经常做awk编码,而且跨过一段时间就容易忘记,故在此做个留底。便于翻阅。——后期会在这个页面不断补充!
 

常用常量
 

属性 描述
NR  已读入的总记录数
 ARGIND  当前被处理参数标志 
FILENAME  当前输入文件名
FS   输入域分隔符,默认为一个空格
RS   输入记录分隔符
NF  当前记录里域个数
 SUBSEP 下标分隔符 "\034" 
 

获取日期
 
strftime("%Y-%m-%d", systime())

加载awk文件方式
 
 awk -v "file_name=`basename $file`" -f cut_online.awk $file
 

处理多个文件的时候,区分文件
 
 
区分:
 
 

数组操作
 
 
 awk的数组,一种关联数组(Associative Arrays),下标可以是数字和字符串。因无需对数组名和元素提前声明,也无需指定元素个数 ,所以awk的数组使用非常灵活。
首先介绍下几个awk数组相关的知识点:
<1>建立数组
array[index] = value :数组名array,下标index以及相应的值value。

<2>读取数组值

{ for (item in array)  print array[item]} # 输出的顺序是随机的
{for(i=;i<=len;i++) print array[i]} # Len 是数组的长度

<3>多维数组,array[index1,index2,……]:SUBSEP是数组下标分割符,默认为“\034”。可以事先设定SUBSEP,也可以直接在SUBSEP的位置输入你要用的分隔符,如:

awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}'
a:b
awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'
a:b

但,有些特殊情况需要避免,如:

awk 'BEGIN{
SUBSEP=":"
array["a","b:c"]= # 下标为“a:b:c”
array["a:b","c"]= #下标同样是“a:b:c”
for (i in array) print i,array[i]}'
a:b:c #所以数组元素只有一个。

<4>删除数组或数组元素: 使用delete 函数

delete array                     #删除整个数组
delete array[item] # 删除某个数组元素(item)

<5> 排序:awk中的asort函数可以实现对数组的值进行排序,不过排序之后的数组下标改为从1到数组的长度。在gawk 3.1.2以后的版本还提供了一个asorti函数,这个函数不是依据关联数组的值,而是依据关联数组的下标排序,即asorti(array)以后,仍会用数字(1到数组长度)来作为下标,但是array的数组值变为排序后的原来的下标,除非你指定另一个参数如:asorti(a,b)。

echo 'aa
bb
aa
bb
cc' |\
awk '{a[$0]++}END{l=asorti(a);for(i=1;i<=l;i++)print a[i]}'
aa
bb
cc echo 'aa
bb
aa
bb
cc' |\
awk '{a[$0]++}END{l=asorti(a,b);for(i=1;i<=l;i++)print b[i],a[b[i]]}'
aa
bb
cc
 

属性 描述
asort  asort对数组进行排序,返回数组长度 
   
   
   
   
   
   
练习1(分析出每天有多少员工离职?有多少员工入职?)
 
awk代码(test_log_info.awk)
BEGIN{
today = strftime("%Y-%m-%d-%H", systime());
}
FILENAME == ARGV[]{ # 第一个文件 旧记录
old_user[$] = $;
}
FILENAME == ARGV[]{ # 第二个文件 新纪录
new_user[$] = $;
}
END{
log_info = "";
log_file = log_dir"user_log_info.log."today"";
for(old_uid in old_user){
if(new_user[old_uid] == ""){
log_info = log_info"leave user:"old_user[old_uid]"\n";
delete new_user[new_uid];
}
} for(new_uid in new_user){
if(old_user[new_uid] == ""){
log_info = log_info"add user:"new_user[new_uid]"\n";
delete old_user[new_uid];
}
} log_info = log_info"old count:"asort(old_user)";new count:"asort(new_user);
system(" echo '"log_info"' > "log_file);
}

分析日志shell脚本(test_log_info.sh)

#!/bin/bash

yesterday(){
yy=`date +%Y` #Year yyyy
mm=`date +%m` #Month mm
dd=`date +%d` #Day dd
if [ $dd = "" ]
then
lm=`expr $mm - `
if [ $lm -eq ]
then
lm=
yy=`expr $yy - `
fi
echo lm=$lm
case $lm in
||||||) Yesterday= ;;
|||) Yesterday= ;;
)
if [ ` expr $yy % ` -eq -a `expr $yy % ` -ne -o ` expr $yy % ` -eq ]
then Yesterday=
else Yesterday=
fi ;; esac
mm=$lm
Yesterday=$Yesterday
else
Yesterday=`expr $dd - `
fi case $Yesterday
in ||||||||) Yesterday=''$Yesterday
esac
case $mm in
||||||||) mm=''$mm ;;
esac Yesterday=$yy"-"$mm"-"$Yesterday"-05"
}
yesterday
Today=`date "+%Y-%m-%d-05"`
TEMP_DIR="/home/rd/zhoubc/bak/" awk -v "log_dir="$TEMP_DIR -f test_log_info.awk $BAKDIR""test2.conf.""$Yesterday $BAKDIR""test2.conf.""$Today

调用嵌套的shell文件(test_send.sh)

#!/bin/bash
BAKDIR='/home/crontab/send_user/bak/' source test_log_info.sh

调用:

几个技术点:

shell脚本套用(source)——这样可以公用变量

source test_log_info.sh

awk多文件分别处理:

FILENAME == ARGV[1]{}
FILENAME == ARGV[2]{}
案例1:统计每个分类下,样本的中位数
 
 
数据结构:
下标从1开始计算。第二列为分类ID,第11类为月日均pv量。
325	20	230	4918	4	1	64	0	0	64.72	36.9	25	26
803 25 33 249 4 0 74 0 0 4.0 3.5 3 2
841 0 566 8624 11 21 269 1 0 527.57 415.6 1331 825
858 8 498 11569 21 17 477 1 0 1386.29 913.87 2787 2982
1004 6 221 3222 15 7 176 1 0 900.28 673.36 712 458

相关代码:

# $11 是月日均pv量
function ceil(x){
y = int(x);
return (x > y ? y + 1 : y)
}
# 取中位数
function get_median(arr){
len = asort(arr);
#for(i = 1; i <= len; i++) {
# printf("%d\t", arr[i]);
#}
#printf("\n"); mid = ceil(len/ 2);
if(len%2 == 0){
return ceil((arr[mid] + arr[mid + 1]) / 2);
}
#printf("mid=%d\n", mid);
return arr[mid];
} BEGIN{
}
{
if(!($2 in cardTypeTree)){
cardTypeTree[$2] = $11;
} else {
cardTypeTree[$2] = cardTypeTree[$2]"_"$11;
}
}
END{
system("rm -f ./parseType.txt")
for(key in cardTypeTree){
split(cardTypeTree[key], array, "_")
printf("%-10s\t%d\t%-10s\n", key, length(array), get_median(array))
system("echo '"key"\t"length(array)"\t"get_median(array)"' >> ./parseType.txt")
}
}

 

执行结果如下:

 
总结
 
   工作中断断续续会用到awk脚本,老是用去搜索太麻烦了,故放在这里,方便日后查阅。如果对你有帮助,就推荐一下!
 
推荐
 

awk 留底的更多相关文章

  1. awk命令简介

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  2. awk使用说明

    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...

  3. awk应用

    h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...

  4. 3.awk数组详解及企业实战案例

    awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...

  5. shell——awk

    awk -F"分隔符" "command" filename awk -F":" '{print $1}' /etc/passwd 字段引用 ...

  6. 【Linux】AWK入门

    什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...

  7. 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od

    awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk ''  | output 1.首先要知道形式 awk 'command' fi ...

  8. sed awk grep三剑客常用

    sed的常用用法: awk的常用用法: grep的常用用法: 除了列出符合行之外,并且列出后10行. grep -A 10 Exception kzfinance-front.log 除了列出符合行之 ...

  9. awk命令速查

    awk与sed.grep一样都是为了加工数据流而做成的文本加工过滤器命令.awk会事先把输入的数据根据字段单位进行分割.在没有制定分割单位的情况下,以输入数据中的空格或Tab为分隔符.与sed相比,它 ...

随机推荐

  1. cmake cannot find package

    cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...

  2. Visual Studio (VS IDE) 你必须知道的功能和技巧 - 【.Net必知系列】

    前言 本文主要阐述一些Visual Studio开发下需要知道的少部分且比较实用的功能,也是很多人忽略的部分.一些不常用而且冷门的功能不在本文范围,当然本文的尾巴[.Net必知系列]纯属意淫,如有雷同 ...

  3. CozyRSS开发记录-中断

    接下来会对CozyRSS做一堆的修改,包括界面和功能.因为比较杂乱,而且大多是体力活,所以就不记录了.等下次再发的时候,见到的就是一个有可用性的CozyRSS了!

  4. UWP 判断windows mobile是使用的实体键还是虚拟按键

    最近在写启动屏幕,发现虚拟按钮会挡住,启动屏幕的最下面的元素,大概有50 px.可是有什么办法知道手机是用的实体键还是虚拟按键吗? 如下图.可以看到红色的部分显示了一点点.代码里设置的是60px. 在 ...

  5. SQL 语句与性能之联合查询和联合分类查询

    select * from t1 left join t2 on t2.sysno =t1.ASysNo left join t3 on t3.sysno =t2.ASysNo left join t ...

  6. LeetCode 412. Fizz Buzz

    Problem: Write a program that outputs the string representation of numbers from 1 to n. But for mult ...

  7. 采用Lambda表达式快速实现实体模型对象转换到DTO

    在项目中,采用code first时建立的模型对象不能直接用于数据传输,需要从新根据需求建立Dto对象 为什么需要建立Dto对象呢? DTO即数据传输对象.之前不明白有些框架中为什么要专门定义DTO来 ...

  8. 解决ugui中Image使用iTween的ColorTo、ColorFrom等不生效

    查看iTween的源码找到ColorFrom函数,看该函数的注释“/// Changes a GameObject's color values instantly then returns them ...

  9. python基础06 循环

      循环用于重复执行一些程序. for循环  for循环需要预先设定循环的次数n,然后执行隶属于for的语句. 基本构造是 for 元素 in 序列: statement 如: for a in [1 ...

  10. 【EntityFramework Core】实体实例化注入

    由于逻辑需要,我希望能在EF Core实例化实体时,拿到实体并执行相关代码,所以我就研究了一番EF Core,得到以下方法. 1.创建实体初始化类,继承EntityMaterializerSource ...