awk 【单独的编程语言解释器】
1、awk介绍
 全称:Aho Weinberger Kernaighan 三个人的首字母缩写;
 1970年第一次出现在Unix机器上,后来在开源领域使用它;
 所以,我们在Linux中使用,改名为GNU awk;所以,在Linux上实际上叫做gawk;
 grep 行过滤器
  -o -i -v -E  grep  egrep  fgrep【写什么就匹配什么】
 sed 行编辑器
  -n p 1、地址定界 3,5,/pat/【e】 2、命令 p a \ i \ w c \ s/pat/str/g|1|2..|&
  ${var/pat/str} ${var//pat/str}
  ${test}、${#test}、${test:offset:length}、${test#*word}、${test##*word}、${test%word}、${test%%*word}、${test/pattern/string}、${test//pattern/string}、${test:-word}
 
 awk 报告生成器
  通过模式匹配以及自己本身的语言格式,来获取、并输出客户所需要的内容;
 【默认情况下,三个工具都不去编辑源文件】
 示例:获取系统上面用户id大于等于1小于等于500的用户的用户名和用户ID
 for i in $(cut -d: -f3 /etc/passwd);do
  if [ $i -ge 1 -a $i -le 500 ];then
   echo grep $i | cut -d: -f1,3
  fi
 done
 
 awk -F: '{if($3>=1&&$3<=500){print $3}}' /etc/passwd
 # awk最后实现这个功能的时候只需要一句话就可以!
 格式化输出的意义:
 awk -F: -v OFS=":" 'BEGIN{printf "   username      uid    \n========================\n"}{if($3>=1&&$3<=500){printf "用户名:%-10s UID:%-10d\n",$1,$3}}END{printf "---------------------------\nend\n"}' /etc/passwd
2、awk工作原理
 xxxxx(看图)
3、awk的用法
 awk [option] ... 'program' FILE ...
 1、program  必须使用 !单引号!
 2、多条program语句使用大括号包含起来,可以并列,可以嵌套
 awk '{print}' /etc/passwd
4、awk的常见option
 -F 指定分隔符
 awk -F[/:] '{print $1,$3}' a.txt
  其中 [  ] 内表示多个字符中的任意一个
 -v 因为awk是一种语言编译器,能自己定义变量,同时也有内置变量(与环境变量类似)
  手动指定变量参数
 awk -v a="a/b" '{print a}' a.txt
  给a赋值,打印a这个变量
  1、a是自定义变量  -v FS=":"
  2、在awk中调用调用变量 不用加 $ 符号
 awk '{a="a/b";print a}' a.txt
 扩展:了解 cut 与 awk 的区别;
5、awk的语法格式  -- program
 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  数值
   %e  %E  科学计算数值
   %c  ACSii码值
   %f   浮点数
   %u  无符号整数
   %%  逃逸符 只显示 % 自己
  修饰符
   默认为右对齐
   -  代表左对齐
   %5.4f  
   5  所占位数
   4  所取小数位
 awk '/^UUID/{printf "被挂载文件:%-50s  挂载点:%-10s  文件系统格式:%-10s\n",$1,$2,$3}' /etc/fstab
  注意:这里提到了地址定界
  sed /PAT1/,/PAT2/
 
 3、变量(内置变量、自定义变量)
  内置变量 -- 环境变量(bash)(env、set -C +C)
   awk语言所默认支持的变量
   FS   定义输入分隔符的变量
   OFS   定义输出分隔符的变量
   NF  定义行分隔以后的参数个数 ($NF 分隔以后最后的一列变量)
    *变量引用的时候,不用加$,$0,$1...$n
  awk -v FS=":" '/\/bash$/{print $1,$NF}' /etc/passwd
   NR  定义文件的行数,定义多个文件的文件的,行号叠加
   FNR  文件只计算自己的行号
  awk '{print NR}' /etc/fstab /etc/passwd
  awk '{print FNR}' /etc/fstab /etc/passwd
   FILENAME 存储文件的名字
  awk '{print FILENAME}' /etc/passwd   //把文件名打印N次,N文件的行数
  awk 'BEGIN{print FILENAME}' /etc/passwd   //BEGIN{语句} 只在行循环开始时,执行一次;
   ARGC  整个命令的 段数  【注意:不包含 'program' 本身】
   ARGV  数组,用来调取命令中,指定的段 ARGV[2]  【注意:数组中也不包含 'program' 】
  awk 'BEGIN{print ARGC}' /etc/passwd /etc/fstab /etc/shadow
  awk 'BEGIN{print ARGV[3]}' /etc/passwd /etc/fstab /etc/shadow 
   RS   指定换行符 \n 可以指定新的换行符,不影响本身的换行
   ORS   输出的时候指定的换行符,将默认换行符替换为指定字符
  awk -v RS=" " '{print}' /etc/passwd
  awk -v ORS=" " '{print}' /etc/passwd  //可以用来取消换行
  
  自定义变量
   -v 变量=值
    在后面'program'中去调用自定义变量时,直接使用即可
   或者将 “变量=值”语句直接写在'program'亦可;
  awk -v a="a/b" '{print a}' a.txt
  awk '{a="a/b";print a}' a.txt

Shell:Day09.笔记的更多相关文章

  1. Learning The Bash Shell读书笔记(整理)

    最近搞了一本书 Learning Bash Shell,发现有人已经写了阅读笔记,我就在这边整理一下 来自blog:http://blog.sina.com.cn/n4mine Learning Th ...

  2. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  3. Shell编程笔记

    Shell编程笔记与Windows下熟悉的批处理类似,也可以将一些重复性的命令操作写成一个脚本方便处理.   修改别人的脚本,运行后遇到个问题 setenv: command not found 查证 ...

  4. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  5. 菜鸟教程之学习Shell script笔记(上)

    菜鸟教程之学习Shell script笔记 以下内容是,学习菜鸟shell教程整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-shell.ht ...

  6. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  7. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  8. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...

  9. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

随机推荐

  1. 5W2H方法:七问分析法

    5W2H分析方法也叫七问分析法,是二战中美国陆军兵器修理部首创.简单.方便.易于理解.使用,富有启发意义,被广泛应用于企业管理和技术活动,对于决策和执行性的措施也非常有帮助,有助于弥补考虑问题的疏漏. ...

  2. Python——项目-小游戏

    开始我们的项目 飞机大战 1 项目的初体验 以及前期准备 游戏初体验画面 验证一下本地第三方包有没有导入 python3 -m pygame.examples.aliens 如果没有出现游戏画面请先安 ...

  3. C#的关键字Explicit 和 Implicit

    一.explicit和implicit explicit 关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符:implicit 关键字用于声明隐式的用户自定义的类型转换运算符. 总结来说: ...

  4. Spark入门(七)--Spark的intersection、subtract、union和distinc

    Spark的intersection intersection顾名思义,他是指交叉的.当两个RDD进行intersection后,将保留两者共有的.因此对于RDD1.intersection(RDD2 ...

  5. React利用Antd的Form组件实现表单功能(转载)

    一.构造组件 1.表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等. 这里先引用了封装的表单域 <Form.Item /> 2.使用Form.create处 ...

  6. Linux学习第六天

    学习Linux环境下的挂载命令. 什么是挂载命令? 1.Windows下,mount挂载,就是给磁盘分区提供一个盘符(C,D,E,...).比如插入U盘后系统自动分配给了它I:盘符其实就是挂载,退优盘 ...

  7. 聊聊OkHttp实现WebSocket细节,包括鉴权和长连接保活及其原理!

    一.序 OkHttp 应该算是 Android 中使用最广泛的网络库了,我们通常会利用它来实现 HTTP 请求,但是实际上它还可以支持 WebSocket,并且使用起来还非常的便捷. 那本文就来聊聊, ...

  8. 使用 Docker 部署 Spring Boot 项目

    Docker 介绍 Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口.它是目前最流行的 Linux 容器解决方案. Docker 将应用程序与该程序的依赖,打包在一个文件里面 ...

  9. JAVA EE,JAVA SE,JAVA ME,JDK,JRE,JVM之间的区别

    JAVA EE是开发企业级应用,主要针对web开发有一套解决方案. JAVA SE是针对普通的桌面开发和小应用开发. JAVA ME是针对嵌入式设备开发,如手机. JRE是程序的运行环境 JDK是程序 ...

  10. VS中执行汇编代码

    unsigned char shellcode[] = "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50" &qu ...