Linux--shell的awk--10
一、awk介绍全称:由Aho Weinberger Kernaighan三个人的首字母组合而成 1970年第一次出现在Unix机器上,后来在开源领域使用它 awk是一种单独的编程语言解释器 awk报告生成器:通过模式匹配以及自己本身的语言格式,来获取并输出客户所需要的内容 示例:获取系统上面用户id大于1小于等于500的用户的用户名和用户ID awk -F: ‘{if($3>=1&&<=500){print $1,$3}}‘ /etc/passwd 二、awk工作原理1、依次把匹配到的行,使用awk工具进行编辑 2、$0表示整行,$1代表第一个…,$NF代表最后一个 3、pattern;通过模式匹配对应的字段过滤行; 4、通过对应的命令 printf 做格式化输出 三、awk用法awk [option] … ‘program‘ FILE 注意:1、program 必须使用单引号 2、多条program语句使用大括号包含起来,可以并列、嵌套? ?? awk ‘{print}‘ /etc/passwd #默认打印$0 四、awk常见选项(option)-F? 指定分隔符,默认是空格 -F[:] 指定多个分隔符 例: awk -F[:] ‘{print $3,$5,$7}‘ /etc/passwd 指定 : 和 / 为分隔符 -v? 手动指定变量参数 awk -v a="a/b" ‘print a‘ a.txt 1、a是自定义变量 2、在awk中调用变量不用加$符号 cut与awk的区别 awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的; cut则是以单个空格作为分隔符。 五、awk的语法格式----program1、print默认输出(在屏幕上) 在awk中没有保存命令,我们可以关联其他命令(tee)来保存 2、printf? 实现格式化输出输出格式:printf "xxx %-10s xxx %-10d ",name,num 格式符: %s?? 显示字符串 %d %i? 显示数值 %c?? 显示ASCII %e %E 科学计算方式 %f??? 显示浮点数 %u? 无符号整数 %%?? 逃逸符,只显示%自己 修饰符: 默认为右对齐 -??????? 代表左对齐 %5.4f? 代表占位数为5,小数位有4位 ? 3、变量内置变量----环境变量(bash) awk语言所默认支持的变量 FS?? 定义输入分隔符的变量 OFS? 定义输出分隔符的变量 NF($NF) 分割以后的最后一列的变量,变量引用的时候不用加$ NR? 定义文件的行数,定义多个文件的时候,行号叠加 FNR 定义文件行数时,只计算自己的行号 FILENAME? 存储文件名字 BEGIN? 只执行一次后面的命令 awk ‘BEGIN{print "xxx"}{print$3}‘ /etc/passwd ARGC? 整个 命令参数 的段数 ?不包含ARGC命令本身 ARGV? 用来调取命令中指定的段 awk ‘{print ARGC}‘ /etc/passwd == 2 awk ‘{print ARGV[2]}‘ /etc/passwd == /etc/passwd RS? 指定换行符,默认为n,可以指定新的换行符,不影响默认符号 ORS? 输出时替换默认换行符 awk -v ORS="@" ‘{print}‘ /etc/passwd 自定义变量 -v 变量=值 在后面’program’中去调用自定义变量时,直接使用即可或者将”变量=值”语句写到program即可 4、模式匹配(地址定界)a) 空值,没有定义,默认就将文件中所有行放入awk中进行循环 b) 对m~n行进行操作 awk ‘NR>=1&&NR<=3{print}‘ /etc/passwd 打印1到3行 c) pattern匹配的行 /pattern/ awk ‘/r..t/{print}‘ /etc/passwd d) /pattern1/,/pattern2/ 第一次pattern1到第一次匹配pattern2的行 awk ‘/root/,/user1/{print}‘ /etc/passwd 练习:判断/patern1/,/pattern2/之间行的用户是bash用户,并显示用户名 awk -F: ‘/^root/,/user1/{if($NF=="/bin/bash");print $1,$3}‘ /etc/passwd e) 模式匹配可以直接使用判断语句 awk -F: ‘$NF=="/bin/bash"{print $1 $3}‘ /etc/passwd f) BEGIN定义在默认循环进行操作前所要执行的语句 awk -F: ‘BEGIN{printf "shell程序为bash:n"}$NF=="/bin/bash"{print $1,$3}‘ /etc/passwd g) END 定义在循环结束后执行 awk -F: $NF=="/bin/bash"{print $1,$3} ‘END{printf "endn"}‘ /etc/passwd 5、操作符运算操作符 + ?- ?* ?/ ?%? ^(乘方)? // 比较运算符 > ?<? ==? !=? >=? <=? ~(等于)? !~ awk -F: ‘-FS~"/bin/bash" {print $1,$3}‘ /etc/passwd 逻辑操作符 &&? ||? ! 赋值操作符 =? +=? -=? /=? *=? %=? ^=? //= 条件表达式 条件语句? 条件成立语句;条件不成立语句 awk ‘/^title/{NF<=2? print; print "参数过少"}‘ /boot/grub/grub.conf 6、常见actionprint printf 以及它任何命令的操作都是action a) expressions b) input statements输入语句 c) 组合语句 compound statements /pat1/{{ }{ }} d) control statements 控制语句 例如 if? while等 e) output statements 输出语句 7、常见语言a) if语句 语法格式:if(条件表达式){执行语句} else {执行语句} awk ‘/^title/{if(NF<=2){print} else {print "error"}}‘ /boot/grub/grub.conf b) while语句 只有对行参数进行遍历的时候才使用while语句 语法格式:初始值 while(条件表达式){循环体;初始控制语句} c) for语句 语法格式:for(初始值;条件判断;初始值控制语句){循环体} d) do-while语句 语法格式:do {循环体} while (循环条件) e) 跳出循环语句 break [n] ?跳出n次循环 continue? 跳出本次循环 next??? ??跳出默认的当前循环 ?NR%2==1 next 跳过奇数行 awk ‘{if(NR%2==1){next}else{print}}‘ /etc/passwd f) switch语句(类似case) 语法格式:switch(表达式){case 模式匹配值:执行语句;case …,default:执行语句} 8、数组在awk中,数组和shell中的数组特性相同 注意:awk中数组不用定义,只要使用,就有值为空的默认数组 行遍历:整个文件进行遍历 列遍历:取对象的某一列进行遍历 注意:数组通过for语句,再给其他变量进行赋值时,赋的是索引信息 练习:统计/etc/fstab中每个单词(以空格隔开的词)的次数 awk -v RS=" " ‘{print}‘ /etc/fstab | awk ‘{a[$1]++}END{for(i in a){printf "%-50s = %-2dn",i,a[i]}}‘ 9、函数内置函数: length()? 统计字符串长度 数学上使用的函数 sin() cos() tan() … sub(x,x,x)? 替换第一个匹配到的值 awk -F: ‘{print sub(o,O,$1) }‘ /etc/passw第一列第一个o替换为O gsub(x,x)? 替换该行所有匹配到的所有值 awk -F: ‘{print gsub(o,$1) }‘ /etc/passwd第一列所有o替换为O split(x,x)? 指定分隔符去切割文件 netstat -tan | awk ‘/^tcp&;/{split($5,ip,":");print ip[1]}‘ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |