shell脚本之awk

AWK

1、AWK介绍
全称:Aho Weinberger kernaighan 三个人的首字母缩写
1970 年第一次出现在Unix机器上,后面再开源领域使用它;
所以,我们在Linux中使用,改用GUN AWK;所以,在Linux上实际上叫做gawk;

grep 行过滤器
-o -i -v -e grep egrep fgrep
sed 流编辑器
-n p 1、地址定界 3,5 3行到5行 2、sed的命令 p打印 a i w c s/pattern/str支持正则表达式匹配
AWK 报告生成器
通过默认匹配以及自身的语言格式
[默认情况下,三个工具都不支持编辑源文件]
2、AWK原理

3、AWK用法
AWK 【option】`awk自己的固定语法语句` FILE……
AWK [option] ...|`program` FILE
1、program 必须使用单引号 ``
2、多条program 语句使用大括号包含起来,可以并列,可以嵌套
awk`{print}` /etc/passwd
4、option
-F 指定分隔符
AWK -F [/:] `{print $1,$3} a.txt`
其中【】 内表示多个字符中的1任意一个
-v 因为AWK是一种语言编译器,能自己定义变量,同时也有内置变量(与环境变量类似)
手动指定变量参数
awk -v a="a/b" `{print a}` a.txt
给a赋值,打印a这个变量
1、a是自定义变量 -v FS=":"
2、在awk中调用变量,不用加$符号
5、AWK自己的固定语法
1、print
默认输出(在屏幕上)
在awk中没有保存命令,我们可以关联别的命令来保存awk的结果
awk `{a="a/b";print a}` a.txt|tee a.bak
2、printf-----格式化输出
printf “%s是%d班学的最好的学生”,变量1,变量2
【仅仅只有顺序关系】
格式符
%s字符串
%d %i数值
%i数值
%E科学计数法
%cASC||码值
%f浮点数
%u无符号整数
%%逃逸符 只显示%自己
%

修饰符
默认为右对齐
-代表左对齐
%5.4f
5 所占位符
4 所去小数位

sed 、pATH/PATH2/

3、变量(内置变量、自定义变量
内置变量--环境变量(bash)(env set -C +C)
awk 语言所默认支持的变量
FS 定义输入分隔符的变量
OFS 定义输出分隔符的变量
NF 定义分隔以后的参数个数($NF 分隔以后最后一行变量)
*变量引用的时候,不加$,$1....$n
awk `{print NR}` /etc/fstab /etc/passwd
awk `{print FNR}` /etc/fstab /etc/passwd
存储文件的名字
awk `{print FILENAME}`/etc/passwd
awk `{print FILENAME}` /etc/passwd
ARGC 整个命令的段数 【注意:数组中不包含‘program’本身】
ARGV 数组 用来调取命令中,指定的ARGC的字段
RS 指定换行符\n可以指定新的换行符,不影响本身的换行
ORS 输出的时候指定的换行符,默认换行符指定默认字符
awk -v RS =""{print}
4、模式匹配(地址定界)
1、空值,没有定义,默认就将文件中所有的行,放入awk进行循环
2、对固定的1、3行进行操作
sed -n `1,3p`/etc/passwd
awk `1,3{print}` /etc/passwd ?/?默认不支持使用1-3,1,3等等,这样数值的直接写法;
awk `NR>=1&&<=3;{print}` /etc/passwd
3、/pattern/,/
sed /pat1/p /etc/passwd
awk '/r..ter/{print}' /etc/passwd
4、/pat1/./pat2 第一次匹配Pat1到Pat2的
5、模式匹配可以直接使用判断语句
awk -F :'$NF=="/bin/bash"{print $1,$3}'/etc/passwd
6、BIGEIN|END 语句
BIGEIN定义在默认循环进行操作前所要执行的语句;
awk -F:'BEGIN{printf“shell程序为bash的用户为:\n”}$NF=="/bin.bash"{print $1,$3}' /etc/passwd
awk -F:'BEGIN{printf“shell程序为bash的用户为:\n”}$NF=="/bin.bash"{print $1,$3}'END{print "end"} /etc/passwd

5、操作符
运算操作符:
+-*/ %(取余、取模)** //(取整)
比较运算符:
== ! = <> =<=
~!~
逻辑操作符:
&&
||
!
赋值运算:
= += -= /= *= %= ^= //=
条件表达式:
条件语句? 条件成立语句;条件不成立语句
awk '/^title/{FN<=2? print;printf"参数\n"}' /boot/grub/grub.conf

6、常见(action)
print printf 以及它任何命令的操作都是action
1、expressions
2、control statement 控制语句 例如:if while
逻辑关系语句判断来进行结和
3、语句组合 compound statements

4、Input statements 输入语句
5、output statements 输出语句

7、常见语言(if while do for break continue delete switch)
1、if语句
语法格式:if(条件表达式){执行语句}
if (条件表达式){执行语句}else{执行语句}
awk ‘/^title/{if(Fn<=2){print}else{print " 参数过少"}}’/boot/grub/grub.conf
awk '/^title/{if(NF>=2) print $4}' /boot/grub/grub.conf
2、while
只有对参数进行遍历的时候才会使用循环;
例题:awk '/^[[:space:]]*kernel\>/{print}' grub.conf
语法格式:
只有对行参数进行
3、for语句
语法格式:for(初始值;条件判断;初始值控制语句){循环体}
awk '/^[:space:]]*kernel\>/{for(i=0;i<=NF;i++){print $i"\t";print length($i)}}' grub.conf
循环建议用for循环
在awk中,for也可以使用和shell中一样的格式:
回顾:
for (i in 列表){循环体}
echo "wsl is good boy" | awk 'for i in{$i}'
例题:

4、do -while 循环
语法:do {循环体} while (循环条件)
注意和while的区别:while语句只有在满足条件的时候,才会进入循环,而do while 会先执行循环体一次,在进行判断;
5、循环跳出语句
break 【n】跳出n次循环
continue 跳出本次循环
next 跳出默认的当次循环
NR%2==1 next
awk `{if(NR%2==1){else {print}}}` /etc/passwd
6、switch 类似于case
语法格式:switch (expression){caseVALUE1 or /REGXP/: statement;case VALUE2 or /REGEXP2/:statement;……default;statemwnt}
switch(表达式){case 模式匹配值:执行语句;case模式值:执行语句;case模式匹配值:执行语句,}
8、数组
在awk中,数组和shell中数组特性相同
注意:awk中数组不用定义,只要使用了,就有值为空的默认数组;这样做数据统计的时候非常常见!!!!!!
行遍历---实际上就是整个文件的遍历
列遍历---取对象固定某列的中的,相同数据的统计。

注意:数组通过for语句,在给其他变量进行赋值的时候,赋值的index索引信息;
练习:
awk '{for (i=1;i<=N;i++){count[4i++]}}end{for(i in count){print 1,count[i]}}' /etc/fstab

9、函数
1、内置函数:
函数调用:function(参数)
length($1)
数学运算上使用的函数 sin()cos()cot()tan()
sub(x,x,x)替换第一个匹配到的值
gsub(x,x,x)替换该行所匹配到的所有值
split(x,x,x)指定分隔符去切割文件。
---------------------------------------------------------------------------------------------------------------------

chroot 

切换系统目录
/--/dev/sda1
原来的操作系统的shell程序切换到一个新的目录下面去,然后再在这个目录下面放置相应系统启动需要的程序文件。
拓展:
虚拟化准备知识:系统的启动原理
读取系统--读取磁盘:前提就是必须现价载磁盘的驱动程序
挂载 虚拟根(img虚根文件ramdisk)
虚根文件文件挂上以后,在grub1.4
通过chroot将ramdisk 上面的临时“根”切换到磁盘上面

···················································································································

 

posted on 2019-08-23 08:24  此生来过_无悔  阅读(2385)  评论(0编辑  收藏  举报