Linux自学笔记——awk文本处理工具

简介:

 

GUN awk

文本处理三剑客:grep,sed,awk

   grep,egrep,fgrep:文本过滤工具:pattern

   sed:行编辑器

      模式空间、保持空间

   awk:Aho,Weinberger,Kernighan –-> New AWK,NAWK

   GNU awk,gawk

下面一起来看看awk的基本语法及具体应用;

gawk – pattern scanning andprocessing language

   基本用法:gawk [option]‘program’FILE…

      program:PATTERN{ACTION STATEMENTS}

        语句之间用分号分隔

        print,printf

      选项:

        -F:指明输入时用到的字段分隔符;

        -v var=value:自定义变量;

1.print

   print item1,item2,…

   要点:

1)逗号分隔符;

2)输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;

3)如省略item,相当于print $0;

2.变量

2.1內建变量

   FS:input field separator,默认为空白字符;

   OFS:output field seperator,默认为空白字符;

   RS:input record separator,输入时的换行符;

   ORS:output record separator,输出时的换行符;

  

   NF:number of field,字段数量

      {print NF},{print $NF}

   NR:number of record,行数;

   FNR:各文件分别计数;行数;

 

   FILENAME:当前文件名;

  

   ARGC:命令行参数的个数;

   ARGV:数组,保存的命令行所给定的各参数;

2.2自定义变量

1) –v var=value

   变量名区分字符大小写;

2) 在program中直接定义

 

3.printf命令

   格式化输出:printf FORMAT,item1,item2,…

1)FORMAT必须给出;

2)不会自动换行,需要显式给出换行控制符,\n

3)FORMAT中需要分别为后面的每个item指定一个格式化符号;

 

格式符:

    %c:显示字符的ASCII码;

    %d,%i:显示十进制整数;

    %e,%E:科学计数法数值显示;

    %f:显示为浮点数;

    %g,%G:以科学计数法或浮点形式显示数值;

    %s:显示字符串;

    %u:无符号整数;

    %%:显示%自身

 

修饰符:

    #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;例如:%3.1f

    -:左对齐

    +:显示数值的符号

4.操作符

   算术操作符

      X+y,x-y,x*y,x/y,x^y,x%y

      +x:转换为数值

   字符串操作符:没有符号的操作符,字符串连接

   赋值操作符:

      +,+=,-=,*=,/=,%=,^=

      ++,--

   比较操作符:

      >,>=,<,<=,!=,==

   模式匹配符:

      ~:是否匹配

      !~:是否不匹配

   逻辑操作符:

      &&

      || 

      

   函数调用:

      function_name(arg1,arg2,…)

   条件表达式:

      selector?if-true-expression:if-false-expression

      wKiom1nbImPQ8BgbAABPerwxq9I752.png-wh_50

5.PATTERN

1)empty:空模式,匹配每一行;

2)/regular expression/:仅处理能够被此处的模式匹配到的行;

3)relation1 expression:关系表达式;结果有真有假;结果为真才会被处理;

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

4)line ranges:行范围,startline,endline:/pat1/,/pat2/

   注意:不支持直接给出数字的格式

示例:打印/etc/passwd里的第2到第10个用户

   wKioL1nbIhuQjuj9AAAXYfoMejA143.png-wh_50

5)BEGIN/END模式

      BEGIN{}:仅在开始处理文件中的文本之前执行一次;

      END{}:仅在文本处理完成之后执行一次;

 

6.常用的action

   1)expressions

   2)control statements:if,while等;

   3)compound statements:组合语句;

   4)input statements

   5)output statements

 

7.控制语句

   if(condition) {statements}

   if(condition) {statements} else {statements}

   while(condition) {statements}

   do {statements} while(condition)

   for(expr1;expr2;expr3) {statements}

   break

   continue

   delete array[index]

   delete array

   exit

   { statements }

7.1 if-else

   语法:if(condition) statement[else statement]

示例1:将系统中的所有用户分类,id号大于1000的打印出普通用户,否则打印出root或系统用户;

   wKioL1nbIiXD0xa7AABEyQFg7TA398.png-wh_50

示例2:打印出使用bash的用户;

   wKioL1nbIi3A2T9xAAAbzXxsEOk586.png-wh_50

示例3:打印出字段大于5的行

   wKiom1nbIx2QgSS1AABN8wKtbm4130.png-wh_50

示例4:打印出磁盘用量超过百分之20的磁盘

   wKiom1nbIzfQ9yi2AAAUc0W7nHc276.png-wh_50

   使用场景:对awk取得的整行或某个字段做条件判断;

7.2 while循环

   语法:while(condition) statement

      条件“真”,进入循环;条件“假”,退出循环;

   使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;

示例:从/etc/grub.conf文件中取出,以任意空格开头,后面紧跟kernel的行,并将其字段大于7的字段和字段的字符数打印出来;

   wKiom1nbI0DB_hCZAABjwzTinZE581.png-wh_50

7.3 do-while循环

   语法:do statement while(condition)

      意义:至少执行一次循环体

7.4 for循环

   语法:for(expr1;expr2;expr3) statement

      for(variable assignment;condition;iteration process) {for-body}

   wKiom1nbI0qhF0bJAABmFQMrLMM817.png-wh_50

  

   特殊用法;

      能够遍历数组中的元素:

        语法:for(var in array) {for-body}

7.5 switch语句

   语法:switch(expression) {case VALUE1 or /REGEXP/:statement;case VALUE2 or /REGEXP2/:statement;…;default:statement}

 

7.6 break和continue

   break[n]

   continue

 

7.7 next

   提前结束对本行的处理而直接进入下一行;

示例:打印/etc/passwd偶数行

   wKioL1nbIwWg_wYUAAA3gux-kzQ444.png-wh_50

 

8. array

   关联数组:array[index-expression]

   Index-expression

1)可使用任意字符串;字符串要使用双引号;

2)如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”

 

若要判断数组中是否存在某元素,要使用“index in array”格式进行;

weekdays[mon]="Monday"

  

   若要遍历数组中的每个元素,要使用for循环:

   for(var in array) {for-body}

   示例:打印数组元素:

   wKiom1nbI2SRF8f0AAAZ7X2Gqok850.png-wh_50

   注意:var会遍历array的每个索引;

   state[“LISTEN”]++

   state[“ESTABLISHED”]++

   示例:统计tcp协议状态及相应个数:

   wKiom1nbI22BEhfbAABV3jrItck149.png-wh_50

练习1:统计/etc/fstab文件中每个文件系统类型出现的字数;

   wKioL1nbIyWRASUOAAAZjPfQJAY430.png-wh_50

练习2:统计指定文件中每个单词出现的次数;

   wKioL1nbIy_TtbjJAAB1SVEgBZA011.png-wh_50

9.函数

9.1内置函数

   数值处理:

      rand():返回0和1之间的一个随机数;

   字符串处理:

      length([s]):返回指定字符串的长度;

  sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;

gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;

split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;

wKiom1nbI43imfCqAAAgEHiK0lo465.png-wh_50




本文转自 claude_liu 51CTO博客,原文链接:http://blog.51cto.com/claude666/1970930,如需转载请自行联系原作者

相关文章
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
15天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
29 0
|
16天前
|
Linux Perl
Linux|从 STDIN 读取 Awk 输入
Linux|从 STDIN 读取 Awk 输入
20 4
|
15天前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
21 0
|
1天前
|
监控 安全 Linux
Linux系统之安装ServerBee服务器监控工具
【4月更文挑战第22天】Linux系统之安装ServerBee服务器监控工具
32 2
|
1天前
|
编解码 Linux 数据安全/隐私保护
linux工具之curl与wget高级使用
linux工具之curl与wget高级使用
|
2天前
|
Linux Android开发
Linux(6)CH9434 SPI调试笔记
Linux(6)CH9434 SPI调试笔记
12 0
|
2天前
|
Linux
Linux(5)WIFI/BT调试笔记
Linux(5)WIFI/BT调试笔记
17 0
|
监控 关系型数据库 应用服务中间件
|
3天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。