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 输出偶数行
注意:本文归作者所有,未经作者允许,不得转载