一、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   #默认打印$

四、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的语法格式----program

1、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       ==
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 $,$} 'END{printf "end\n"}' /etc/passwd

5、操作符

运算操作符

  +  -  *  /  %  ^(乘方)  //

比较运算符

  >  <  ==  !=  >=  <=  ~(等于)  !~

awk -F: '-FS~"/bin/bash" {print $1,$3}' /etc/passwd

逻辑操作符

  &&  ||  !

赋值操作符

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

条件表达式

  条件语句? 条件成立语句;条件不成立语句

awk '/^title/{NF<=2? print; print "参数过少"}' /boot/grub/grub.conf

6、常见action

  print 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 = %-2d\n",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,x)  替换该行所有匹配到的所有值

awk -F: '{print gsub(o,O,$1) }' /etc/passwd第一列所有o替换为O

  split(x,x,x)  指定分隔符去切割文件

netstat -tan | awk '/^tcp\>/{split($5,ip,":");print ip[1]}'

Linux--shell的awk--10的更多相关文章

  1. Linux Shell编程 awk命令

    概述 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是l ...

  2. Linux Shell 命令--awk

    说明: awk被设计用于数据流,能够对列和行进行操作.而sed更多的是匹配,进行替换和删除.awk有很多内建的功能,比如数组,函数等.灵活性是awk的最大优势.  awk的结构}{i++}END{pr ...

  3. Linux Shell编程(10)——引用变量

    当要引用一个变量的值时,一般推荐使用双引号.使用双引号除了变量名前缀($).后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符.用双引号时$仍被当成特殊字符,允许引用一个被双 ...

  4. linux shell grep/awk/sed 匹配tab

    处理文件的命令实在是多, sed, awk, grep等.遇到了需要匹配tab的情况, 记录一下. 例子如下:找出文本中第一列是1的行. 文本a 解法1 : 直接使用正则表达式, ^表示开头, \t表 ...

  5. 【转】Awk 命令学习总结、AWk命令系列学习(linux shell)

    前面的话 学习linux 的同人,都知道linux shell文本处理能力非常强大.有一组强大的文本处理工具:grep,sed,awk . 其中grep 经常用作查找匹配文本.sed用作文本编辑替换. ...

  6. linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行

    linux shell编程,先等10秒再判断是否有进程存在,存在就再等10秒再杀了进程才运行 crontab每分钟执行一次,但5秒以上才有更新数据,有时候一分钟可能跑不完上一个进程,需要先等10秒再判 ...

  7. Awk 命令学习总结、AWk命令系列学习(linux shell)

    AWK基本语法 下面没有提到awk命令怎么使用了,你可以通过 运行:awk –h 查询到所有命令及参数!下面把awk作为一门语言分节介绍. linux awk 内置变量使用介绍   awk语言中,怎么 ...

  8. Linux - Shell - cut: 低配 awk

    概述 简述 shell 命令行工具 cut 背景 偶尔需要用 awk 来筛选特定的列 awk 很是强大 但是强大的背后, 却伴随着复杂 其实同样的功能, awk 也没有复杂多少 如果是 简单的任务, ...

  9. Linux Shell 重定向与管道【转帖】

    by 程默 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以 ...

  10. 【shell 大系】Linux Shell常用技巧

    在最近的日常工作中由于经常会和Linux服务器打交道,如Oracle性能优化.我们数据采集服务器的资源利用率监控,以及Debug服务器代码并解决其效率和稳定性等问题.因此这段时间总结的有关Linux ...

随机推荐

  1. 个人永久性免费-Excel催化剂功能第44波-可见区域复制粘贴不覆盖隐藏内容

    Excel的复制粘贴操作,每天都在进行,若其中稍能提升一点效率,长久来说,实在是很可观的效率提升. Excel自带的复制粘贴功能,若复制的数据源或粘贴的目标位置中有隐藏的行列内容,简单一个复制粘贴充满 ...

  2. python 面向对象编程 - 小游戏

    面向对象写的小游戏 欢迎玩耍 class Omnicience: camp = 'Omniscience' def __init__(self, name, atk=100, hp=1000, mp= ...

  3. HTML结构 语义化思想

    总体思想:用正确的标签做正确的事情! 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析. 主要体现: 1. 对用户而言, ...

  4. backtracing

    5月10日 1 37  Sudoku Slover public void solveSudoku(char[][] board) { if(board == null || board.length ...

  5. T-SQL 小全

    --====================================================== ----数据库概念:创建.删除.使用数据库 ----================= ...

  6. HTTP文件上传原理

    前言 对于这块知识点,我一直都是模糊的,不是非常清楚的.在平时的工作中,遇到上传的问题,也没有深入的去研究过,也都是直接用别人封装好的类来完成自己的工作.某一天,看了本书,说到这个知识点,一脸茫然,觉 ...

  7. HashMap、Hash Table、ConcurrentHashMap

    这个这个...本王最近由于开始找实习工作了,所以就在牛客网上刷一些公司的面试题,大多都是一些java,前端HTML,js,jquery,以及一些好久没有碰的算法题,说实话,有点难受,其实在我不知道的很 ...

  8. Mysql之锁、事务绝版详解---干货!

    一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...

  9. 夯实Java基础(九)——final关键字

    1.前言 Java语言中的final关键字,想必大家都不是很陌生,我们自己用的最多的应该是用来定义常量吧,那么今天我们就来了解final这个关键字的用法,这个关键字还是非常简单的. final从字面意 ...

  10. Git命令备忘录

    目录 前言 基本内容 开始之前 基础内容 远程仓库 分支管理 前言 Git在平时的开发中经常使用,整理Git使用全面的梳理. 基本内容 开始之前 请自行准备好Git工具以及配置好Git的基本配置 基础 ...