

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 筛选
<a name="CWL_QuerySyntax-Filter"></a>

 使用 `filter` 获取与一个或多个条件匹配的日志事件。

 **示例：使用一个条件筛选日志事件** 

 该代码片段显示了一个查询示例，其将返回 `range` 的值大于 ***3000*** 的所有日志事件。该查询将结果限制为 20 个日志事件，并按 `@timestamp` 和降序对日志事件进行排序。

```
fields @timestamp, @message
| filter (range>3000)
| sort @timestamp desc
| limit 20
```

 **示例：使用多个条件筛选日志事件** 

 您可以使用关键字 `and` 和 `or` 组合多个条件。

 该代码片段显示了一个查询示例，其将返回 `range` 的值大于 ***3000*** 以及 `accountId` 的值等于 ***123456789012*** 的日志事件。该查询将结果限制为 20 个日志事件，并按 `@timestamp` 和降序对日志事件进行排序。

```
fields @timestamp, @message
| filter (range>3000 and accountId=123456789012)
| sort @timestamp desc
| limit 20
```

## 索引字段和 filter 命令
<a name="CWL_QuerySyntax-index"></a>

如果已为日志组创建字段索引，则可以利用这些字段索引来提高 `filter` 查询的效率并减少扫描量。例如，假设您为 `requestId` 创建了一个字段索引。然后，针对该日志组的任何 CloudWatch Logs Insights 查询，如果这些查询包含`filter requestId = value`或`filter requestId IN [value, value, ...]`将尝试跳过处理已知不包含索引字段的日志事件。通过尝试仅扫描已知包含该索引字段的日志事件，可以减少扫描量，查询速度更快。

有关字段索引和如何创建它们的更多信息，请参阅[创建字段索引以提高查询性能并减少扫描量](CloudWatchLogs-Field-Indexing.md)。

**重要**  
只有包含 `filter fieldName =...` 和 `filter fieldName IN...` 的查询将受益于字段索引改进。包含 `filter fieldName like` 的查询不使用索引，并且始终扫描所选日志组中的所有日志事件。

**示例：使用索引查找与特定请求 ID 相关的日志事件** 

 此示例假设您已在 `requestId` 上创建了字段索引。对于使用此字段索引的日志组，查询将利用字段索引来尝试扫描最少量的日志事件，以查找 `requestId` 值为 `123456` 的事件 

```
fields @timestamp, @message
| filter requestId = "1234656"
| limit 20
```

## 筛选命令中的匹配项和正则表达式
<a name="CWL_QuerySyntax-regex"></a>

筛选条件支持使用正则表达式。您可以使用以下比较运算符（`=`、`!=`、`<`、`<=`、`>`、`>=`）和布尔运算符（`and`、`or` 和 `not`）。

您可以使用关键字 `in` 来测试集合成员资格并检查数组中的元素。要检查数组中的元素，请将该数组放在 `in` 之后。您可以将布尔运算符 `not` 与 `in` 配合使用。您可以创建查询，它们使用 `in` 返回字段是字符串匹配项的录入事件。这些字段必须是完整字符串。例如，下面的代码片段显示了一个查询，它使用 `in` 返回字段 `logGroup` 是完整字符串 `example_group` 的录入事件。

```
fields @timestamp, @message
| filter logGroup in ["example_group"]
```

您可以使用关键字短语 `like` 和 `not like` 以匹配子字符串。您可以使用正则表达式运算符 `=~` 以匹配子字符串。要使用 `like` 和 `not like` 匹配子字符串，请将您要匹配的子字符串括在单引号或双引号中。您可以将正则表达式模式与 `like` 和 `not like` 配合使用。要使用正则表达式运算符匹配子字符串，请将您要匹配的子字符串括在正斜杠中。下面的示例包含多个代码片段，它们展示您如何能够使用 `filter` 命令匹配子字符串。

**示例：匹配子字符串**

 以下示例将返回 `f1` 包含单词 ***Exception*** 的录入事件。所有三个示例都区分大小写。

第一个示例使用 `like` 匹配子字符串。

```
fields f1, f2, f3 
| filter f1 like "Exception"
```

 第二个示例使用 `like` 和正则表达式模式匹配子字符串。

```
fields f1, f2, f3 
| filter f1 like /Exception/
```

 第三个示例使用正则表达式匹配子字符串。

```
fields f1, f2, f3 
| filter f1 =~ /Exception/
```

**示例：使用通配符匹配子字符串**

 您可以使用句点符号（`.`）作为正则表达式中的通配符来匹配子字符串。在以下示例中，查询返回 `f1` 的值以字符串 `ServiceLog` 开头的匹配项。

```
fields f1, f2, f3
| filter f1 like /ServiceLog./
```

 您可以在句点符号（`.*`）之后放置星号，以创建一个返回尽可能多的匹配项的贪婪量词。例如，以下查询将返回 `f1` 的值不仅以字符串 `ServiceLog` 开头并且还包括字符串 `ServiceLog` 的匹配项。

```
fields f1, f2, f3
| filter f1 like /ServiceLog.*/
```

 可能的匹配项可以采用以下格式：
+  `ServiceLogSampleApiLogGroup` 
+  `SampleApiLogGroupServiceLog` 

**示例：从匹配项中排除子字符串**

下面的示例将显示一个查询，它将返回 `f1` 不包含单词 ***Exception*** 的多个录入事件。此示例区分大小写。

```
fields f1, f2, f3 
| filter f1 not like "Exception"
```

**示例：使用不区分大小写的模式匹配子字符串**

您可以使用 `like` 和正则表达式匹配不区分大小写的子字符串。在您要匹配的子字符串前放置以下参数（**?i**）。下面的示例将显示一个查询，它将返回 `f1` 包含单词 ***Exception*** 或 ***exception*** 的多个录入事件。

```
fields f1, f2, f3 
| filter f1 like /(?i)Exception/
```