linux文本处理三剑客之 awk 命令

文章目录

      • 1. awk是什么
      • 2.awk的编程模型
      • 3.awk模式匹配
          • 3.1 第一种调用方式,将模式和动作写在terminal里面 后面接一个文件
        • 3.2 -f 第二种 将awk写在一个文件里
          • 3.3 以awk脚本的形式来执行awk命令
      • 4.记录和域
      • 5.关系和布尔运算
          • 5.1 ~匹配正则表达式
      • 6.表达式
      • 7.系统变量
      • 8.格式化输出
      • 9.内置字符串函数
          • (1)gsub函数
          • (2)index
          • (1)length
      • 10 练习
      • 11.宿主目录是什么

1. awk是什么

  • AWK 是一个优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。它的分类有 NAWK GAWK AWK。AWK 经过改进生成的新的版本 GAWK,NAWK,现在默认linux系统下日常使用的是 GAWK。
    它也是行处理模式.

linux文本处理三剑客之 awk 命令_第1张图片
linux文本处理三剑客之 awk 命令_第2张图片

2.awk的编程模型

linux文本处理三剑客之 awk 命令_第3张图片

3.awk模式匹配

linux文本处理三剑客之 awk 命令_第4张图片

3.1 第一种调用方式,将模式和动作写在terminal里面 后面接一个文件

模式是/ /中间的动作是{ }之间的,此语句 的意思是一旦读入的输入文件行是空行,就打印this is a …

input文件里面有空白内容
linux文本处理三剑客之 awk 命令_第5张图片
linux文本处理三剑客之 awk 命令_第6张图片

3.2 -f 第二种 将awk写在一个文件里

最好将文件名写成.awk
linux文本处理三剑客之 awk 命令_第7张图片

3.3 以awk脚本的形式来执行awk命令

和文件名无关
linux文本处理三剑客之 awk 命令_第8张图片
linux文本处理三剑客之 awk 命令_第9张图片
在这里插入图片描述

4.记录和域

linux文本处理三剑客之 awk 命令_第10张图片
Tab键会被默认为连续的空格
linux文本处理三剑客之 awk 命令_第11张图片
对文本文件分域处理是Linux系统处理文本的方式,如sort,uniq.

1)$后跟数字

linux文本处理三剑客之 awk 命令_第12张图片
linux文本处理三剑客之 awk 命令_第13张图片

2)$后跟表达式`

linux文本处理三剑客之 awk 命令_第14张图片

3)tab被默认为连续的空格

linux文本处理三剑客之 awk 命令_第15张图片

4-F 改变分隔符 以tab键为例

linux文本处理三剑客之 awk 命令_第16张图片
linux文本处理三剑客之 awk 命令_第17张图片

  • 多个tab键怎么办
    +号,不管有多少个tab ,都看成一个tab键

linux文本处理三剑客之 awk 命令_第18张图片
linux文本处理三剑客之 awk 命令_第19张图片

(5)环境变量FS和BEGIN改变分隔符

linux文本处理三剑客之 awk 命令_第20张图片
linux文本处理三剑客之 awk 命令_第21张图片

5.关系和布尔运算

在这里插入图片描述
linux文本处理三剑客之 awk 命令_第22张图片

5.1 ~匹配正则表达式
  • ~ 匹配正则表达式 !~ 不匹配正则表达式
awk 'BEGIN {FS=":"} $1~/root/' passwd		#找到文件中第一域匹配root的部分输出该行
awk 'BEGIN {FS=":"} $0~/root/' passwd		#找到文件中全部域匹配root的部分输出该行
awk 'BEGIN {FS=":"} $0!~/home/' passwd 	#找到文件中全部域不匹配root的部分输出该行

linux文本处理三剑客之 awk 命令_第23张图片

awk 'BEGIN {FS=":"} {if ($3<$4) print$0}' passwd 
awk 'BEGIN {FS=":"} {if ($3==1||$4==10) print$0}' passwd 

linux文本处理三剑客之 awk 命令_第24张图片

6.表达式

  • 跟其他编程语言一样,awk表达式用于存储、操作和获取数据。一个awk表达式可由数值、字符常量、变量、操作符、函数和正则表达式自由组合而成

  • 变量是一个值的标识符,定义awk变量非常方便,只需要定义一个变量名并将值赋给它即可

  • 注意: 1.变量名只能包含字母、数字和下划线,而且不能以数字开头 2.定义awk变量无须声明变量类型,每个变量有两种类型的值:字符串值和数值。awk根据表达式上下文来确定使用哪个值;变量的默认数值为0,默认字符串值为空

awk '/^$/{print x++}' input		#先输出x再+1
awk '/^$/{print ++x}' input 		#先+1再输出x,即输出空白行行号

linux文本处理三剑客之 awk 命令_第25张图片

7.系统变量

awk定义了很多的内建变量用于建设环境信息,我们称它为系统变量。
这些系统变量可分为:
第一种用于改变awk的默认值,如域分隔符;
第二种用于定义系统值,在处理文本时可以读取这些系统值。如记录中的域数量,当前记录数、文件名等。

  • NF:记录的域数量
  • NR:显示当前的记录数,该值根据读取输入文件的进度而变化。读取第一条记录 时,NR=1;读取到末尾时,NR为包含该文件所包含的记录数
  • $0:打印记录的所有域
  • FILENAME:表示当前的输入文件名
awk ' BEGIN {FS=","} {print NF,NR,$0} END{print FILENAME}' test3

在这里插入图片描述

8.格式化输出

前面的例子只涉及awk如何输入文件进行处理,对于输入的格式并未规定。
awk的一大主要功能是产生报表,报表就是要求按照于定的格式输出。awk借鉴C语言的语法,定义了printf输出语句,它可以规定输出的格式。

awk 'BEGIN {FS=","} {printf("%s\t%d\n",$2,$3)}' test3
awk 'BEGIN {FS=","} {printf("%s\t%d\n",$2,$5)}' test3
awk 'BEGIN {printf("%c\n",65)}'  #awk的ascii字符的转换
awk 'BEGIN {printf("%f\n",2020)}'  #awk的字符型字符的转换
awk 'BEGIN {printf("%.3f\n",2020)}'
awk 'BEGIN {printf("%.3f\n",2020.021515)}'
awk 'BEGIN {FS=":"} {printf("%-15s\t%s\n",$1,$3)}' test3
       #-15表示字符串长度控制为为15位,若字符串不足15位,则用空格补充。

\s代表字符串 第二个域
\t代表tab键 第3个域
每输出两个域换行

linux文本处理三剑客之 awk 命令_第26张图片

9.内置字符串函数

(1)gsub函数

gsub函数执行字符串替换功能,将第一个字符串替换为第二个字符串

awk 'BEGIN {FS=":";OFS=":"} gsub(/root/,"haha",$1) {print $0}' passwd 	#此处的OFS表示输出指定分隔符
awk 'BEGIN {FS=":"} gsub(/root/,"haha",$1) {print $0}' passwd 			#不指定PFS的话默认以空格为分隔符输出

在这里插入图片描述

(2)index

index返回第二个字符串在第一个字符串出现的首位置

awk 'BEGIN {print index("telephone","ph")}'

在这里插入图片描述

(1)length

length返回字符串长度

awk 'BEGIN {print length("telephone")}'

在这里插入图片描述

10 练习

linux文本处理三剑客之 awk 命令_第27张图片
1
linux文本处理三剑客之 awk 命令_第28张图片
2
linux文本处理三剑客之 awk 命令_第29张图片
3
linux文本处理三剑客之 awk 命令_第30张图片
4
linux文本处理三剑客之 awk 命令_第31张图片

11.宿主目录是什么

上级目录或父目录。

1:在linux中,每个用户都有一个自己存放数据的目录。如果是超级用户root,则其宿主目录缺省情况下是:/root。

2:这个是找到的UNIX 系统下每个用户都拥有的一个目录。它是用户登录进入时的当前目录,而且随时可通过 cd(改变目录)命令回到这个目录下,cd 后不需要加任何路径名。

3:用户文件通常都被保存在宿主目录及其子目录下linux和unix差不多。
5
linux文本处理三剑客之 awk 命令_第32张图片
6
linux文本处理三剑客之 awk 命令_第33张图片
7.
用NR对2取模,当余数为1时,awk的执行模式判断为真,就会执行默认的{print}输出奇数行,当余数不为1时,判断为假,不执行输出,所以偶数行就不会输出。
linux文本处理三剑客之 awk 命令_第34张图片
8
linux文本处理三剑客之 awk 命令_第35张图片

你可能感兴趣的:(shell)