天天看点

Linux-(awk)

它会依次读取文件的每一行内容, 然后对其进行处理,awk 命令默认从 stdio 标准输入获取文件内容, awk 使用一对单引号来表示 一些可执行的脚本代码,在可执行脚本代码里面,使用一对花括号来表示一段可执行代码块,可以同时存在多个代码块。 awk 的每个花括号内同时又可以有多个指令,每一个指令用分号分隔,awk 其实就是一个脚本编程语言。

<code>options</code> 这个表示一些可选的参数选项

<code>program</code> 这个表示 awk 的可执行脚本代码,这个是必须要有的。 

<code>file</code> 这个表示 awk 需要处理的文件,注意是纯文本文件。

先来一个 awk 的使用例子热热身 

awk 命令的可执行脚本代码使用单引号括起来,紧接着里面是一对花括号,然后花括号里面就是一些可执行的脚本代码段。

当 awk 每读取一行之后,它会依次执行双引号里面的每个脚本代码段。

在上面这个例子中, <code>$0</code> 表示当前行。当你执行了上面的命令之后,它会依次将 /etc/passwd 文件的每一行内容打印输出。

awk 默认的分割符为空格和制表符,我们可以使用 -F 参数来指定分隔符

上面的命令将 /etc/passwd 文件中的每一行用冒号 : 分割成多个字段,然后用 print 将第 1 列字段的内容打印输出

如何在 awk 中同时指定多个分隔符

比如现在有这样一个文件 some.log 文件内容如下:

现在我们想将上面的 some.log 文件中按照 "水果名称(重量)年份" 来进行分割:

在 <code>-F</code> 参数中使用一对方括号来指定多个分隔符,awk 处理 some.log 文件时就会使用 "(" 和 ")" 来对文件的每一行进行分割。

awk 内置变量的使用

比如我们有这么一个文本文件 fruit.txt 内容如下,我将用它来向你演示如何使用 awk 命令工具:

我们来瞧一瞧下面这些例子:

多一个新文件叫 company.txt 内容如下:

用 fruit.txt 和 company.txt 两个文件来向你演示 awk 同时处理多个文件的时候有什么效果

当你使用 awk 同时处理多个文件的时候,它会将多个文件合并处理,变量 <code>FILENAME</code> 就表示当前文本行所在的文件名称。

在脚本代码段前面使用 BEGIN 关键字时,它会在开始读取一个文件之前,运行一次 BEGIN 关键字后面的脚本代码段, BEGIN 后面的脚本代码段只会执行一次,执行完之后 awk 程序就会退出。

awk 脚本中可以用多个花括号来执行多个脚本代码,就像下面这样:

awk 的 END 指令和 BEGIN 恰好相反,在 awk 读取并且处理完文件的所有内容行之后,才会执行 END 后面的脚本代码段。

可以在 awk 脚本中声明和使用变量 

awk 声明的变量可以在任何多个花括号脚本中使用

上面这段脚本表示,先声明两个变量 a = 12 和 b = 24,然后用 print 打印出 a 加上 b 的结果。

看到上面的输出结果,为什么会重复输出 4 次同样的计算结果。请记住 awk 是针对文件的每一行来执行一次单引号 里面的脚本代码,每读取到一行就会执行一次,文件里面有多少行就会执行多少次,但 BEGIN 和 END 关键字后面的脚本代码除外,如果被处理的文件中什么都没有,那 awk 就一次都不会执行。。。

awk 还支持其他的数学运算符

<code>+</code> 加法运算符

<code>-</code> 减法运算符

<code>*</code> 乘法运算符

<code>/</code> 除法运算符

<code>%</code> 取余运算符

比如有一个文件 company.txt 内容如下

我们要判断文件的第 3 列数据,也就是平均工资小于 5500 的公司,然后将其打印输出

上面的命令结果就是平均工资小于 5500 的公司名单, <code>$3 &lt; 5500</code> 表示当第 3 列字段的内容小于 5500 的时候才会执行后面的 <code>{print $0}</code> 代码块

awk 还有一些其他的条件操作符如下

&lt; 小于

&lt;= 小于或等于

== 等于

!= 不等于

&gt; 大于

&gt;= 大于或等于

~ 匹配正则表达式

!~ 不匹配正则表达式

使用 if 指令判断来实现上面同样的效果 

上面表示如果第 3 列字段小于 5500 的时候就会执行后面的 <code>print $0</code>,很像 C 语言和 PHP 的语法对不对。 

比如现在我们有这么一个文件 poetry.txt ,内容如下:

使用正则表达式匹配字符串 "There" ,将包含这个字符串的行打印并输出

使用正则表达式配一个包含字母 t 和字母 e ,并且 t 和 e 中间只能有任意单个字符的行

如果只想匹配单纯的字符串 "t.e", 那正则表达式就是这样的 <code>/t\.e/</code> ,用反斜杠来转义 <code>.</code> 符号,因为 <code>.</code> 在正则表达式里面表示任意单个字符。

正则表达式中的圆括号表示将多个字符当成一个完整的对象来看待。比如 <code>/th(in){1}king/</code> 就表示其中字符串 "in" 必须出现 1 次。而如果不加圆括号就变成了 <code>/thin{1}king/</code> 这个就表示其中字符 "n" 必须出现 1 次。

继续阅读