shell脚本之正则表达式(三)——awk工具

  

awk工具

  

在Linux系统中,awk是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于Shell脚本,完成各种自动化配置任务。

  <人力资源/>   <人力资源/>   

awk常见用法

  

一般来说awk所使用的命令格式如下所示,其中,单引号加上大括号“{}”用于设置对数据进行的处理动作.awk可以直接处理目标文件,也可以通过“- f”读取脚本对目标文件进行处理。

  
 <代码> awk选项的模式或条件{编辑指令}的文件1文件2 ?//过滤并输出文件符条件的内容
  awk - f脚本文件文件1文件2 ?//从脚本中调用编辑指令,过滤并输出内容 
  

awk相对倾向于将一行分成多个”字段“然后再进行处理,且默认情况下字段的分隔符为空格或者tab键.awk执行结果可以通过打印的功能将字段数据打印显示。在使用awk命令的过程中,可以使用逻辑操作符“,和”,表示“与”、“| |”表示“或”、“!”表示“非”;还可以进行简单的数学运算,如+、-、*、/?,^分别表示加,减,乘,除,取余和乘方。

  <人力资源/>   

在Linux系统中/etc/passwd是一个非常典型的格式化文件,各字段间使用“:”作为分隔符隔开,Linux系统中的大部分日志文件也是格式化文件,从这些文件中提取相关信息是运维的日常工作内容之一。若需要查找出/etc/passwd的用户名,用户ID,组ID等列,执行以下awk命令即可。

  
 <代码> [root@192 ~] # awk - f‘:’’{打印$ 1、$ 3 $ 5}"/etc/passwd
  根0根
  本1本
  守护进程2守护进程
  adm 3 adm
  lp 4 lp
  同步5同步
  关闭关闭6  
  <人力资源/>   <人力资源/>   

awk工作原理图

  

翱桥平疟局虮泶锸?三)——awk工具“
awk从输入文件或者标准输入中读入信息,与sed一样,信息的读入也是逐行读取的。不同的是awk将文本文件中的一行视为一个记录,而将一行中的某一部分(列)作为记录中的一个字段(域)。为了操作这些不同的字段,awk借用壳中类似于位置变量的方法,用$ 1,$ 2,3美元?顺序地表示行(记录)中的不同字段。另外awk用$ 0表示整个行(记录)。不同的字段之间是通过指定的字符分隔.awk默认的分隔符是空格.awk允许在命令行中用“- f分隔符”的形式来指定分隔符。

  <人力资源/>   <人力资源/>   

awk内建变量(可直接用)

  
 <代码> FS:指定每行文本的字段分隔符,默认为空格或制表位
  尼克-弗瑞:当前处理的行的字段个数
  NR:当前处理的行的行号(序数)
  0:当前处理的行的整行内容
  $ n:当前处理行的第n个字段(第n列)
  文件名:被处理的文件名
  拉尔夫-舒马赫:数据记录分隔,默认为\ n,即每行为一条记录 
  <人力资源/>   <人力资源/>   

awk用法

  

<强> 1。按行输出文本

  
 <代码> awk{打印}的尝试。txt//输出所有内容,等同于猫用法
  awk的{打印$ 0}’试试。txt//输出所有内容,等同于猫用法
  awk的NR==1, NR==3{打印}’试试。txt//输出第1 ~ 3行内容
  awk的(NR>=1),和(NR<=3){打印}’试试。txt//输出第1 ~ 3行内容
  awk的NR==1 | | NR==3{打印}’试试。txt//输出第1行,第3行内容
  awk的(NR % 2)==1{打印}’试试。txt//输出所有奇数行的内容
  awk的(NR % 2)==0{打印}’试试。txt//输出所有偶数行的内容
  awk/etc/passwd根/{打印}' '/^//输出以根开头的行
  awk/nologin $/{打印}的/etc/passwd//输出以nologin结尾的行
  awk的开始{x=0};/\/bin \/bash美元/{x + +}, {x}打印结束的/etc/passwd//统计以/bin/bash结尾的行数,等同于grep - c/bin/bash美元/etc/passwd
  awk的开始{RS=" "};结束{打印NR}’/etc/squid/squid.conf//统计以空行分隔的文本段落数 
  <人力资源/>   
<>强范例演示
  
 <代码> [root@192选择]# awk”(NR % 2)==1{打印}’试试。txt//输出奇数行内容
  1
  3.
  5
  7
  9
  
  [root@192选择]# awk”(NR % 2)==0{打印}’试试。txt//输出偶数行内容
  2
  4
  6
  8
  0  
  <人力资源/>   

<强> 2。按字段输出文本

  
 <代码> awk{打印3美元}的测试。txt//输出每行中(以空格或制表位分隔)的第3个字段
  awk{打印$ 1、$ 3}的测试。txt//输出每行中的第1,3个字段
  awk - f”:“2美元=="{打印}’/etc/shadow//输出密码为空的用户的影子记录
  awk的开始{FS=": "};2美元=="{打印}’/etc/shadow//输出密码为空的用户的影子记录
  awk - f”:“7美元~”/bash”{打印$ 1}’/etc/passwd//输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
  awk(1美元~”nfs”),和(NF==8){打印$ 1、$ 2}的/etc/services//输出包含8个字段且第1个字段中包含nfs的行的第1,2个字段
  awk - f”:“(7美元!=/bin/bash),和(7美元!="/sbin/nologin”){打印}"/etc/passwd//输出第7个字段既不为/bin/bash也不为/sbin/nologin的所有行

shell脚本之正则表达式(三)——awk工具