支付宝红包
京东盲盒抽奖
幸运转盘
秒杀
自营热卖
支付宝红包

03.Awk

伤疤久在那 1年前   阅读数 180 0

awk

 

awk是linux环境下的一个命令行工具,但是由于awk强大的能力,我们可以为awk工具传递一个字符串,该字符串的内容类似一种编程语言的语法,我们可以称其为Awk语言,而awk工具本身则可以看作是Awk语言的解析器。

 

就好比python解析器与Python语言的关系。我们一般使用awk来做什么,awk又适合做什么工作呢。由于awk天生提供对文件中文本分列进行处理。

所以如果一个文件中的每行都被特定的分隔符(常见的是空格)隔开,我们可以将这个文件看成是由很多列的文本组成,

这样的文件最适合用awk进行处理,其实awk在工作中很多时候被用来处理log文件,进行一些统计工作等。

 

awk 基础

 

awk [options] 'Pattern{Action}' file

 

BEGIN、END

 

awk 'BEGIN{print "aaa","bbb"} { print $1,$2}' test awk '{print $1,$2} END{print "ccc","ddd"}' test

 

awk 分隔符

 

输入分割符:FS

 

awk -F# '{print $1,$2}' test  awk -v FS='#' '{print $1,$2}' test

 

输出分隔符:OFS

 

awk -v OFS="+++" '{print $1,$2}' test awk -v FS="#" -v OFS="---" '{print $1,$2}' test

 

awk  变量

 

awk常用的内置变量

 

FS  输入字段分割符 OFS: 输出字段分隔符 RS:输入换行符 ORS:输出换行符 NF:字段数量 NR:行号 FNR:各文件分别计数的行号 FILENAME: 当前文件名 ARGC:命令行参数的个数 ARGV:数组

 

内置变量NR、FNR

 

awk '{print NR,$0}' test awk '{print FNR,$0}' test

 

内置变量RS

 

awk -v RS=" " '{print NR,$0}' test

 

内置变量 ORS

 

awk -v ORS="+++" '{print NR,$0}' test

 

内置变量FILENAME

 

awk '{print FILENAME,$0}' test

 

自定义变量

 

awk -v myvar="test" 'BEGIN{print myvar}' awk 'BEGIN{myvar="ttt";print myvar}‘ awk ’BEGIN{myvar1="111";myvar2="222";print myvar1,myvar2}'

 

awk 格式化

 

awk中如果输出字符的话,有两种处理方式。printf和print

printf:可以自定义输出的模式,另外输出内容之后不自动换行

print:输出内容之后自动换行

 

awk '{printf "第一列:%s 第二列 %s\n",$1,$2}' test awk 'BEGIN{printf "%s\n%s\n%s\n%s\n%s\n",1,2,3,4,5}'  总结: 使用printf 动作输出的文本不会换行,如果需要换行,可以在对应的格式替换符  加入 \n 进行转义。 使用printf 动作时,格式中的格式替换符必须与被格式化的文本一  对应。

 

awk 模式

 

正则模式

 

awk '/正则1/{动作}'  /some/file

 

awk '/^root/{print $0}' /etc/passwd awk '/\/bin\/bash$/ {print $0}' /etc/passwd // 转义  使用(x,y) 这种次数匹配的正则表达式时,需要配合 --posix 或者 --re-interval 选项。 字母e最少连续出现两次,最多只能连续出现三次: awk --posix '/he(2,3)y/ {print $0}' test

 

行范围模式

 

awk '/LEE/,/KEKEK/{print $0}' test awk '/正则1/,/正则2/{动作}’ /some/file  awk 'NR>= 3 && NR<=6' {print $0}' test

 

awk 动作

 

if...else

 

awk '{ if(NR==1) {print $0}} ' test awk -F ":" '{if($3<500){print $1,“系统用户“} else { print ¥1,”普通用户“}} ' /etc/passwd

 

for...in

 

awk 'BEGIN{for (i=1;i<=6;i++){print i}}' awk 'BEGIN{for (i=0;i<6;i++} {if (i==3)(continue); print i}}

 

while

 

awk -v i=1 'BEGIN{ while(i<=5){print i;i++} }' awk 'BEGIN(i=1;while(i<=5){print i:i++}}' awk 'BEGIN{ do{print “test";i++} while(i<=5) }'

 

exit

 

awk "BEGIN{print 1;exit;print 2;print 3}' 当执行了exit语句后,如果使用了end模式,将直接执行END模式中的动作,其他动作将不会再执行;如果没有使用END模式,当执行了exit语句后,将直接退出整个awk命令。

 

awk 数组(关联数组)

 

定义

 

下标为数字(默认转化为字符串): awk 'BEGIN{arr[0]="aaa";arr[1]="bbb";print arr[0]}' 换行符 \  下标为字符串: awk 'BEGIN{arr["earr"]="aaa";arr["kk"]="bbb";print arr["kk"]}'

 

delete

 

删除数组中的元素: awk 'BEGIN{arr["laker"]="kobe";print arr["laker"]; delete arr["laker"];print arr["laker"]}' 删除整个数组 :delete arr

 

循环

 

awk 'BEGIN {arr["laker"]="kobe";arr["cli"]="james";for(i in arr) {print i,arr[i] } } '

 

awk 函数

 

rand函数 、 srand函数 、int函数

 

rand 函数生成随机数,需配合srand函数,否则rand 函数返回的值将一直不变。 awk 'BEGIN{srand();print rand()}'

 

字符串函数:gsub  sub

 

awk '{gsub("l","L",$1);print $0}' test $1列的小写l 都替换成大写 L。

 

length 函数: 获取指定字符串的长度

 

awk '{for(1=1;i<=NF;i++) {print $i,length($i)}‘ test  awk '{print $0,length()}' test 省略参数

 

index 函数: 获取字符位置。

 

awk '{print index($0,"Lee")}' test

 

三元运算符

 

awk -F: '{usetype=$3<500?"系统用户“:”普通用户";print $1,usertype}' /etc/passwd  awk -F: '{$3<500?a++:b++} END{print a,b}' /etc/passwd  awk 'i=!i' test 输出奇数行 awk '!(i=!i)' test 输出偶数行

注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: