原创

awk常用命令

awk 常用命令

awk 内置变量表

属性 说明
$0 当前记录(作为单个变量)
\$1~$n 当前记录的第 n 个字段,字段间由 FS 分隔
FS 输入字段分隔符 默认是空格
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从 1 开始
RS 输入的记录他隔符默 认为换行符
OFS 输出字段分隔符 默认也是空格
ORS 输出的记录分隔符,默认为换行符
ARGC 命令行参数个数
ARGV 命令行参数数组
FILENAME 当前输入文件的名字
IGNORECASE 如果为真,则进行忽略大小写的匹配
ARGIND 当前被处理文件的 ARGV 标志符
CONVFMT 数字转换格式 %.6g
ENVIRON UNIX 环境变量
ERRNO UNIX 系统错误消息
FIELDWIDTHS 输入字段宽度的空白分隔字符串

awk 字符串函数

函数 说明 实例
sub(regex,sub,string) sub 函数执行一次子串替换。它将第一次出现的子串用 regex 替换。 str = "Hello, World"sub("World", "Jerry", str)
substr(str, start, l) substr 函数返回 str 字符串中从第 start 个字符开始长度为 l 的子串。 subs = substr(str, 1, 5)
index( String1, String2 ) 在由 String1 参数指定的字符串(其中有出现 String2 指定的参数)中,返回位置,从 1 开始编号。 str = "One Two Three" subs = "Two" ret = index(str, subs)
length [(String)] 返回 String 参数指定的字符串的长度(字符形式) str = "Hello, World !!!"
print "Length = ", length(str)
split( String, A, [Ere] ) 将 String 参数指定的参数分割为数组元素 A[1], A[2], . . ., A[n],并返回 n 变量的值。 str = "One,Two,Three,Four"
str = "One,Two,Three,Four"
split(str, arr, ",")
for (i in arr) {
print arr[i]
}
toupper( String ) 返回 String 参数指定的字符串,字符串中每个小写字符将更改为大写。 str = "hello, world !!!"
print "Uppercase string = " toupper(str)

常用例子

打印 a 文件里面 13 行以后的所有列

awk '{for(i=13;i<=NF;i++)printf $i" ";printf "\n"}' a

求和

awk -F\| '{total=$1+total;} END {print total;}' tmp.log

求平均

awk -F\| '{sum+=$5} END {print "Average = ", sum/NR}'  tmp.log

求最大值

awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'

求最小值(min 的初始值设置一个超大数即可)

awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'

求区间

seq 60|awk '$0>20&&$0<25{print $0}'

END

awk -F\# '{if($5=="USE")a++}END{print a}'

显示时间

awk -F\| '{OFS="|";$2=strftime("%Y-%m-%d %H:%M:%S",$2/1000);print $0}'

从一天的数据里面查询某个小时的数据

awk -F\| '{Hour=strftime("%H",substr($7,0,10));print Hour}'
awk -F\| '{Hour=strftime("%H",$1);if(Hour=="12")print $0}'  Bill.log
awk -F\| '$2==666{Hour=strftime("%H",substr($7,0,10));if(Hour=="09")print $0}' |sort -t\| -k7 -n

打印 map

awk -F: '{a[$1]++}END{for (i in a) print i"|"a[i]}' tmp.log

按某行排序

cat UserBill_35080|sort -t\| -k3 -nr
cat UserBill_35080|sort -t\| -k3 -n

时间段

while [[ $StatDay -le $EndDay ]]
do
    StatDay=`date -d"+1 day $StatDay" +"%Y%m%d"`
get10093 ${StatDay}
done

求 b 文件里面 userID 在 a 文件里面

awk -F\| 'NR==FNR{a[$3]=0;}NR>FNR{if($3 in a) print $0 }' a b
awk -F\| 'NR==FNR{a[$0]=0}NR>FNR{if($1 in a){b[$2]++}}END{for(i in b)print i,b[i]}'  a  b

按位数将时间戳转换为时间

#!/bin/sh
Col=$1
awk -F\| -v Col=$Col -v OFS="|" '{a=strftime("%Y-%m-%d %H:%M:%S",$Col/1000); print a,$0}'

输出到文件里面

awk -F\| 'OFS="|" {a[$4]=$5} END {for(i in a){if(a[i]>=10){print i,a[i]>"b"}else print i,a[i]>"c"}}' a.log

统计个数,按照多个分隔符分割-F "[#|]"

awk -F "[:.]" '{a[$3]++} END {for(i in a)print i"|"a[i]}' a

awk 分隔函数 split

cat ${tmp}|awk -F\| '{a[$4]=$9"|"$14"|"$16"|"$18} END {for(i in a){split(a[i],strs,"|");print i"|"strs[1]"|"strs[2]"|"strs[3]"|"strs[4]}}'


cat c | awk '{split($0,d,"-");for(i in d){num[d[1]]++}}END{for(i in num)print i,num[i]}'

awk 使用 getline

a=/data/a
b=/data/b
result=/data/result
awk -F\| -v a=${a} -v b=${b} 'BEGIN{
        while(getline<a>0){
                User[$1]=$2"_"$3
        }
        for(i in User){
                split(i,strs,"_");
                name=strs[1];
                age=strs[2];
                printf(%s %s %s\n",id,name,age);
        }
}'
>${result}

awk 输出不使用科学计数法 awk 在默认情况下会将较大的值打印科学计数值

echo |awk '{print 1806293*0.9}'

如果要获得完整的数值,可以使用 printf,使用方法和 C 语言一致

echo |awk '{printf("%d %d\n",1806293*0.9,465456456)}'

打印百分比

cat ${tmp}|awk -F\| -v totalNum=${totalNum} -v Date=${Date} '{a[$12]++} END {for(i in a)printf "%d\|%d\|%d\|%d\|%.2f%%\n",Date,i,a[i],totalNum,('a[i]'/'$totalNum')*100}'|sort -t\| -k2 -n

awk输出单引号,双引号

awk '{print "\""}'

awk '{print "'\''"}'

awk指定[]为分隔符

awk -F "[][]" '{print $2"\t"$3"\t"$4}' tmp.log

awk内部使用for循环

#!/usr/bin/awk -f
BEGIN {
    i=2;
    do {
        print i, " to the second power is ", i*i;
        i = i + 1
    }
    while (i < 10)
exit;
}
cat sshd.txt |awk '{for(i=1;i<=NF;i++){print $i}}'

awk截断字符串成为多个行

数据
#userID|sceneID|itemID,num;itemID,num
1242312883|12|2,2;8,1;9,5460;6,5

脚本
#userID|sceneID|itemID|num
cat a|awk -F\| '{ split($3, arr, ";");for(i in arr){print $1","$2","arr[i]}}'

awk内置函数

awk内置函数

正文到此结束