锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

linux shell awk BEGIN END 处理文本之前之后执行操作 简介

时间:2023-01-06 12:30:00 电容柜akw

目录

简介

1 最简单的action 既没有pattern 有没有options

2 awk是逐行处理

2.1 输出整行

2.2 输出最后一列

2.3 倒数第二列输出

3 pattern

3.1 begin 简单语法

3.2 不添加输入文件

3.3 begin pattern 演示

3.4 END


简介

awk它的名字来自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的第一个字母 ,用于在linux/unix处理文本和数据。

数据可以来自标准输入(stdin)、输出一个或多个文件或其他命令。

它支持用户自定义函数和动态正则表达式等先进功能linux/unix下一个强大的编程工具。

它用于命令行,但更多用作脚本。

awk有许多内部建筑功能,如数组、函数等,这与C语言相同,灵活性是awk最大优势。

虽然操作可能很复杂,但命令的语法总是:

awk ‘{pattern action}’ 或者 awk ‘pattern {action}’

grep 、sed、awk被称为linux中的"三剑客"。
grep 更适合简单的搜索或匹配文本
sed 更适合编辑匹配的文本
awk 更适合格式化文本,复杂格式处理文本

对于上述语法program又可细分为pattern和action,也就是说,awk基本语法如下
awk [options] ‘Pattern{Action}’ file

字面上理解 ,action指的是动作,awk擅长格式化和格式化后的文本输出,因此awk最常用的动作是print和printf,因为awk输出格式化后的文本是最常用的。

1 最简单的action 既没有pattern 有没有options

echo awk >test.txt # test.txt在文本中输入字符串awk awk {print} test.txt # 打印test.txt内容 

在这里插入图片描述

df | awk '{print $3}' 

本例中 $3表示 输出第三列,不指定分隔符时,默认使用空格作为分隔符,小心您必须发现,上述信息使用的空格不止一个,而是连续多个空格,awk连续空间自动理解为分割符,是否比较cut命令要简单得多。这样一个简单的例子有助于我们开始理解awk。

2 awk是逐行处理

逐行处理是指当awk处理一个文本时,会一行一行地处理,然后处理下一行,awk默认以"换行符"标记,识别每一行,也就是说,awk就像我们人类一样,每次遇到它,"回车换行",它被认为是当前行的结束,是新行的开始,awk如果没有指定的分割符,将根据用户指定的分割符进行分割,默认使用空格作为分隔符。

0 表 示 显 示 整 行 , 0 表示整行显示 ,0表示整行显示,NF表示当前分割后的最后一列(0 和 0和0和NF均为内置变量)注意,N F 和 N F 要 表 达 的 意 思 是 不 一 样 的 , 对 于 a w k 来 说 , NF 和 NF 要表达的意思不同,对awk来说,NF和NF要表达的意思不同,对awk来说,NF表示最后一个字段,NF表示当前行被分隔符切开后,有几个字段。也就是说,如果一行文本被空格分为七段,那么NF的值就是7,$NF的值就是$7, 而7 表 示 当 前 行 的 第 7 个 字 段 , 也 就 是 最 后 一 列 , 那 么 每 行 的 倒 数 第 二 列 可 以 写 为 7表示当前行的第七个字段,即最后一列,然后每行倒数第二列可以写为7,表示当前行的第7个字段,即最后一列,然后每行倒数第二列可以写为7(NF-1)。

2.1 输出整行

awk '{print $0 }' col_print.txt  

请注意,虽然上述结果是输出所有文本,但这并不意味着$0是输出所有文本。awk按行处理,即每次输出一行,直至输出全部内容。
来看如下实例即可知道:

2.2 输出最后一列

cat col_print.txt  | awk '{print $NF }' 

2.3 倒数第二列输出

cat col_print.txt  | awk '{print $(NF-1)}' 

2.4 共输出多少列?

cat col_print.txt  | awk '{print  NF}' 

2.5 输出多列

使用逗号将多列输出分开,如下所示,一次性输出第2列和第3列

cat  col_print.txt | awk '{print $2,$3}' 

2.6 添加自定义字段

除了输出文本中的列外,我们还可以添加自己的字段,将自己的字段与文件中的列结合起来。以下实践是可以的。>

cat col_print.txt  |awk '{ print "第一列:"$1,"第二列:"$2 }'


从上述实验中可以看出,awk可以灵活的通过双引号将我们指定的字符与每一列进行拼接,或者把指定的字符当做一个新列插入到原来的列中,也就是awk格式化文本能力的体现。

3 pattern

接下来认识下一Pattern,也就是我们所说的模式先介绍AWK 包含两种特殊的模式:BEGIN 和 END。
BEGIN 模式指定了处理文本之前需要执行的操作:END 模式指定了处理完所有行之后所需要执行的操作。

3.1 begin 简单语法

先创建空白文件:

touch  begin_test
awk 'BEGIN{ print "BEGIN" }' begin_test


上述例子,虽然指定了begin_test文件作为输入源,但是在开始处理test文本之前,需要先执行BEGIN模式指定的"打印"操作。

3.2 不添加输入文件

awk 'BEGIN { print "BEGIN"}'

而上面例子中,我们并没有给定任何输入来源,awk就直接输出信息了,因为,BEGIN模式表示,在处理指定的文本之前,需要先执行BEGIN模式中指定的动作,而上述示例没有给定任何输入源,但是awk还是会先执行BEGIN模式指定的"打印"动作,打印完成后,发现并没有文本可以处理,于是就只完成了"打印 BEGIN"的操作。

3.3 begin +pattern 演示

awk ‘BEGIN {print “BEGIN” ,“BEGIN” } { print $1,$2 }’ col_print.txt

3.4 END

可以看到,先处理完BEGIN 的内容,再打印文本里面的内容.
所以END模式也就一目了然了。

上述示例中返回的结果 就像一张"报表",有"表头" 、“表内容”、 “表尾”。我们通常将变量初始化语句(如 var=0 )以及打印文件头部的语句放入BEGIN 语句块中。在 END{} 语句块中,往往会放入打印结果等语句.

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章