澳门新浦京8455com帝国CMS多值字段morevaluefield解密

澳门新浦京8455com 38

王国CMS多值字段morevaluevield解密,深度解析帝国CMS多值字段本领秘技。

  • awk介绍
  • awk变量
  • printf命令:实现格式化输出
  • 操作符
  • awk pattern
  • awk action
  • awk数组
  • awk函数
  • awk脚本

  awk,逐行管理公事内容。Linux里的awk其实是“gawk”。

主干概述

一、awk介绍

  • 功能:
    告诉生成器,情势化文本输出
    何况也是一门语言:格局扫描和管理语言

  使用格式:

帝国CMS7.0新扩大了多值字段。像下载地址、在线地址、图片集等这样的将多少个内容寄存到五个字段的成效,增添字段时精选多值表单成分就可以,功效越来越强有力,扩张越来越灵敏。

(一)awk的骨干语法概念

  • 主干格式:

awk [options] 'program' file…
awk [options] -f program_file file…
  • program平常由:BEGIN语句块、能够使用方式相称的通用语句块、END语句块,共3片段组成,平时放置于单引号或双引号中

    • program格式:BEGIN{ action;… } pattern{ action;… } END{ action;…
      }
    • pattern:决定动作语句哪一天触发及触发事件
    • action statements:对数码实行拍卖,放在{}内指明
  • 选项:
    -F:指明输入时用到的字段分隔符,暗许以空格作为分隔符
    -v var=value:自定义变量

  • 分割符、域和记录

    • 文本的每一行称为记录,每一列称为字段(域)
    • awk实施时,由分隔符分隔的字段(域)称为域标志,标识为$1,$2..$n,$0为全体域。
    • 只顾:此处的$与shell中变量$符号含义差异
    • 省略action,则默许实行print $0 的操作

    awk [选项]
‘格局相称 {命令 命令参数}’ file1, file2, ……

扶持设定Infiniti列与Infiniti行数据录入,并且援救设置必填的列,以致默许行数。

(二)awk的行事原理

  • 先是步:推行BEGIN{action;… }语句块中的语句

    • BEGIN语句块在awk伊始从输入流中读取行在此以前被执行,那是叁个可选的语句块,举例变量初叶化、打字与印刷输出表格的表头等语句平日能够写在BEGIN语句块中
  • 其次步:从文件或标准输入(stdin卡塔尔(قطر‎读取一行,然后实践pattern{ action;…
    }语句块,它逐行扫描文件,从第一行到最终一行再度那么些历程,直到文件全部被读取实现。

    • pattern语句块中的通用命令是最注重的片段,也是可选的。若无提供pattern语句块,则暗中同意实施{
      print },即打字与印刷每二个读取到的行,awk读取的每一行都会实行该语句块
  • 其三步:当读至输入流末尾时,实践END{action;…}语句块

    • END语句块在awk从输入流中读取完全部的行之后即被实行,举个例子打字与印刷全部行的深入分析结果这类音信集中都以在END语句块中成就,它也是几个可选语句块

 

构造解析

(三)print语句

  • 语法:print item1, item2, …

    • 逗号分隔符
    • 输出的各item能够字符串,也足以是数值;当前记录的字段、变量或awk的表明式
    • 省略item,相当于print $0
  • 示例1-1:

awk '{print "hello, awk"}'           //等待输入,每输入一条打印一次"hello, awk"
awk '{print}' /etc/passwd            //逐条打印/etc/passwd文件
awk '{print "wang"}' /etc/passwd     //每读入/etc/passwd文件一行,打印一次"wang"
awk -F: '{print $1}' /etc/passwd     //打印/etc/passwd文件以":"作为分隔符的第1列
awk -F: '{print $0}' /etc/passwd     //逐条打印/etc/passwd文件
awk -F: '{print $1,$3}' /etc/passwd  //打印以":"作为分隔符的第1列和第3列,以空格作为分隔符输出
awk -F: '{print $1"t"$3}' /etc/passwd    //打印以":"作为分隔符的第1列和第3列,以制表符作为分隔符输出
tail -3 /etc/fstab | awk '{print $2,$4}'  //打印/etc/fstab文件最后3行以空格作为分隔符的第2列和第4列
支持的选项 说明

-f program-file

–file program-file

从文件接收 awk指令,可以同时指定多个文件

-F fs

–field-separator fs

指定(fs)列分隔符

-v var=value

–assign var=value

为 BEGIN 块定义变量var,指定其值为value

-d[file]

–dump-variables[=file]

 

trylife熟知帝国CMS数据构造的客商都知情早先的morepic downpath onlinepath
字段积存是之类:

二、awk变量

 

单行以换行符分割,单项以三个冒号分隔

(一)内置变量

  • FS:输入字段分隔符,默认为空白字符,能够在program中援引
    awk -v FS=':' '{print $1,FS,$3}' /etc/passwd,注意print中的逗号表示1个空格

    • awk变量也足以援引Shell变量,便于脚本编辑撰写
      fs=":" ; awk -v FS=$fs '{print $1,FS,$3}' /etc/passwd

澳门新浦京8455com 1

  • OFS:输出字段分隔符,默以为空白字符
    awk -v FS=':' -v OFS=':' '{print $1,$3,$7}' /etc/passwd

澳门新浦京8455com 2

  • 普拉多S:输入记录分隔符,钦命输入时的换行符,原换行符仍然有效
    awk -v RS=':' '{print $1}' /etc/passwd

    • 专一到当钦赐以”:”作为记录分隔符时,输出每条记下的第三个字段时,除了第1条记下外,其他记录的客商名音讯都放任了。

    澳门新浦京8455com 3

    • 由来在于文件每一行行尾的换行符,当钦命其余标识为记录分隔符后,其本人的换行效用博得保留,所以每一行行尾的shell信息和下一行的客户名音讯被视作为一条记下,而记录的第二个字段为bash音信,客商名音讯未有打字与印刷。

澳门新浦京8455com 4

  • O讴歌ZDXS:输出记录分隔符,输出时用钦赐符号替代换行符
    awk -v RS=':' -v ORS='###' '{print }' /etc/passwd

    • 下图红框的两侧内容之间从未”###”分隔,评释归属一条记下,现身的换行注脚原来的著作件行尾的换行符成效依然保留,再一次注解上文所述

    澳门新浦京8455com 5

  • NF:字段数量

    • awk '{print NF,$0}' /etc/fstab,打字与印刷每一行并在行首标注所在行字段数量(以空格为字段分隔符)

    澳门新浦京8455com 6

    • awk -F: '{print $(NF-1)}' /etc/passwd,打字与印刷每行尾数第四个字段(以冒号为字段分隔符)

    澳门新浦京8455com 7

  • NR:行号

    • awk '{print NR,$0}' /etc/fstab,打字与印刷每行的行号

    澳门新浦京8455com 8

    • awk '{print NR,$0}' /etc/fstab /etc/inittab能够何况打字与印刷四个公文,可是行号两次三番编写

    澳门新浦京8455com 9

  • FN瑞鹰:各文件分别计数,行号
    awk '{print FNR,$0}' /etc/fstab /etc/inittab

澳门新浦京8455com 10

  • FILENAME:当前文件名
    awk '{print FILENAME}' /etc/fstab

澳门新浦京8455com 11

  • A奥迪Q3GC:命令行参数的个数
    awk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab
    种种红框内容被当作三个参数

    澳门新浦京8455com 12

  • A奥迪Q3GV:数组,保存的是命令行所给定的各参数
    awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittab
    awk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab
    awk 'BEGIN {print ARGV[2]}' /etc/fstab /etc/inittab

澳门新浦京8455com 13

  demo,ipaddress俩文件的内容是环网柜、柱上开关柜的主、备ip地址。分别以制表符、冒号分割。

a::::::b::::::c::::::d::::::/r/na2::::::b2::::::c2::::::d2::::::/r/n

(二)自定义变量

  • 自定义变量区分朗朗上口写,有二种概念格局

    • -v 选项定义
    • 在program中定义
  • 实验:自定义变量的利用

    • awk -v test='hello, gawk' 'BEGIN{print test}',直接选取v选项定义
    • awk 'BEGIN{test="hello, gawk";print test}',在program中定义

    澳门新浦京8455com 14

    • awk -F: '{sex="male";print $1,sex,age;age=18}' /etc/passwd
      首行未有第4个字段,因为打字与印刷首行首个字段后才对其变量举办了赋值,之后每一行打字与印刷时变量已经赋值,能够健康显示

    澳门新浦京8455com 15

    • 也得以将program部分写入文件中,使用awk的-f选项导入

echo '{print script,$1,$2}' > awkscript
awk -F: -f awkscript -v script="awk" /etc/passwd

澳门新浦京8455com 16

$ cat demo
RingNetwork     181.36.1.8      182.36.4.8
Switch          181.32.1.22     182.36.4.42
Switch          181.32.1.23     182.36.4.43
$ cat ipaddress
R:181.36.1.8:182.36.4.8
S:181.32.1.22:182.36.4.42
S:181.32.1.23:182.36.4.43

王国CMS7.0的多值字段储存则是这样大的

三、printf命令:实现格式化输出

  • 语法:printf “FORMAT”, item1, item2, …

    • 必须要钦赐FORMAT
    • 不会自动换行,要求显式给出换行调控符:n
    • FORMAT中需求各自为后边各个item钦定格式符
  • 格式符:与item对应

    • %c:显示字符的ASCII码
    • %d, %i:展现十进制整数
    • %e, %E:显示科学计数法数值
    • %f:展现为浮点数
    • %g, %G:以科学计数法或浮点方式显得数值
    • %s:展现字符串
    • %u:无符号整数
    • %%:显示%自身
  • 修饰符:

    • #[.#]:第一个#支配展现的幅度,第1个#意味着小数点后精度,%3.1f
    • -:左对齐(暗中认可右对齐)%-15s
    • +:显示数值的正负符号%+d
  • 实验:printf的使用

    • 突显/etc/passwd文件以冒号为分隔符的第1,3列,并且第1列宽20左对齐,第3列宽10右对齐
      awk -F: '{printf "%-20s %10dn",$1,$3}' /etc/passwd

    澳门新浦京8455com 17

    • 呈现/etc/passwd文件以冒号为分隔符的第1,3列,格式:”Username:
      第1列内容 , ID: 第3列内容”,在那之中第1列内容宽15左对齐
      awk -F: '{printf "Username: %-15s,ID: %dn",$1,$3}' /etc/passwd

    澳门新浦京8455com 18

  命令:

单行以多个竖线分割,单项以多个七个冒号分割。

四、操作符

  • 算术操作符:
    x+y, x-y, x*y, x/y, x^y, x%y
    -x: 转换为负数
    +x: 转换为数值

  • 赋值操作符:
    =, +=, -=, *=, /=, %=, ^=
    ++, —

  • 正如操作符:
    ==, !=,>, >=, <, <=

  • 情势相称符:
    ~:侧面是或不是相称侧面
    !~:右边是或不是不相称左侧
    示例:
    awk -F: '$0 ~ /root/{print $1}' /etc/passwd
    打字与印刷/etc/passwd文件包罗”root”内容行的率先个字段(以”:”分隔)
    awk '$0 ~ "^root" ' /etc/passwd
    打字与印刷/etc/passwd文件行首为”root”的行
    awk '$0 !~ /root/' /etc/passwd
    打字与印刷/etc/passwd文件不带有”root”内容的装有行
    awk -F: '$3==0' /etc/passwd
    打字与印刷/etc/passwd文件以”:”分隔的第八个字符等于0的保有行

  • 逻辑操作符:与&&,或||,非!
    示例:
    awk -F: '$3>=0 && $3<1000 {print $1}' /etc/passwd
    打字与印刷root客户和系统顾客名称(CentOS 7)
    awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd
    打字与印刷root客商和普通客商的称号(CentOS 7)
    awk -F: '!($3==0){print $1}' /etc/passwd
    打字与印刷除root客商外的具备客户名称
    awk -F: '!($3>=500) {print $3}' /etc/passwd
    打字与印刷root顾客和系统客商的UID(CentOS 6)

  • 函数调用:function_name(argu1, argu2, …)

  • 标准化表明式(三目表明式):
    selector?if-true-expression:if-false-expression
    示例4-1:
    awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s: %-sn",$1,usertype}' /etc/passwd
    打字与印刷顾客名称,假诺普通客商则其后输出”Common User”,不然输出”Sysadmin
    or
    SysUser”,中间以”:”分割。客户名称宽20右对齐,其后的类型音信左对齐(CentOS
    7)

澳门新浦京8455com 19

    print 
打字与印刷输出,参数之间接选举用逗号分隔。

a::::::b::::::c::::::d::::::||||||a2::::::b2::::::c2::::::d2::::::

五、awk pattern

  • PATTE福特ExplorerN:遵照pattern条件,过滤匹配的行,再做拍卖
    • 设若未钦赐:航空模型式,匹配每一行

    printf 
输出时,须求内定输出格式。

剧情页调用

(一)正则表明式:/regular expression/

仅管理格局相称到的行,需求用”/ /”括起来

 

?php/* 内容页调用多值字段示例 trylife@diguoCMS.com 20130513 假设字段这个多值字段为tl**/$exp=explode('||||||',$navinfor[tl]);foreach($exp as $k=$v){ /*下一行是分割多值字段的每行中的每项*/ $exp2=explode('::::::',$v); /* $exp2[0] $exp2[1] 以此类推分别是每行的第一个值 第二个值 第三个值 */ echo 'li'.$exp2[0].' '.$exp2[1].'/li';}?

(二)关系表明式:结果为“真”才会被拍卖

真:结果为非0值,非空字符串
假:结果为空字符串或0值

printf 输出格式铆定符
格式
铆定符
效果说明 例子(页面最下边)
%c 打印成 ascii 码表的“char”形式 2.1
%s 输出字符串 2.2
%d, %i 十进制数的整数部分 2.3
%o 无符号八进制数的整数部分 2.4
%x, %X 同上,大小的区别表示[a-f],[A-F] 2.5
%u 无符号的十进制数的整数部分  
%f 浮点数 2.6
%% 输出%,相当于\输出反斜线一样  
%10s 预留10个字符位置,右对齐  
%-10s 左对齐显示  

(三)行范围

/pat1/,/pat2/:帮忙接受正则表明式描述,不扶植直接付出数字格式

 

(四)BEGIN/END模式

BEGIN{}:仅在始发拍卖文件中的文本从前实施三回
END{}:仅在文本管理实现之后实行一次

 

示范5-1:pattern中正则表达式和关系表达式的用法

  • awk '/^UUID/{print $1}' /etc/fstab
    打字与印刷/etc/fstab文件以UUID起头的行的第1列

澳门新浦京8455com 20

  • awk '!/^UUID/{print $1}' /etc/fstab
    打字与印刷/etc/fastab文件不以UUID伊始的行的第1列

  • awk -F: 'i=1;j=1{print i,j}' /etc/passwd
    以此命令是awk -F: 'i=1{print $0};j=1{print i,j}' /etc/passwd的简化,program第1条语句关系决断为真(i=1卡塔尔,故打字与印刷行当;第2条语句关系推断为真(j=1卡塔尔,故打字与印刷i和j值

澳门新浦京8455com 21

  • awk '!0' /etc/passwd; awk '!1' /etc/passwd
    打字与印刷全体行;一行也不打字与印刷

  • awk -F: '$3>=1000{print $1,$3}' /etc/passwd
    打字与印刷/etc/passwd文件以”:”为分隔符的第3列数值高于等于1000的行的第1和第3列

  • awk -F: '$3<1000{print $1,$3}' /etc/passwd
    打印/etc/passwd文件以”:”为分隔符的第3列数值低于1000的行的第1和第3列

  • awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
    打字与印刷/etc/passwd文件以”:”为分隔符的结尾一列是”/bin/bash”的行的第1列和末段1列

  • awk -F: '$NF~ /bash$/{print $1,$NF}' /etc/passwd
    打字与印刷/etc/passwd文件以”:”为分隔符的终极一列是以”bash”作为行尾的行的第1列和最后1列

  • seq 10 | awk 'i=!i'
    读入第1行时,i值取反为1所以打字与印刷行业,读入第2行时,i值为1取反后为0所以不打字与印刷行当,读入第3行与读入第1行肖似,读入第4行与读入第2行相近,就那样推算,所以结果为打字与印刷奇数行

澳门新浦京8455com 22

  • seq 10 | awk '!(i=!i)'seq 10 | awk -v i=1 'i=!i'
    与上文相像,结果为打字与印刷偶数行

澳门新浦京8455com 23

  听而不闻变量:

示范5-2:pattern中央银行范围和BEGIN/END情势的用法

  • awk -F: '/^root>/,/^nobody>/{print $1}' /etc/passwd
    打字与印刷/etc/passwd文件从行首是”root”单词的行至行首是”nobody”单词的行中以”:”作为分隔符的第1列

    澳门新浦京8455com 24

  • awk -F: 'BEGIN{printf "%-8s%sn---------n","USER","UID"}/^root>/,/^sync>/{printf "%-8s%dn",$1,$3}END{print "========="}' /etc/passwd
    BEGIN和END方式适用于打字与印刷表头和表尾

澳门新浦京8455com 25

    FS 
输入列分割符

六、awk action

  • 常用的action分类
    (1State of Qatar Expressions:算术,比较表明式等
    (2) Control statements:if, while等
    (3卡塔尔(قطر‎ Compound statements:组合语句
    (4) input statements
    (5) output statements:print等

    OFS  输出列分隔符

(一)awk调整语句:if-else

  • 效果:对awk得到的整行或某些字段做标准判定

  • 语法:
    if(condition) {statement;…} [else statement]
    if(condition1) {statement1} else if(condition2){statement2} else
    {statement3}

  • 示例6-1:
    awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
    打字与印刷普通客户名称和UID(CentOS 7)
    awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
    打字与印刷/etc/passwd文件以”:”为分隔符的尾声一列是”/bin/bash”的行的第1列
    awk '{if(NF>5) print $0}' /etc/fstab
    打字与印刷/etc/fstab文件以空格为分隔符字段数超越5的行
    awk -F: '{if($3>=1000) {printf "Common User: %sn",$1} else {printf "Sysadmin or SysUser: %sn",$1}}' /etc/passwd
    普通顾客输出”Common User”,其余客户输出”Sysadmin or
    SysUser”,中间以”:”分割,然后打字与印刷顾客名称(CentOS 7)
    df| awk -F% '/^/dev/sd/{print $1}'| awk '$NF>=80{print $1,$NF}'
    反省磁盘分区占用率,开掘占用率大于等于的分区将分区名称和占用率打字与印刷出来
    awk -F: '{if($3>=1000){printf "Common User: %sn",$1} else if($3==0){printf "Sysadmin: %sn",$1} else{printf "SysUser: %sn",$1}}' /etc/passwd
    普通客商输出”Common
    User”,系统客户输出SysUser”,root客商输出”Sysadmin”,中间以”:”分割,然后打印客户名称(CentOS
    7)

澳门新浦京8455com 26

    奇骏S  输入行分割符

(二)awk调控语句:while循环

  • 意义:条件“真”,步入循环;条件“假”,退出循环

  • 语法:while(condition){statement;…}

  • 示例6-2:

    • awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
      寻找/etc/grub2.cfg文件以不定数据(包涵0个)空格作为行首后接字符串”linux16″的行,以空格为分隔符打字与印刷那么些行每一个字段内容和字段长度

    澳门新浦京8455com 27

    • awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10) {print $i,length($i)}; i++}}' /etc/grub2.cfg
      找寻/etc/grub2.cfg文件以不定数据(包蕴0个)空格作为行首后接字符串”linux16″的行,以空格为分隔符寻找长度抢先10的字段,把字段和字段长度打字与印刷出来

    澳门新浦京8455com 28

    O宝马7系S  输出游分割符

(三)awk调整语句:do-while循环

  • 成效:无论真假,最少实施一遍循环体

  • 语法:do {statement;…}while(condition)

  • 示例6-3:
    awk 'BEGIN{ total=0;i=0;do{ total+=i;i++}while(i<=100);print total}
    从1到100求和

 

(四)awk调整语句:for循环

  • 语法:for(expr1;expr2;expr3) {statement;…}

  • 广阔用法:
    for(variable assignment;condition;iterationprocess) {for-body}

  • 特别用法:能够遍历数组中的成分
    语法:for(var in array) {for-body}

  • 示例6-4:
    awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
    寻找/etc/grub2.cfg文件以不定数据(包涵0个)空格作为行首后接字符串”linux16″的行,以空格为分隔符打字与印刷那个行各个字段内容和字段长度

澳门新浦京8455com 29

  • 实施:awk, shell脚本和bc的属性相比较
    time awk ‘BEGIN{sum=0;for(i=1;i<=1000000;i++){sum+=i};print
    sum}’
    time (sum=0;for i in {1..1000000};do let sum+=i;done;echo $sum)
    time (sum=0;for ((i=1;i<=1000000;i++));do let sum+=i;done;echo
    $sum)
    time seq -s “+” 1000000 | bc

澳门新浦京8455com 30

能够看来awk实践功用最高,bc次之,shell脚本的频率最差

    NF  记录数(当前拍卖的)

(五)awk调控语句:switch, break, continue, next语句

  • switch语句
    语法:switch(expression) {case VALUE1 or /REGEXP/: statement1; case
    VALUE2 or /REGEXP2/: statement2; …; default: statementn}

  • break和continue
    awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
    {if(i%2==0)continue;sum+=i}print sum}’
    从1至100的奇数求和
    awk ‘BEGIN{sum=0;for(i=1;i<=100;i++) {if(i==66)break;sum+=i}print
    sum}’
    从1至66求和

  • next
    提前结束对行业管理而直接步向下一行管理(awk自个儿循环)
    awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd
    输出UID为偶数的客商名称和UID

    NTiguan  行数(当前拍卖)

七、awk数组

 

(一)awk数组的为主用法

  • awk数组均为涉嫌数组:array[index-expression]

  • index-expression格式:
    (1卡塔尔国 可使用任性字符串;字符串要选用双引号括起来
    (2State of Qatar即使某数组成分事情未发生前不设有,在引用时,awk会自动创造此因素,并将其值起首化为“空串”

  • 若要推断数组中是不是存在某成分,要选拔“index in array”格式举行遍历

  • 示例7-1:

    • awk '{arr[$0]++;print $0,arr[$0]}' password
      输出文件中的每一行,而且输出那是第四次重复本行音信

    澳门新浦京8455com 31

    • awk '!arr[$0]++' password
      去除重复行,能够相比较上海体育场地开掘前8行中的重复行已经未有。
      释疑:当行音讯率先次赋值给数组成分时,数组成分值为空,所以取反为真,输出此行;而当相近音信第二、三……次赋值时,数组成分值大于等于1,取反为假,不出口此行,进而完结不输出重复行。

      澳门新浦京8455com 32

    FNEvoque  行数(当前文件)

(二)awk数组的遍历

  • 若要遍历数组中的每一种成分,要使用for循环
    for(var in array) {for-body}
    var会遍历array的各种索引

  • 示例7-2:
    awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for (inx in weekdays) {print weekdays[inx]}}'
    遍历输出weekday数组的值

  • 实验:
    (1)总计处于差别网络状态的tcp连接数

    分析:首先用netstat -tan命令呈现tcp连接意况。计算连接数供给寻思难题:第一,如何过滤有效行,能够在awk中的pattern中设置;第二,怎么样存款和储蓄状态名称和拉长计数,能够利用awk的关周全组作用,将状态名称作为数组下标,何况数组自加1作为流量计;第三,如何输出每种意况和情形的多寡,能够行使for循环的遍历数组作用达成。

    代码完结如下:
    netstat -tan | awk '/^tcp>/{ip[$NF]++}END{for (idx in ip) {print idx,ip[idx]}}'

    澳门新浦京8455com 33

    (2)统计access_log文件各种ip地址的记录行数,并且输出游数最多的5个ip地址

    深入分析:查看文件格式,开掘ip地址坐落于行首,并且以空格为分隔符便是第一个字段

    澳门新浦京8455com 34

    上行下效实验(1)的思路,将$1作为数组下标达成计算不一致ip的记录数,最终for循环遍历输出每一种ip地址和著录行数。之后用sort排序工具按数字倒叙排序,用head工具输出前五行数据

    代码完结如下:
    awk '{ip[$1]++}END{for(idx in ip){print idx,ip[idx]}}' access_log | sort -nr -k2 | head -5

澳门新浦京8455com 35

 

八、awk函数

 

(一)数值处理:

  • rand(卡塔尔:重返0和1时期贰个私自数
    awk 'BEGIN{srand();for(i=1;i<=10;i++)print int(rand()*100)}'
    出口拾三个100以内的自由数,注意使用rand函数前先使用srand函数创设种子

 

(二)字符串管理:

  • length([s]卡塔尔国:再次来到钦点字符串的长短

  • sub(r,s,[t]卡塔尔:对t字符串实行寻找r表示的方式相称的开始和结果,并将第二个门道特别的从头到尾的经过替换为s
    echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
    将以空格为分隔符的第一个字段搜索到的第3个”:”替换为”-“
    输出结果为”2009-08:08 08:08:08″

  • gsub(r,s,[t]卡塔尔国:对t字符串举办搜索r表示的方式相称的剧情,并全体替换为s所代表的始末
    echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$1)'
    将以空格为分隔符的首个字段寻找到的各类”:”替换为”-“
    出口结果为”二〇一〇-08-08 08:08:08″

  • split(s,array,[r]State of Qatar:以r为分隔符,切割字符串s,并将切割后的结果保存至array所代表的数组中,第八个索引值为1,第叁个索引值为2,…
    netstat -tan | awk '/^tcp>/{split($5,ip,":");count[ip[1]]++}END{for (idx in count){print idx,count[idx]}}'
    netstat -tan出口结果中的Foreign
    Address列ip地址(不含端口号)和其现出次数总结出来,只可以动用三遍awk命令
    剖析:awk实现了以空格为分隔符取Foreign
    Address列字段$5的效果,再选用split函数再度将字段以”:”为分隔符分割。split函数分割的结果存款和储蓄在数组ip中,而急需之后遍历的消息在数组ip的第二个元素ip[1]中,故将ip[1]再赋值给新的数组count,自此就能够遍历新数组count计算现身次数


(三)自定义函数:

  • 格式:
    function name ( parameter, parameter, … ) {
    statements
    return expression
    }

  • 演示8-1:编写二个函数,达成出口三个变量的相当的大值
    将函数的兑现写在max.awx文件中,实施时导入文本
    文件中代码如下:

function max(var1,var2) {
        var1>var2?maxnum=var1:maxnum=var2
        return maxnum
}
BEGIN {printf " max num is %dn",max(a,b)}

施行命令,awx -f max.awx -v a=5 -v b=3,结果如下

澳门新浦京8455com 36

 

(四)awk调用shell命令:system()

  • 留意:空格是awk中的字符串连接符,假诺system中须求选择awk中的变量可以运用空格分隔,只怕说除了awk的变量外别的一律用””援引起来。

  • 示例8-2:

    • awk 'BEGIN{system("hostname") }'
      相当于在shell中实施hostname命令

    • awk 'BEGIN{score=100; system("echo your score is " score) }'
      调用shell命令echo your scre is,然后输出awk的变量score的值

1
输出文本 print

九、awk脚本

  • 能够将awk程序写成脚本,直接调用或进行

    • 小心:当实施awk脚本时,注意要求行首增加#! /bin/awk -f

    • 演示9-1:编写脚本user.awk,实现分行输出普通顾客的顾客名和UID(CentOS
      7)
      代码如下:

    #! /bin/awk -f
    {if($3>=1000)print $1,$3}
    

    运营脚本前给脚本增多实行权限,施行命令./user.awk -F: /etc/passwd

澳门新浦京8455com 37

  • 向脚本传递参数

    • 格式:
      awk_script_file var1=value1 var2=value2… Inputfile

    • 留意:在BEGIN过程中不可用。直到首行输入完成之后,变量才可用。可以因此-v
      参数,让awk在施行BEGIN此前得到变量的值。命令行中每贰个钦赐的变量都亟需叁个-v参数

    • 示范9-2:编写脚本uid.awk,输出钦赐范围UID号的客户名和其UID
      代码如下:

    #! /bin/awk -f
    {if ($3>=min && $3<=max)print $1,$3}
    

    运转脚本前给脚本增多实行权限,实施命令./uid.awk -F: min=10 max=50 /etc/passwd

    澳门新浦京8455com 38

1.1
输出钦命列消息

  抽出各个设备的主ip地址音信

$ awk '{print $2}' demo
181.36.1.8
181.32.1.22
181.32.1.23

 

1.2
列分隔符

1.2.1 列的援引表示

  $1、$2……分别代表最近管理行的第一列、第2列……。$0代表近期进全部列。

$ awk '{print $0}' demo
RingNetwork     181.36.1.8      182.36.4.8
Switch          181.32.1.22     182.36.4.42
Switch          181.32.1.23     182.36.4.43
$ awk '{print $1,$2,$3}' demo
RingNetwork 181.36.1.8 182.36.4.8
Switch 181.32.1.22 182.36.4.42
Switch 181.32.1.23 182.36.4.43

 

  输出awk管理的文本的列数。

$ awk '{print NF}' demo
3
3
3
$ awk '{print NF}' ipaddress
1
1
1
$ awk '{print NF}' demo ipaddress
3
3
3
1
1
1

 

1.2.2
输出列分割符

  awk暗许输出分隔符是空格,可以由此变量“OFS”校勘,要求使用双引号。

$ awk 'BEGIN{OFS=":"} {print $1,$2,$3}' demo
RingNetwork:181.36.1.8:182.36.4.8
Switch:181.32.1.22:182.36.4.42
Switch:181.32.1.23:182.36.4.43

 

1.2.3 输入列分割符

  awk以空白符作为暗中同意输入分割符,纵然分割不是制表符,而是有个别个空格符也一直以来能确切取到主ip。同不常间,还是能够纠正暗许输入分割符,通过变量“FS”显式钦赐分割符为空格。

 awk 'BEGIN{FS=":"} {print $1,$2,$3}' ipaddress
R 181.36.1.8 182.36.4.8
S 181.32.1.22 182.36.4.42
S 181.32.1.23 182.36.4.43

   或许在增选“F”里钦点分隔符。

$ awk -F: '{print $2}' ipaddress
181.36.1.8
181.32.1.22
181.32.1.23

 

1.3
行分隔符

  输出当前管理的行数

$ awk '{print NR}' demo ipaddress
1
2
3
4
5
6
$ awk '{print FNR}' demo ipaddress
1
2
3
1
2
3

 

2
输出文本 printf

2.1
验证printf命令的%c格式,是把ASCII的Dec列内容转变到Char列内容。(是否有一点像发电报相似)

[root@hp430G2 demo]# cat num
72
101
108
108
111
[root@hp430G2 demo]# awk '{printf("%c", $1)}END{printf("n")}' num
Hello

[root@hp430G2 demo]# cat num
72 101 108 108 111
[root@hp430G2 demo]# awk '{printf("%c%c%c%c%c", $1,$2,$3,$4,$5)}END{printf("n")}' num
Hello

  因为,printf默许不换行,全体要依据END,况且顺便依据不换行完毕单词的拼接。何况,格局数量必需与变量数量(列)对应起来。

 

2.2 验证printf命令的%s格式

[root@hp430G2 demo]# cat alpha
Hello
[root@hp430G2 demo]# awk '{printf("%s", $1,$2,$3,$4,$5)}END{printf("n")}' alpha
Hello

 

2.3 验证printf命令的%d、%i格式

[root@hp430G2 mag37]# cat int
3.1415926
[root@hp430G2 mag37]# awk '{printf("%i", $1)}END{printf("n")}' int
3
[root@hp430G2 mag37]# awk '{printf("%d", $1)}END{printf("n")}' int
3

 

2.4 验证printf命令的%o钦命输出八进制格式。

[root@hp430G2 mag37]# cat oct
181.37.1.42
182.37.4.42
[root@hp430G2 mag37]# awk -F. '{printf("%o.%o.%o.%on", $1,$2,$3,$4)}' oct
265.45.1.52
266.45.4.52

 

2.5 验证printf命令的%X、%x内定输出十三进制格式,分别出口字母部分的尺寸写。

[root@hp430G2 mag37]# cat hex
181.37.1.42
182.37.4.42
[root@hp430G2 mag37]# awk -F. '{printf("%x.%x.%x.%xn", $1,$2,$3,$4)}' oct
b5.25.1.2a
b6.25.4.2a
[root@hp430G2 mag37]# awk -F. '{printf("%X.%X.%X.%Xn", $1,$2,$3,$4)}' oct
B5.25.1.2A
B6.25.4.2A

 

2.6
验证%f,没搞了然,这里出口分割符不能够得逞钦命。

[root@hp430G2 mag37]# cat float
181.37 1.42
182.37 4.42
[root@hp430G2 mag37]# awk '{printf("%F %Fn",$1,$2)}' float
181.370000 1.420000
182.370000 4.420000

  行还是不行如此看,在应用了printf时,输出调节的义务就全盘交割了,变量被失效了。

 

3 数学生运动算

3.1
算术运算

BEGIN{
r=5
R=r*2
print R
y=R*3.14
print y
}

  援助广大操作符:+ – * / ^ %
=,分别代表加、减、乘、除、次方、取余数、赋值。

**3.2
条件运算**

  扶植规范推断:x
< y、x <= y、x > y、x >= y、x == y、x != y、x ~ RE、x !~
RE、&&、||,相比字符串的抑扬顿挫关系、相近关系、匹配正则表明式、五个表明式之间的涉嫌。以致规格表明式:?:

 

3.3
相配运算

#!/bin/awk -f

$1 ~ /^s/ {print}

  *
注意与上方例子中“print”命令使用“花括号”之处。

 

4
形式相称

4.1
逻辑相称

出口格局相配的行;首列大于19、在7到11里头、等于12。

awk '$1>19 {print}' demo.txt
awk '$1==12 {print}' demo.txt

 

上面包车型地铁授命,会使得输出值发生变化;为出口结果再度赋值。

awk '$1=12 {print}' demo.txt

 

4.2
使用正则表明式相称

行使正则表达式相称;大写字母前面随着小写字母、文件大小为2始发、取大小值

awk '/[[:upper:]][[:lower:]]/ {print}' demo.txt
awk '/:..[[:space:]]*2/ {print}' demo.txt
awk '/grep/ {print}' demo.txt

 

4.3
混合情势相配

找寻以七个数字发轫、第4列大于40、并且包涵五个大写字母前面跟着三个小写字母的行。

awk '/^[[:digit:]]/ && $4>40 && /[[:lower:]]/ {print}' demo.txt
awk '$1>7 && $1<11 {print}' demo.txt

 

4.4
区间格局

awk '/^8/,$4==37 {print}' new.txt

 

4.5
读取数据文件此前的“BEGIN方式”“END”

  由于“begin”块内的命令是在读取文件在此之前就起来奉行的,所以那边的指令无法是操作文件数量的通令。平日可以用来初阶化变量。执行各类就是从“BEGIN”开首,到“情势相配阶段的多寡管理命令”,最终实施“END”。

awk 'BEGIN{print "This is all lines in new.txt."} {print}' new.txt

 

END模块(这里的“BEGIN”、“END”必得是大写的)

awk '{print} END{print "File is over."}' new.txt

 

  在该情势下,awk变量的概念、赋值、援用。

[awk@h p]$ cat demo2.txt
This is for test of awk's begin and end.
[awk@h p]$ cat print.awk
#!/bin/awk -f

BEGIN{
print "begin"
}

{print}

END{
print "endnover"
}
[awk@h p]$ ./print.awk demo2.txt
begin
This is for test of awk's begin and end.
end
over

 

 

3 变量

变量
释义
$0
当前正在处理的记录
$n
第n个字段的值
NF
当前处理记录的字段数
NR
当前已经读入的记录数
FILENAME
正在处理的数据文件的名称
FS
字段分割符(默认空格、或制表符)
RS
记录分割符(默认换行)

 

  NF表示字段数,更使得的能够获得终极八个字段(当每行分裂字段时更实用)。能够取得文件名、文件大小

[root@Rsync logs4developers]# tree -fh | grep "M" | awk '{print $NF ,$(NF-1)}'

3.1
普通变量

[awk@h p]$ cat demo1.awk
#!/bin/awk -f

BEGIN{
age=33
say_hello="hello"
print age
print say_hello
[awk@h p]$ awk -f demo1.awk
33
hello

 

3.2
内置变量

[awk@h p]$ cat ip_port.txt
172.17.36.40:22,3306
10.134.1.4:22,1521
[awk@h p]$ awk 'BEGIN{FS=":"; RS="n"; RS=""; ip="ip = "; port="   port = "} {print ip $1 port $2}' ip_port.txt
ip = 172.17.36.40   port = 22,3306
ip = 10.134.1.4   port = 22,1521

 

4 使用脚本

4.1 在本子中进行awk 命令

[web@h p]$ cat my_awk.sh
#!/bin/awk -f

{print}
[web@h p]$ ./my_awk.sh demo.txt

 

4.2
人机联作格局下的“文件停止符”

运作那么些剧本

#!/bin/awk -f

BEGIN{
exitpro="press <ctrl+d> exit the script."
print "test is beginning."
print exitpro
print "============================="
}

{print}

END{
print "============================="
print "test is over."
}

  脚本运转后,终端等待输入内容,输入实现时需求给脚本文件发送“EOF”时域信号。按组合键“ctrl+d”退出(Windows平台“ctrl+z”)。

 

4.3
心得命令试行方式

运转那么些本子

#!/bin/awk -f

{
print
print "Have two print."
}

 

  当命令“print”没有“file“时,以相互格局实行;试行时这里也是急需“EOF”的,第一条命令实践完结后,推行下一条命令;但是“打字与印刷”命令始终是索要多个“EOF”的,而那几个实信号的收到不会耳濡目染前面命令的施行。

 

  看见上边的例子,我会以为“要求在EOF是因为有个指令的案由”。去掉脚本中的“print”命令,结果发掘照旧亟待。分化之处在于尚未回显。

  在本子实践时,增多二个“demo.txt”。开采脚本依旧得以推行,表明awk 在实行时,“pattern”、“actions”都足以不须求。

 

4.4
命令的实行各样

  awk管理“file”时,依据“记录”依次拍卖。此中的下令实行是每条命令实践完读入的一条“记录”下一条命令接着管理相像一条“记录”。

[awk@h p]$ cat demo.txt
This is row1.
This is row2.
This is row3.
[awk@h p]$ cat print-file.awk
#!/bin/awk -f

{
print
print
}
[awk@h p]$ 
This is row1.
This is row1.
This is row2.
This is row2.
This is row3.
This is row3.

 

6 函数

6.1
字符串函数

 

函数 释义
index(s1,s2) 返回 s2 在 s1 中的位置;返回值从“1”开始,“0”代表不存在
length(s1) 返回字符串的长度;返回整数值
match(s1,RE) 查找匹配正则表达式匹配的字符串;涉及变量“RSTART”,“RLENGTH”
split(s1,array,sep) 以“sep”分割“s1”后,返回“array”

 

[awk@h p]$ awk 'add=index($0,"sunny") {print add}' demo.txt
1
[awk@h p]$ awk '{print index($0,"sunny")}' demo.txt
1
0

 

 6.2
算术函数

函数 释义
int(x) 返回整数部分
rand() 反馈0~1之间的随机数
srand([x]) 反回一个基于“x”的随机数

 

7 数组

7.1
数组的定义与引用

#!/bin/awk -f

BEGIN{
port[1]=22
port[2]=3389
port[3]=10022

print port[1],port[2],port[3]
}

 

7.2
数组遍历

借用“for
循环”遍历数组元素

 

8 流水线调节

 

 

 

9 格式化输出

 

 

 

10 shell交互

 

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图