shell脚本 awk报告生成器

命令格式:

awk 选项 'BEGIN{}pattern{commands}END{}'  file file1 file2....

1、BEGIN{}:正式处理数据之前执行

2、pattern:匹配模式 (可省略)

3、{commands}: 处理命令,可能多行 用分号隔开(类似于 sed -i '/^#/d;/^$/d' my.cnf.bak   删除以#开头的行和空行) 

4、END{} :处理完所有匹配数据后执行

2、3步骤:每行依次执行该步骤

内置变量:
$0 
本行

awk '{print $0}END{}' passwd  输出passwd文件的每行数据

$1-$n  行内的列

NF(number field) 该行的字段的个数

awk 'BEGIN{FS=":"}{print NF}' passwd  以:为分隔符,输出每行的字段数

NR  (number row)   处理行的行号(多个文件一块计数 从1开始)

FNR (file number row)    文件处理行的行号(多个文件重新计数)

FS(field separator) 行内的分隔符(默认值为空格 ,不管有多少个空格都是默认,或者tab键 都可以)

awk 'BEGIN{FS=":"}{print $1}' passwd  输出passwd文件里每行以:为分隔符的第一列的内容

RS (row separator)  行分隔符

awk 'BEGIN{FS=":";RS="|||||"}{print $1}' passwd

OFS (output filed separator )   输出行内分隔符

ORS (output row separator)   在输出列表中修改默认的行分隔符

awk 'BEGIN{ORS="&";FS=":"}{print $1}' passwd  在输出列表中用&连接输出内容用以代替默认的行分割符

awk 'BEGIN{ORS="&";FS=":";OFS=":"}{print $1,$2}' passwd    在输出多个列时,用OFS连接列与列,用&连接行与行,类似于aaa:bbbb&ccc:ddd

pattern:两种模式

1、RegExp

 awk 'BEGIN{FS=":"}/sbin/{print $0}' passwd   输出passwd中所有包含sbin的行

 awk 'BEGIN{FS=":"}/^root/{print $0}' passwd   输出passwd中所有以root开头的行

2、运算符匹配

关系运算符:

<(<= )     小于(小于等于)

>(>=)   大于(大于等于)

== (!=)  等于(不等于)

~     匹配正则

!~    不匹配正则

awk 'BEGIN{FS=":"}$3<100{print $0}' passwd    输出以:为分隔符  第3个字段小于100的所有行

awk 'BEGIN{FS=":"}$3~/[0-9]{3,}/{print $0}' passwd  输出以:为分隔符  第3个字段包含的数字大与等于3位的所有行

布尔运算符:

|| 或

&&与

! 非

awk 'BEGIN{FS=":"}$1=="meng"||$1=="tss"{print $0}' passwd   

算数运算符:

+ 、-、*、/(可以得到小数,并非像高级语言的整数值)、%(取模)、^或**(乘方)、++x、x++、--x、x--

awk 'BEGIN{a=10;b=11;print a,b}'   输出10 11

commands:

printf:

%s以字符串输出    awk ‘BEGIN{FS=":"}{printf "%s\n",$1}’ file  以:为分隔符 输出每一行的第一个字段并用\n换行 

                               awk ‘BEGIN{FS=":"}{printf "%-20s\n%+10s",$1,$2}’ file  以:为分隔符 输出每一行的第一个字段并用\n换行,并且第一个字段占20个字符左对齐(-),第二个字段占 10个字符右对齐(+) (当添加字符长度的默认为右对齐)

%d 以十进制输出

%f 以浮点数输出 (%0.2f  小数点之后保存2位)

%x 以十六进制输出 (%#x  在输出前面加上0x 以标识16进制)

%o 以八进制输出(%#x  在输出前面加上0 以标识8进制)

条件语句:

BEGIN{
        FS=":"
}

{
        if($3<50){
                printf "%-20s%-20s%-5d\n","小于50的",$1,$3
        }
        else if($3>50 && $3<100){
                printf "%-20s%-20s%-5d\n","大于50的小于100的",$1,$3
        }
        else {
                printf "%-20s%-20s%-5d\n","大于50的",$1,$3
        }
}
awk -f file passwd   把模式写入到file文件中

循环语句:

while循环

BEGIN{
        while(i<=100){
                sum+=i
                i++
        }
        print sum
}

for循环

BEGIN{
        for(i=0;i<=100;i++){
                sum+=i
        }
        print sum
}
do-while循环

BEGIN{
        do{
                sum+=i
                i++

        }while(i<=100)
        print sum
}

选项:

-v 参数传递(定义或引用变量)

-f 指定脚本文件    awk -f file passwd   把模式写入到file文件中

-F 指定分隔符  awk -F ":" "{print $1}"

-V 查看awk的版本号

数组的用法:

shell中的用法:在shell命令行中:

array=('"111" "222" "333")   下标从0开始   注意:不是以逗号分割,而是以空格分割

打印所有元素 echo ${array[@]}

打印元素: echo ${array[2]}

打印元素个数:echo ${#array[@]}

打印数组中某个元素的长度  echo ${#array[2]}

给元素赋值 array[2]="444"

删除某个元素 unset array[2]      删除所有元素 unset array      删除数组元素并不会对索引进行重新排序

 分片访问:echo ${array[@]:1:3}    从下标为1的元素 往后取3个元素    包括1下标

元素替换:${array[@]/a/b}  把数组中每个元素中第一个a替换成b    ${array[@]//a/b}  全部替换

遍历:

for a in array

do

      echo $a

done  

mysql命令参数:

-u 用户名

-p 密码

-h 服务器ip地址

-D 数据库名

-N 不输出列信息

-B 使用tab代替默认交互分隔符

-e 执行sql语句

-E 垂直输出

-H 以html格式输出

-X 以xml格式输出

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值