PUB:Part 1 - How to Use Awk and Regular Expressions to Filter Text or String in Files

@wwy-hust
This commit is contained in:
wxy 2016-07-17 23:18:23 +08:00
parent c4d4ce4e8b
commit 54a1329118

View File

@ -1,28 +1,28 @@
如何使用Awk和正则表达式过滤文本或文件中的字符串 awk 系列:如何使用 awk 和正则表达式过滤文本或文件中的字符串
============================================================================= =============================================================================
![](http://www.tecmint.com/wp-content/uploads/2016/04/Linux-Awk-Command-Examples.png) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Linux-Awk-Command-Examples.png)
当我们在 Unix/Linux 下使用特定的命令从字符串或文件中读取或编辑文本时,我们经常会尝试过滤输出以得到感兴趣的部分。这时正则表达式就派上用场了。 当我们在 Unix/Linux 下使用特定的命令从字符串或文件中读取或编辑文本时,我们经常需要过滤输出以得到感兴趣的部分。这时正则表达式就派上用场了。
### 什么是正则表达式? ### 什么是正则表达式?
正则表达式可以定义为代表若干个字符序列的字符串。它最重要的功能就是它允许你过滤一条命令或一个文件的输出,编辑文本或配置等文件的一部分 正则表达式可以定义为代表若干个字符序列的字符串。它最重要的功能之一就是它允许你过滤一条命令或一个文件的输出、编辑文本或配置文件的一部分等等
### 正则表达式的特点 ### 正则表达式的特点
正则表达式由以下内容组合而成: 正则表达式由以下内容组合而成:
- 普通字符例如空格、下划线、A-Z、a-z、0-9。 - **普通字符**例如空格、下划线、A-Z、a-z、0-9。
- 可以扩展为普通字符的元字符,它们包括: - 可以扩展为普通字符的**元字符**,它们包括:
- `(.)` 它匹配除了换行符外的任何单个字符。 - `(.)` 它匹配除了换行符外的任何单个字符。
- `(*)` 它匹配零个或多个在其之前的立即字符。 - `(*)` 它匹配零个或多个在其之前紧挨着的字符。
- `[ character(s) ]` 它匹配任何由 character(s) 指定的一个字符,你可以使用连字符(-)代表字符区间,例如 [a-f]、[1-5]等。 - `[ character(s) ]` 它匹配任何由其中的字符/字符集指定的字符,你可以使用连字符(-)代表字符区间,例如 [a-f]、[1-5]等。
- `^` 它匹配文件中一行的开头。 - `^` 它匹配文件中一行的开头。
- `$` 它匹配文件中一行的结尾。 - `$` 它匹配文件中一行的结尾。
- `\` 这是一个转义字符。 - `\` 这是一个转义字符。
你必须使用类似 awk 这样的文本过滤工具来过滤文本。你还可以把 awk 当作一个用于自身的编程语言。但由于这个指南的适用范围是关于使用 awk 的,我会按照一个简单的命令行过滤工具来介绍它。 你必须使用类似 awk 这样的文本过滤工具来过滤文本。你还可以把 awk 自身当作一个编程语言。但由于这个指南的适用范围是关于使用 awk 的,我会按照一个简单的命令行过滤工具来介绍它。
awk 的一般语法如下: awk 的一般语法如下:
@ -30,13 +30,13 @@ awk 的一般语法如下:
# awk 'script' filename # awk 'script' filename
``` ```
此处 `'script'` 是一个由 awk 使用并应用于 filename 的命令集合。 此处 `'script'` 是一个由 awk 可以理解并应用于 filename 的命令集合。
它通过读取文件中的给定的一行,复制该行的内容并在该行上执行脚本的方式工作。这个过程会在该文件中的所有行上重复。 它通过读取文件中的给定行,复制该行的内容并在该行上执行脚本的方式工作。这个过程会在该文件中的所有行上重复。
该脚本 `'script'` 中内容的格式是 `'/pattern/ action'`,其中 `pattern` 是一个正则表达式,而 `action` 是当 awk 在该行中找到此模式时应当执行的动作。 该脚本 `'script'` 中内容的格式是 `'/pattern/ action'`,其中 `pattern` 是一个正则表达式,而 `action` 是当 awk 在该行中找到此模式时应当执行的动作。
### 如何在 Linux 中使用 Awk 过滤工具 ### 如何在 Linux 中使用 awk 过滤工具
在下面的例子中,我们将聚焦于之前讨论过的元字符。 在下面的例子中,我们将聚焦于之前讨论过的元字符。
@ -45,13 +45,14 @@ awk 的一般语法如下:
下面的例子打印文件 /etc/hosts 中的所有行,因为没有指定任何的模式。 下面的例子打印文件 /etc/hosts 中的所有行,因为没有指定任何的模式。
``` ```
# awk '//{print}'/etc/hosts # awk '//{print}' /etc/hosts
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Awk-Command-Example.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Awk-Command-Example.gif)
>Awk 打印文件中的所有行
#### 结合模式使用 Awk *awk 打印文件中的所有行*
#### 结合模式使用 awk
在下面的示例中,指定了模式 `localhost`,因此 awk 将匹配文件 `/etc/hosts` 中有 `localhost` 的那些行。 在下面的示例中,指定了模式 `localhost`,因此 awk 将匹配文件 `/etc/hosts` 中有 `localhost` 的那些行。
@ -60,22 +61,24 @@ awk 的一般语法如下:
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-Command-with-Pattern.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-Command-with-Pattern.gif)
>Awk 打印文件中匹配模式的行
#### 在 Awk 模式中使用通配符 (.) *awk 打印文件中匹配模式的行*
#### 在 awk 模式中使用通配符 (.)
在下面的例子中,符号 `(.)` 将匹配包含 loc、localhost、localnet 的字符串。 在下面的例子中,符号 `(.)` 将匹配包含 loc、localhost、localnet 的字符串。
这里的意思是匹配 *** l 一些单个字符 c *** 这里的正则表达式的意思是匹配 **l一个字符c**
``` ```
# awk '/l.c/{print}' /etc/hosts # awk '/l.c/{print}' /etc/hosts
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-with-Wild-Cards.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-with-Wild-Cards.gif)
>使用 Awk 打印文件中匹配模式的字符串
#### 在 Awk 模式中使用字符 (*) *使用 awk 打印文件中匹配模式的字符串*
#### 在 awk 模式中使用字符 (*)
在下面的例子中,将匹配包含 localhost、localnet、lines, capable 的字符串。 在下面的例子中,将匹配包含 localhost、localnet、lines, capable 的字符串。
@ -84,7 +87,8 @@ awk 的一般语法如下:
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Match-Strings-in-File.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Match-Strings-in-File.gif)
>使用 Awk 匹配文件中的字符串
*使用 awk 匹配文件中的字符串*
你可能也意识到 `(*)` 将会尝试匹配它可能检测到的最长的匹配。 你可能也意识到 `(*)` 将会尝试匹配它可能检测到的最长的匹配。
@ -112,7 +116,7 @@ this is tecmint, where you get the best good tutorials, how tos, guides, tecmint
this is tecmint, where you get the best good tutorials, how to's, guides, tecmint this is tecmint, where you get the best good tutorials, how to's, guides, tecmint
``` ```
#### 结合集合 [ character(s) ] 使用 Awk #### 结合集合 [ character(s) ] 使用 awk
以集合 [al1] 为例awk 将匹配文件 /etc/hosts 中所有包含字符 a 或 l 或 1 的字符串。 以集合 [al1] 为例awk 将匹配文件 /etc/hosts 中所有包含字符 a 或 l 或 1 的字符串。
@ -121,7 +125,8 @@ this is tecmint, where you get the best good tutorials, how to's, guides, tecmin
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-Matching-Character.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-Matching-Character.gif)
>使用 Awk 打印文件中匹配的字符
*使用 awk 打印文件中匹配的字符*
下一个例子匹配以 `K``k` 开始头,后面跟着一个 `T` 的字符串: 下一个例子匹配以 `K``k` 开始头,后面跟着一个 `T` 的字符串:
@ -130,7 +135,8 @@ this is tecmint, where you get the best good tutorials, how to's, guides, tecmin
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-Matched-String-in-File.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-Matched-String-in-File.gif)
>使用 Awk 打印文件中匹配的字符
*使用 awk 打印文件中匹配的字符*
#### 以范围的方式指定字符 #### 以范围的方式指定字符
@ -149,11 +155,12 @@ awk 所能理解的字符:
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-To-Print-Matching-Numbers-in-File.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-To-Print-Matching-Numbers-in-File.gif)
>使用 Awk 打印文件中匹配的数字
*使用 awk 打印文件中匹配的数字*
在上面的例子中,文件 /etc/hosts 中的所有行都至少包含一个单独的数字 [0-9]。 在上面的例子中,文件 /etc/hosts 中的所有行都至少包含一个单独的数字 [0-9]。
#### 结合元字符 (\^) 使用 Awk #### 结合元字符 (\^) 使用 awk
在下面的例子中,它匹配所有以给定模式开头的行: 在下面的例子中,它匹配所有以给定模式开头的行:
@ -163,9 +170,10 @@ awk 所能理解的字符:
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-All-Matching-Lines-with-Pattern.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-All-Matching-Lines-with-Pattern.gif)
>使用 Awk 打印与模式匹配的行
#### 结合元字符 ($) 使用 Awk *使用 awk 打印与模式匹配的行*
#### 结合元字符 ($) 使用 awk
它将匹配所有以给定模式结尾的行: 它将匹配所有以给定模式结尾的行:
@ -176,9 +184,10 @@ awk 所能理解的字符:
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-Given-Pattern-String.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-to-Print-Given-Pattern-String.gif)
>使用 Awk 打印与模式匹配的字符串
#### 结合转义字符 (\\) 使用 Awk *使用 awk 打印与模式匹配的字符串*
#### 结合转义字符 (\\) 使用 awk
它允许你将该转义字符后面的字符作为文字,即理解为其字面的意思。 它允许你将该转义字符后面的字符作为文字,即理解为其字面的意思。
@ -193,11 +202,12 @@ awk 所能理解的字符:
``` ```
![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-with-Escape-Character.gif) ![](http://www.tecmint.com/wp-content/uploads/2016/04/Use-Awk-with-Escape-Character.gif)
>结合转义字符使用 Awk
*结合转义字符使用 awk*
### 总结 ### 总结
以上内容并不是 Awk 命令用做过滤工具的全部,上述的示例均是 awk 的基础操作。在下面的章节中,我将进一步介绍如何使用 awk 的高级功能。感谢您的阅读,请在评论区贴出您的评论。 以上内容并不是 awk 命令用做过滤工具的全部,上述的示例均是 awk 的基础操作。在下面的章节中,我将进一步介绍如何使用 awk 的高级功能。感谢您的阅读,请在评论区贴出您的评论。
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -205,7 +215,7 @@ via: http://www.tecmint.com/use-linux-awk-command-to-filter-text-string-in-files
作者:[Aaron Kili][a] 作者:[Aaron Kili][a]
译者:[wwy-hust](https://github.com/wwy-hust) 译者:[wwy-hust](https://github.com/wwy-hust)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出