

# AWS CLI에서 명령 출력 제어
<a name="cli-usage-output"></a>

이 섹션에서는 AWS Command Line Interface(AWS CLI)의 출력을 제어하는 다양한 방법에 대해 설명합니다. 터미널에서 AWS CLI 출력을 사용자 지정하면 가독성을 개선하고 스크립팅 자동화를 간소화하며 대규모 데이터세트를 더 쉽게 탐색할 수 있습니다.

AWS CLI는 [`json`](cli-usage-output-format.md#json-output), [`text`](cli-usage-output-format.md#text-output), [`yaml`](cli-usage-output-format.md#yaml-output), [`off`](cli-usage-output-format.md#off-output) 및 [`table`](cli-usage-output-format.md#table-output)을 비롯한 다양한 [출력 형식](cli-usage-output-format.md)을 지원합니다. 일부 서비스에는 데이터에 대한 서버 측 [페이지 매김](cli-usage-pagination.md)이 있으며, AWS CLI는 추가 페이지 매김 옵션을 위한 자체적인 클라이언트 측 기능을 제공합니다.

AWS CLI에는 개별적으로 또는 함께 사용하여 AWS CLI 출력을 필터링할 수 있는 [서버 측 필터링과 클라이언트 측 필터링](cli-usage-filter.md)이 둘 다 있습니다.

**Topics**
+ [민감한 출력](#cli-usage-output-sensitive)
+ [서버 측 출력 옵션과 클라이언트 측 출력 옵션 비교](#cli-usage-output-server-client)
+ [AWS CLI의 출력 형식 설정](cli-usage-output-format.md)
+ [AWS CLI의 구조화된 오류 출력](cli-usage-error-format.md)
+ [AWS CLI의 페이지 매김 옵션 사용](cli-usage-pagination.md)
+ [AWS CLI에서 출력 필터링](cli-usage-filter.md)

## 민감한 출력
<a name="cli-usage-output-sensitive"></a>

AWS CLI의 일부 작업은 환경 변수의 정보를 포함하여 민감한 것으로 간주될 수 있는 정보를 반환할 수 있습니다. 이러한 정보의 노출은 특정 시나리오에서 보안 위험을 나타낼 수 있습니다. 예를 들어, 이러한 정보는 지속적 통합 및 지속적 배포(CI/CD) 로그에 포함될 수 있습니다. 따라서 이러한 출력을 언제 로그의 일부로 포함할지 검토하고 필요하지 않은 경우 출력을 억제하는 것이 중요합니다.

민감한 데이터 보호에 대한 자세한 내용은 [AWS CLI에서 데이터 보호](data-protection.md)를 참조하세요.

다음 모범 사례를 고려하세요.
+ AWS Secrets Manager와 같은 암호 저장소에서 프로그래밍 방식으로 암호를 검색하는 것을 좋습니다.
+ 빌드 로그의 내용을 검토하여 민감한 정보가 포함되어 있지 않은지 확인합니다. `/dev/null`로 파이핑하거나 출력을 bash 또는 PowerShell 변수로 캡처하여 명령 출력을 억제하는 등의 접근 방식을 고려합니다.

  다음은 오류가 아닌 출력을 `/dev/null`로 리디렉션하는 bash 예제입니다.

  ```
  $ aws s3 ls > /dev/null
  ```

  터미널의 출력을 억제하는 방법에 대한 자세한 내용은 사용 중인 터미널의 사용 설명서를 참조하세요.
+ 로그의 액세스 권한을 고려하여 사용 사례에 맞게 액세스 범위를 적절히 설정하세요.

## 서버 측 출력 옵션과 클라이언트 측 출력 옵션 비교
<a name="cli-usage-output-server-client"></a>

AWS CLI에는 개별적으로 또는 함께 사용하여 AWS CLI 출력을 필터링할 수 있는 [서버 측 필터링과 클라이언트 측 필터링](cli-usage-filter.md)이 둘 다 있습니다. 서버 측 필터링이 먼저 처리되고 클라이언트 측 필터링에 대한 출력을 반환합니다. 서버 측 필터링은 서비스 API에서 지원됩니다. 클라이언트 측 필터링은 AWS CLI 매개 변수를 사용하여 `--query` 클라이언트에서 지원됩니다.

**서버 측** 출력 옵션은 AWS 서비스 API에서 직접 지원합니다. 필터링되거나 페이징된 데이터는 클라이언트로 전송되지 않으므로 HTTP 응답 시간이 빨라지고 대규모 데이터세트의 대역폭을 개선할 수 있습니다.

**클라이언트 측** 출력 옵션은 AWS CLI에서 만든 기능입니다. 모든 데이터가 클라이언트로 전송되면 AWS CLI가 표시되는 콘텐츠를 필터링하거나 페이지를 매깁니다. 클라이언트 측 작업으로는 대규모 데이터세트의 속도나 대역폭이 절약되지 않습니다.

서버 측 옵션과 클라이언트 측 옵션을 함께 사용하면 서버 측 작업이 먼저 완료된 후 클라이언트로 전송되어 클라이언트 측 작업이 진행됩니다. 이를 통해 서버 측 옵션의 잠재적인 속도 및 대역폭 절감 효과를 활용하는 동시에 추가 AWS CLI 기능을 사용하여 원하는 결과를 얻을 수 있습니다.

# AWS CLI의 출력 형식 설정
<a name="cli-usage-output-format"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI)의 다양한 출력 형식에 대해 설명합니다. AWS CLI은(는) 다음 출력 형식을 지원합니다.
+ **[`json`](#json-output)** - 출력은 [JSON](https://json.org/) 문자열로 형식이 지정됩니다.
+  **[`yaml`](#yaml-output)** - 출력은 [YAML](https://yaml.org/) 문자열로 형식이 지정됩니다.
+ **[`yaml-stream`](#yaml-stream-output)** - 출력은 스트리밍되고 [YAML](https://yaml.org/) 문자열로 형식이 지정됩니다. 스트리밍을 통해 대용량 데이터 유형을 빠르게 처리할 수 있습니다.
+ **[`text`](#text-output)** - 출력은 여러 줄의 탭으로 구분된 문자열 값으로 형식이 지정됩니다. 출력을 `grep`, `sed` 또는 `awk`와 같은 텍스트 프로세서로 전달하는 데 사용할 수 있습니다.
+ **[`table`](#table-output)** - 출력은 셀 테두리를 형성하기 위해 \$1\$1- 문자를 사용하여 표로 형식이 지정됩니다. 일반적으로 읽기는 쉽지만 프로그래밍 방식으로는 유용하지 않은 ‘인간 친화적’ 형식으로 정보를 표시합니다.
+ **[`off`](#off-output)** - 명령의 모든 표준 출력(stdout)을 숨깁니다. 이는 출력을 처리하지 않고 명령의 종료 코드만 확인하면 되는 자동화 스크립트 및 CI/CD 파이프라인에서 유용합니다.

## 출력 형식을 선택하는 방법
<a name="cli-usage-output-format-how"></a>

[구성](cli-chap-configure.md) 주제의 설명과 같이, 다음 세 가지 방법으로 출력 형식을 지정할 수 있습니다.
+ **`output` 파일의 명명된 프로파일에서 `config` 옵션 사용** - 다음 예제에서는 기본 출력 형식을 `text`로 설정합니다.

  ```
  [default]
  output=text
  ```
+ **`AWS_DEFAULT_OUTPUT` 환경 변수 사용** - 다음 출력은 변수가 변경되거나 세션이 끝날 때까지 이 명령줄 세션의 명령 형식을 `table`로 지정합니다. 이 환경 변수를 사용하면 `config` 파일에 설정된 값을 재정의합니다.

  ```
  $ export AWS_DEFAULT_OUTPUT="table"
  ```
+ **명령줄에서 `--output` 옵션 사용** - 다음 예제에서는 이 명령의 출력만 `json`으로 설정합니다. 명령에 이 옵션을 사용하면 현재 설정된 환경 변수 또는 `config` 파일의 값을 재정의합니다.

  ```
  $ aws swf list-domains --registration-status REGISTERED --output json
  ```

**중요**  
지정한 출력 유형에 따라 `--query` 옵션 작동 방식이 변경됩니다.  
`--output text`를 지정하면 `--query` 필터를 적용하기 *전에* 해당 출력이 페이지 매김되며, AWS CLI는 해당 출력의 *각 페이지*에서 해당 쿼리를 한 번 실행합니다. 이로 인해, 쿼리에는 예상치 못한 추가 출력이 발생할 수 있는 각 페이지의 첫 번째 일치하는 요소가 포함됩니다. 출력을 추가로 필터링하려면 `head` 또는 `tail` 등 다른 명령줄 도구를 사용할 수 있습니다.
`--output json`, `--output yaml` 또는 `--output yaml-stream`을 지정하면 해당 출력을 하나의 네이티브 구조로 완전히 처리한 뒤에 `--query` 필터를 적용합니다. AWS CLI은(는) 전체 구조에 대해 한 번만 쿼리를 실행하여 필터링된 결과를 생성한 다음 출력합니다.

## JSON 출력 형식
<a name="json-output"></a>

[JSON](https://json.org)은 AWS CLI의 기본 출력 형식입니다. 대부분의 프로그래밍 언어는 기본 제공된 기능 또는 공개적으로 사용 가능한 라이브러리를 사용하여 JSON 문자열을 쉽게 디코딩할 수 있습니다. JSON 출력을 강력한 방법으로 [--query 옵션](cli-usage-filter.md)과 결합하여 AWS CLI JSON 형식의 출력을 필터링하고 서식을 지정할 수 있습니다.

`--query`로 수행할 수 없는 고급 필터링의 경우 명령줄 JSON 프로세서인 `jq`를 고려할 수 있습니다. [http://stedolan.github.io/jq/](http://stedolan.github.io/jq/)에서 이 처리기를 다운로드하고 공식 자습서를 찾아볼 수 있습니다.

다음은 JSON 출력의 예제입니다.

```
$ aws iam list-users --output json
```

```
{
    "Users": [
        {
            "Path": "/",
            "UserName": "Admin",
            "UserId": "AIDA1111111111EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:user/Admin",
            "CreateDate": "2014-10-16T16:03:09+00:00",
            "PasswordLastUsed": "2016-06-03T18:37:29+00:00"
        },
        {
            "Path": "/backup/",
            "UserName": "backup-user",
            "UserId": "AIDA2222222222EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:user/backup/backup-user",
            "CreateDate": "2019-09-17T19:30:40+00:00"
        },
        {
            "Path": "/",
            "UserName": "cli-user",
            "UserId": "AIDA3333333333EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:user/cli-user",
            "CreateDate": "2019-09-17T19:11:39+00:00"
        }
    ]
}
```

## YAML 출력 형식
<a name="yaml-output"></a>

[YAML](https://yaml.org)은 [YAML](https://yaml.org) 형식의 문자열을 출력하거나 소비하는 CloudFormation 같은 서비스 및 도구와 [YAML 형식의 템플릿](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html) 지원을 이용하여 프로그래밍 방식으로 출력을 처리하는 데 적합합니다.

`--query`로 수행할 수 없는 고급 필터링의 경우 명령줄 YAML 프로세서인 `yq`를 고려할 수 있습니다. *GitHub*의 [yq 리포지토리](https://github.com/mikefarah/yq)에서 `yq`를 다운로드할 수 있습니다.

다음은 YAML 출력의 예제입니다.

```
$ aws iam list-users --output yaml
```

```
Users:
- Arn: arn:aws:iam::123456789012:user/Admin
  CreateDate: '2014-10-16T16:03:09+00:00'
  PasswordLastUsed: '2016-06-03T18:37:29+00:00'
  Path: /
  UserId: AIDA1111111111EXAMPLE
  UserName: Admin
- Arn: arn:aws:iam::123456789012:user/backup/backup-user
  CreateDate: '2019-09-17T19:30:40+00:00'
  Path: /backup/
  UserId: AIDA2222222222EXAMPLE
  UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19
- Arn: arn:aws:iam::123456789012:user/cli-user
  CreateDate: '2019-09-17T19:30:40+00:00'
  Path: /
  UserId: AIDA3333333333EXAMPLE
  UserName: cli-user
```

## YAML 스트림 출력 형식
<a name="yaml-stream-output"></a>

`yaml-stream` 형식을 사용하면 [YAML](https://yaml.org) 형식을 활용하는 동시에 데이터를 스트리밍하여 대용량 데이터세트를 더 응답성이 우수하고 빠르게 볼 수 있습니다. 전체 쿼리가 다운로드되기 전에 YAML 데이터를 보고 사용할 수 있습니다.

`--query`로 수행할 수 없는 고급 필터링의 경우 명령줄 YAML 프로세서인 `yq`를 고려할 수 있습니다. *GitHub*의 [yq 리포지토리](https://github.com/mikefarah/yq)에서 `yq`를 다운로드할 수 있습니다.

다음은 `yaml-stream` 출력의 예제입니다.

```
$ aws iam list-users --output yaml-stream
```

```
- IsTruncated: false
  Users:
  - Arn: arn:aws:iam::123456789012:user/Admin
    CreateDate: '2014-10-16T16:03:09+00:00'
    PasswordLastUsed: '2016-06-03T18:37:29+00:00'
    Path: /
    UserId: AIDA1111111111EXAMPLE
    UserName: Admin
  - Arn: arn:aws:iam::123456789012:user/backup/backup-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /backup/
    UserId: AIDA2222222222EXAMPLE
    UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19
  - Arn: arn:aws:iam::123456789012:user/cli-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /
    UserId: AIDA3333333333EXAMPLE
    UserName: cli-user
```

다음은 `yaml-stream` 파라미터를 사용하여 스트리밍된 YAML 콘텐츠의 페이지 매김과 함께 `--page-size` 출력의 예입니다.

```
$ aws iam list-users --output yaml-stream --page-size 2
```

```
- IsTruncated: true
  Marker: ab1234cdef5ghi67jk8lmo9p/q012rs3t445uv6789w0x1y2z/345a6b78c9d00/1efgh234ij56klmno78pqrstu90vwxyx  
  Users:
  - Arn: arn:aws:iam::123456789012:user/Admin
    CreateDate: '2014-10-16T16:03:09+00:00'
    PasswordLastUsed: '2016-06-03T18:37:29+00:00'
    Path: /
    UserId: AIDA1111111111EXAMPLE
    UserName: Admin
  - Arn: arn:aws:iam::123456789012:user/backup/backup-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /backup/
    UserId: AIDA2222222222EXAMPLE
    UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19
- IsTruncated: false
  Users:
  - Arn: arn:aws:iam::123456789012:user/cli-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /
    UserId: AIDA3333333333EXAMPLE
    UserName: cli-user
```

## 텍스트 출력 형식
<a name="text-output"></a>

`text` 형식은 AWS CLI 출력을 탭으로 구분된 줄로 구성합니다. `grep`, `sed` 및 `awk`와 같은 기존 Unix 텍스트 도구 및 PowerShell에서 수행하는 텍스트 처리에 효과적입니다.

`text` 출력 형식은 아래와 같은 기본 구조를 따릅니다. 열은 기본 JSON 객체의 해당 키 이름을 기준으로 알파벳 순서로 정렬됩니다.

```
IDENTIFIER  sorted-column1 sorted-column2
IDENTIFIER2 sorted-column1 sorted-column2
```

다음은 `text` 출력의 예제입니다. 각 필드는 다른 항목과 구분된 탭이며 빈 필드가 있는 추가 탭이 있습니다.

```
$ aws iam list-users --output text
```

```
USERS   arn:aws:iam::123456789012:user/Admin                2014-10-16T16:03:09+00:00   2016-06-03T18:37:29+00:00   /          AIDA1111111111EXAMPLE   Admin
USERS   arn:aws:iam::123456789012:user/backup/backup-user   2019-09-17T19:30:40+00:00                               /backup/   AIDA2222222222EXAMPLE   backup-user
USERS   arn:aws:iam::123456789012:user/cli-user             2019-09-17T19:11:39+00:00                               /          AIDA3333333333EXAMPLE   cli-user
```

네 번째 열은 `PasswordLastUsed` 필드이며, 해당 사용자가 AWS Management Console 콘솔에 로그인하지 않기 때문에 마지막 두 항목은 비어 있습니다.

**중요**  
*`text` 출력을 지정하는 경우 일관된 동작을 보장하기 위해 항상 [`--query`](cli-usage-filter.md) 옵션도 사용하는 것이 좋습니다.*  
텍스트 형식이 출력 열을 AWS 서비스에서 반환하는 기본 JSON 객체의 키 이름에 따라 알파벳 순서로 정렬하고, 유사한 리소스에 항상 동일한 키 이름이 있는 것은 아니기 때문입니다. 예를 들어 Linux 기반 Amazon EC2 인스턴스의 JSON 표시에는 Windows 기반 인스턴스의 JSON 표시에 없는 요소가 있을 수 있으며 반대의 경우도 마찬가지입니다. 또한 리소스에는 향후 업데이트에서 추가되거나 제거되어 열 순서를 변경하는 키-값 요소가 있을 수 있습니다. 이러한 경우 `--query`를 사용하면 출력 형식을 완전히 제어할 수 있도록 `text` 출력의 기능이 향상됩니다.  
다음 예제에서 명령은 표시할 요소를 지정하고 목록 표기법 `[key1, key2, ...]`를 사용하여 열의 *순서를 정의*합니다. 이렇게 하면 예상 열에 올바른 키 값이 항상 표시된다는 완전한 확신을 사용자에게 제공할 수 있습니다. 마지막으로 AWS CLI에서 존재하지 않는 키 값으로 `None`을 출력하는 방식을 살펴보세요.  

```
$ aws iam list-users --output text --query 'Users[*].[UserName,Arn,CreateDate,PasswordLastUsed,UserId]'
```

```
Admin         arn:aws:iam::123456789012:user/Admin         2014-10-16T16:03:09+00:00   2016-06-03T18:37:29+00:00   AIDA1111111111EXAMPLE
backup-user   arn:aws:iam::123456789012:user/backup-user   2019-09-17T19:30:40+00:00   None                        AIDA2222222222EXAMPLE
cli-user      arn:aws:iam::123456789012:user/cli-backup    2019-09-17T19:11:39+00:00   None                        AIDA3333333333EXAMPLE
```

다음 예제는 `grep` 명령의 `awk` 출력에 `text` 및 `aws ec2 describe-instances`를 사용하는 방법을 보여줍니다. 첫 번째 명령은 `text` 출력에 각 인스턴스의 가용 영역, 현재 상태 및 인스턴스 ID를 표시합니다. 두 번째 명령은 `us-west-2a` 가용 영역에서 실행 중인 모든 인스턴스의 인스턴스 ID만 표시하는 출력을 처리합니다.

```
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text
```

```
us-west-2a      running i-4b41a37c
us-west-2a      stopped i-a071c394
us-west-2b      stopped i-97a217a0
us-west-2a      running i-3045b007
us-west-2a      running i-6fc67758
```

```
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text | grep us-west-2a | grep running | awk '{print $3}'
```

```
i-4b41a37c
i-3045b007
i-6fc67758
```

다음 예제는 한 단계 더 나아가 출력을 필터링하는 방법뿐만 아니라 출력을 사용하여 중지된 각 인스턴스의 인스턴스 유형 변경을 자동화하는 방법을 보여줍니다.

```
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[State.Name, InstanceId]' --output text |
> grep stopped |
> awk '{print $2}' |
> while read line;
> do aws ec2 modify-instance-attribute --instance-id $line --instance-type '{"Value": "m1.medium"}';
> done
```

`text` 출력은 PowerShell에서도 유용할 수 있습니다. `text` 출력의 열은 탭으로 구분되어 있으므로 PowerShell의 ``t` 구분 기호를 사용하여 출력을 배열로 쉽게 분할할 수 있습니다. 다음 명령은 첫 번째 열(`InstanceId`)이 `AvailabilityZone` 문자열과 일치할 경우 세 번째 열(`us-west-2a`)의 값을 표시합니다.

```
PS C:\>aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text |
%{if ($_.split("`t")[0] -match "us-west-2a") { $_.split("`t")[2]; } }
```

```
-4b41a37c
i-a071c394
i-3045b007
i-6fc67758
```

이전 예제에서 `--query` 파라미터를 사용하여 기본 JSON 객체를 구문 분석하고 원하는 열을 추출하는 방법을 알아보았지만, 교차 플랫폼 호환성이 문제가 되지 않을 경우 PowerShell 자체 기능으로 JSON을 처리할 수 있습니다. 대부분의 명령 셸에서 요구하듯이 출력을 텍스트로 처리하는 대신, PowerShell에서는 `ConvertFrom-JSON` cmdlet을 사용하여 계층적으로 구조화된 객체를 생성할 수 있습니다. 그런 다음 해당 객체에서 직접 원하는 멤버에 액세스할 수 있습니다.

```
(aws ec2 describe-instances --output json | ConvertFrom-Json).Reservations.Instances.InstanceId
```

**작은 정보**  
텍스트를 출력하고 `--query` 파라미터를 사용하여 단일 필드로 필터링하는 경우, 탭으로 구분된 값이 한 줄로 출력됩니다. 각 값을 별개의 줄로 가져오려면 다음 예제에 표시된 대로 출력 필드를 괄호 안에 넣으면 됩니다.  
탭으로 구분되어 한 줄로 출력:  

```
$ aws iam list-groups-for-user --user-name susan  --output text --query "Groups[].GroupName"
```

```
HRDepartment    Developers      SpreadsheetUsers  LocalAdmins
```
`[GroupName]`을 괄호 안에 넣어서 각 값을 자체의 줄에 출력:  

```
$ aws iam list-groups-for-user --user-name susan  --output text --query "Groups[].[GroupName]"
```

```
HRDepartment
Developers
SpreadsheetUsers
LocalAdmins
```

## 테이블 출력 형식
<a name="table-output"></a>

`table` 형식은 사람이 읽을 수 있는 복잡한 AWS CLI 출력 표시를 표 형식으로 생성합니다.

```
$ aws iam list-users --output table
```

```
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                 ListUsers                                                                     |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
||                                                                                  Users                                                                      ||
|+----------------------------------------------------+---------------------------+---------------------------+----------+-----------------------+-------------+|
||                         Arn                        |       CreateDate          |    PasswordLastUsed       |   Path   |        UserId         |   UserName  ||
|+----------------------------------------------------+---------------------------+---------------------------+----------+-----------------------+-------------+|
||  arn:aws:iam::123456789012:user/Admin              | 2014-10-16T16:03:09+00:00 | 2016-06-03T18:37:29+00:00 | /        | AIDA1111111111EXAMPLE | Admin       ||
||  arn:aws:iam::123456789012:user/backup/backup-user | 2019-09-17T19:30:40+00:00 |                           | /backup/ | AIDA2222222222EXAMPLE | backup-user ||
||  arn:aws:iam::123456789012:user/cli-user           | 2019-09-17T19:11:39+00:00 |                           | /        | AIDA3333333333EXAMPLE | cli-user    ||
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

`--query` 옵션을 `table` 형식과 결합하여 원시 출력에서 미리 선택한 요소 집합을 표시할 수 있습니다. 사전 표기법과 목록 표기법의 출력 차이에 주의하세요. 첫 번째 예제에서는 열 이름이 알파벳 순서로 정렬되고 두 번째 예제에서는 이름 없는 열이 사용자가 정의한 방식으로 정렬됩니다. `--query` 옵션에 대한 자세한 내용은 [AWS CLI에서 출력 필터링](cli-usage-filter.md) 섹션을 참조하세요.

```
$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output table
```

```
------------------------------------------------------
|                   DescribeVolumes                  | 
+------------+----------------+--------------+-------+
|     AZ     |      ID        | InstanceId   | Size  |
+------------+----------------+--------------+-------+
|  us-west-2a|  vol-e11a5288  |  i-a071c394  |  30   |
|  us-west-2a|  vol-2e410a47  |  i-4b41a37c  |  8    |
+------------+----------------+--------------+-------+
```

```
$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId,Attachments[0].InstanceId,AvailabilityZone,Size]' --output table
```

```
----------------------------------------------------
|                  DescribeVolumes                 |
+--------------+--------------+--------------+-----+
|  vol-e11a5288|  i-a071c394  |  us-west-2a  |  30 |
|  vol-2e410a47|  i-4b41a37c  |  us-west-2a  |  8  |
+--------------+--------------+--------------+-----+
```

## Off 출력 형식
<a name="off-output"></a>

`off` 형식은 명령의 모든 표준 출력(stdout)을 숨깁니다. 이는 출력을 처리하지 않고 명령의 종료 코드만 확인하면 되는 자동화 스크립트 및 CI/CD 파이프라인에서 유용합니다. 오류 메시지는 여전히 stderr에 표시됩니다.

다음 예제에서는 `off` 형식이 어떻게 성공적인 출력을 숨기는지 보여줍니다. 종료 코드를 확인하여 성공 여부를 파악할 수 있습니다.

```
$ aws s3api list-buckets --output off
$ echo $?
0
```

이는 출력을 캡처하지 않고 리소스가 존재하는지 확인하려는 쉘 스크립트에서 특히 유용합니다.

```
#!/bin/bash
if aws s3api head-bucket --bucket my-bucket --output off 2>/dev/null; then
    echo "Bucket exists"
else
    echo "Bucket does not exist"
fi
```

**참고**  
`off` 형식은 stdout만 숨깁니다. 오류는 여전히 stderr에 기록됩니다.

# AWS CLI의 구조화된 오류 출력
<a name="cli-usage-error-format"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI)의 구조화된 오류 출력 형식에 대해 설명합니다. CLI는 stderr에 오류를 기록하며 다음 형식을 지원합니다.
+ **[`enhanced`](#cli-error-format-enhanced)**(기본값) - 추가 세부 정보가 인라인으로 표시된 오류 메시지입니다. 사람이 읽을 수 있는 디버깅을 위해 사용합니다.
+ **[`json`](#cli-error-format-json)** - 출력은 모든 오류 필드를 포함하며 [JSON](https://json.org/) 문자열 형식입니다. 자동화 및 스크립팅을 위해 사용합니다.
+ **[`yaml`](#cli-error-format-yaml)** - 출력은 모든 오류 필드를 포함하며 [JSON](https://yaml.org/) 문자열입니다. 자동화 및 스크립팅을 위해 사용합니다.
+ **[`text`](#cli-error-format-text)** - 텍스트 포맷터를 사용하여 오류를 표시합니다. 빠른 시각적 검토를 위해 사용합니다.
+ **[`table`](#cli-error-format-table)** - 테이블 포맷터를 사용하여 오류를 표시합니다. 빠른 시각적 검토를 위해 사용합니다.
+ **[`legacy`](#cli-error-format-legacy)** - 구조화된 세부 정보가 없는 원래 오류 형식입니다. 이전 버전과의 호환성을 위해 사용합니다.

## 오류 형식 구성
<a name="cli-error-format-configuring"></a>

다음 방법 중 하나를 사용하여 오류 형식을 구성할 수 있습니다.

명령줄 플래그  

```
$ aws <command> --cli-error-format json
```

구성 파일(`~/.aws/config`)  

```
[default]
cli_error_format = json
```

환경 변수  

```
$ export AWS_CLI_ERROR_FORMAT=yaml
```

## 오류 출력 형식
<a name="cli-error-output-formats"></a>

다음 섹션에서 각 형식에 대해 설명합니다.

### 향상된 형식(기본값)
<a name="cli-error-format-enhanced"></a>

향상된 형식은 단순한 값에 대한 추가 세부 정보를 인라인으로 포함하여 오류 메시지를 표시합니다. 복잡한 구조의 경우 이 형식은 JSON 또는 YAML을 사용하라는 힌트를 제공합니다.

**예: 리전 구성 누락**

```
aws: [ERROR]: An error occurred (NoRegion): You must specify a region. You can also configure your region by running "aws configure".
```

**예: 존재하지 않는 S3 버킷에 추가 필드가 포함되어 있음**

```
aws: [ERROR]: An error occurred (NoSuchBucket) when calling the GetObject operation: The specified bucket does not exist

Additional error details:
BucketName: amzn-s3-demo-bucket
```

**예: 복잡한 오류 필드**

```
An error occurred (TransactionCanceledException) when calling the TransactWriteItems operation: Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None]

Additional error details:
CancellationReasons: <complex value>
Use "--cli-error-format json" or another error format to see the full details.
```

### JSON 형식
<a name="cli-error-format-json"></a>

JSON 형식은 모든 오류 필드가 포함된 구조화된 표현을 제공합니다.

**예: 리전 구성 누락**

```
{
    "Code": "NoRegion",
    "Message": "You must specify a region. You can also configure your region by running \"aws configure\"."
}
```

**예: 존재하지 않는 S3 버킷**

```
{
    "Code": "NoSuchBucket",
    "Message": "The specified bucket does not exist",
    "BucketName": "amzn-s3-demo-bucket"
}
```

### YAML 형식
<a name="cli-error-format-yaml"></a>

YAML 형식은 모든 오류 필드가 포함된 구조화된 표현을 제공합니다.

**예: 리전 구성 누락**

```
Code: NoRegion
Message: You must specify a region. You can also configure your region by running "aws configure".
```

**예: 존재하지 않는 S3 버킷**

```
Code: NoSuchBucket
Message: The specified bucket does not exist
BucketName: amzn-s3-demo-bucket
```

### 날짜 형식
<a name="cli-error-format-text"></a>

텍스트 형식은 성공적인 명령 출력과 동일한 포맷터를 사용합니다.

**예: 존재하지 않는 S3 버킷**

```
amzn-s3-demo-bucket  NoSuchBucket    The specified bucket does not exist
```

### 테이블 형식
<a name="cli-error-format-table"></a>

테이블 형식은 성공적인 명령 출력과 동일한 포맷터를 사용합니다.

**예: 존재하지 않는 S3 버킷**

```
-------------------------------------------------------------------------------------|
|                                       error                                        |
+---------------------------+---------------+----------------------------------------+
|        BucketName         |     Code      |                Message                 |
+---------------------------+---------------+----------------------------------------+
|  amzn-s3-demo-bucket      |  NoSuchBucket |  The specified bucket does not exist   |
+---------------------------+---------------+----------------------------------------+
```

### 레거시 형식
<a name="cli-error-format-legacy"></a>

레거시 형식은 구조화된 세부 정보 없이 원래 오류 형식을 제공합니다. 이 형식에는 CLI 예외에 대한 "오류 발생(ErrorCode):" 접두사가 포함되지 않습니다.

**예: 리전 구성 누락**

```
aws: [ERROR]: You must specify a region. You can also configure your region by running "aws configure".
```

**예: 존재하지 않는 S3 버킷**

```
An error occurred (NoSuchBucket) when calling the GetObject operation: The specified bucket does not exist
```

**참고**  
이제 오류에 CLI 예외의 `aws: [ERROR]:` 접두사가 일관되게 포함됩니다. 이전 버전에서는 경우에 따라 이 접두사가 포함되지 않았습니다.  
다음 예외는 구성된 오류 형식에 관계없이 항상 레거시 형식을 사용합니다.  
`UnknownArgumentError` - 사용 정보를 표시합니다.
키보드 인터럽트(`KeyboardInterrupt`)

## 전체 예제
<a name="cli-error-format-example"></a>

다음 예제에서는 JSON 오류 형식을 사용한 명령을 보여줍니다.

```
$ aws s3api get-object \
    --bucket amzn-s3-demo-bucket \
    --key file.txt out.txt \
    --cli-error-format json
```

출력(stderr):

```
{
    "Code": "NoSuchBucket",
    "Message": "The specified bucket does not exist",
    "BucketName": "amzn-s3-demo-bucket"
}
```

`BucketName` 필드는 Amazon S3 서비스에서 반환하는 모델링된 오류 멤버입니다.

# AWS CLI의 페이지 매김 옵션 사용
<a name="cli-usage-pagination"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI)의 출력에 페이지 번호를 매기는 다양한 방법에 대해 설명합니다.

에서 페이지 매김을 제어하는 방법이 크게 2가지 있습니다AWS CLI
+ [서버 측 페이지 매김 파라미터 사용.](#cli-usage-pagination-serverside)
+ [기본 출력 클라이언트 측 페이징 프로그램 사용](#cli-usage-pagination-clientside).

서버 측 페이지 매김 파라미터가 먼저 처리되고 모든 출력은 클라이언트 측 페이지 매김으로 전송됩니다.

## 서버 측 페이지 매김
<a name="cli-usage-pagination-serverside"></a>

많은 항목 목록을 반환하는 대부분의 명령의 경우, AWS CLI에는 AWS CLI에서 서비스의 API를 호출하여 목록을 채울 때 출력에 포함되는 항목의 수를 제어할 수 있는 여러 옵션이 있습니다. AWS CLI의 서버 측 페이지 매김은 AWS 서비스 API에서 활성화되므로 이러한 옵션은 서비스 API에서 활성화한 경우에만 작동합니다.

**Topics**
+ [--no-paginate](#cli-usage-pagination-nopaginate)
+ [--page-size](#cli-usage-pagination-pagesize)
+ [--max-items](#cli-usage-pagination-maxitems)
+ [--starting-token](#cli-usage-pagination-startingtoken)

기본적으로 AWS CLI는 개별 서비스에 의해 결정된 페이지 크기를 사용하고 사용 가능한 모든 항목을 검색합니다. 예를 들어 Amazon S3의 기본 페이지 크기는 1,000입니다. 3,500개 객체를 포함하는 Amazon S3 버킷에서 `aws s3api list-objects`를 실행할 경우 AWS CLI는 백그라운드에서 서비스별 페이지 매김 로직을 처리하고 최종 출력에 3,500개 객체를 모두 반환하면서 Amazon S3에 대한 4개 호출을 자동으로 작성합니다.

특정 명령에 서버 측 페이지 매김이 있는지에 대한 자세한 내용은 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

### --no-paginate 파라미터를 사용하는 방법
<a name="cli-usage-pagination-nopaginate"></a>

`--no-paginate` 옵션은 클라이언트 측에서 다음 페이지 매김 토큰을 사용 중지합니다. 명령을 사용할 때 기본적으로 AWS CLI는 자동으로 여러 번 호출하여 가능한 모든 결과를 반환해서 페이지 매김을 생성합니다. 각 페이지에 대해 한 번 호출합니다. 페이지 매김을 비활성화하면 AWS CLI가 명령 결과의 첫 페이지에 대해 한 번만 호출합니다.

예를 들어 3,500개의 객체가 포함된 Amazon S3 버킷에서 `aws s3api list-objects`를 실행하는 경우 AWS CLI는 Amazon S3에 대한 첫 번째 호출만 실행하여 최종 출력에서 처음 1,000개의 객체만 반환합니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --no-paginate
{
    "Contents": [
...
```

### --page-size 파라미터를 사용하는 방법
<a name="cli-usage-pagination-pagesize"></a>

많은 리소스에서 list 명령을 실행할 때 문제가 발생할 경우, 기본값 페이지 크기가 너무 크기 때문일 수 있습니다. 이 경우 AWS 서비스에 최대 허용 시간을 초과하는 호출이 이루어지고 "시간 초과" 오류가 발생할 수 있습니다. `--page-size` 옵션을 사용하면 AWS CLI가 각 AWS 서비스 호출로부터 더 적은 수의 항목을 요청하도록 지정할 수 있습니다. AWS CLI는 계속 전체 목록을 검색하지만, 백그라운드에서 더 많은 수의 서비스 API 호출을 수행하고 각 호출마다 더 적은 수의 항목을 검색합니다. 그러면 각각의 호출이 시간 초과 없이 성공할 확률이 높아집니다. 페이지 크기를 변경해도 출력에 영향을 주지 않습니다. 출력을 생성하는 데 필요한 API 호출 수에만 영향을 미칩니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --page-size 100
{
    "Contents": [
...
```

### --max-items 파라미터를 사용하는 방법
<a name="cli-usage-pagination-maxitems"></a>

AWS CLI 출력에 한 번에 더 적은 항목을 포함시키려면 `--max-items` 옵션을 사용합니다. AWS CLI는 이전에 설명한 대로 계속 서비스와 함께 페이지 매김을 처리하지만, 사용자가 지정한 항목 수만 한 번에 출력합니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --max-items 100
{
    "NextToken": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxfQ==",
    "Contents": [
...
```

### --starting-token 파라미터를 사용하는 방법
<a name="cli-usage-pagination-startingtoken"></a>

출력 항목 수(`--max-items`)가 기본 API 호출에서 반환하는 전체 항목 수보다 적을 경우 사용자가 다음 항목 세트를 검색하기 위해 후속 명령에 전달할 수 있도록 출력에 `NextToken`이 포함됩니다. 다음 예제를 통해 앞의 예제에서 반환된 `NextToken` 값을 사용하는 방법을 배우고, 두 번째 백 개 항목을 검색할 수 있습니다.

**참고**  
`--starting-token` 파라미터는 null이거나 비어있을 수 없습니다. 이전 명령이 `NextToken` 값을 반환하지 않으면 반환할 더 이상의 항목이 없는 것이기 때문에 명령을 다시 호출할 필요가 없습니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --max-items 100 \
    --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxfQ==
{
    "Contents": [
...
```

지정된 AWS 서비스는 호출할 때마다 같은 순서로 항목이 반환되지는 않습니다. `--page-size` 및 `--max-items`에 서로 다른 값을 지정하면 누락되거나 중복된 항목을 포함해 예상치 못한 결과가 발생할 수 있습니다. 이를 방지하려면 `--page-size` 및 `--max-items`에 동일한 번호를 사용하여 AWS CLI의 페이지 매김을 기본 서비스의 페이지 매김과 동기화하세요. 또한 전체 목록을 검색하고 필요한 구문 분석 작업을 로컬에서 수행할 수 있습니다.

## 클라이언트 측 페이저
<a name="cli-usage-pagination-clientside"></a>

AWS CLI 버전 2에서는 출력에 클라이언트 측 페이저 프로그램을 사용할 수 있습니다. 기본적으로 이 기능은 운영 체제의 기본 페이저 프로그램을 통해 모든 출력을 반환합니다.

우선 순위에 따라 다음과 같은 방법으로 출력 페이저를 지정할 수 있습니다.
+ `default` 또는 명명된 프로파일에서 `config` 파일의 `cli_pager` 설정 사용.
+ `AWS_PAGER` 환경 변수 사용.
+ `PAGER` 환경 변수 사용.

우선 순위에 따라 다음과 같은 방법으로 외부 페이징 프로그램의 모든 사용을 비활성화할 수 있습니다.
+ `--no-cli-pager` 명령줄 옵션을 사용하여 단일 명령 사용에 대해 페이저를 비활성화합니다.
+ `cli_pager` 설정 또는 `AWS_PAGER` 변수를 빈 문자열로 설정합니다.

**Topics**
+ [cli\$1pager](#cli-usage-pagination-clipager)
+ [AWS\$1PAGER](#cli-usage-pagination-awspager)
+ [--no-cli-pager](#cli-usage-pagination-noclipager)
+ [페이저 플래그](#cli-usage-pagination-flags)

### cli\$1pager 설정을 사용하는 방법
<a name="cli-usage-pagination-clipager"></a>

AWS CLI에서 유지되는 파일에 자주 사용되는 구성 설정과 자격 증명을 저장할 수 있습니다. 이름 프로파일의 설정은 `default` 프로파일의 설정보다 우선합니다. 구성 설정에 대한 자세한 내용은 [AWS CLI의 구성 및 보안 인증 파일 설정](cli-configure-files.md) 섹션을 참조하세요.

다음 예제에서는 기본 출력 페이저를 `less` 프로그램으로 설정합니다.

```
[default]
cli_pager=less
```

다음 예제에서는 기본값을 설정하여 페이저 사용을 비활성화합니다.

```
[default]
cli_pager=
```



### AWS\$1PAGER 환경 변수를 설정하는 방법
<a name="cli-usage-pagination-awspager"></a>

다음 예제에서는 기본 출력 페이저를 `less` 프로그램으로 설정합니다. 환경 변수에 대한 자세한 내용은 [AWS CLI에 대한 환경 변수 구성](cli-configure-envvars.md) 섹션을 참조하세요.

------
#### [ Linux and macOS ]

```
$ export AWS_PAGER="less"
```

------
#### [ Windows ]

```
C:\> setx AWS_PAGER "less"
```

------

### --no-cli-pager 옵션을 사용하는 방법
<a name="cli-usage-pagination-noclipager"></a>

단일 명령에서 페이저 사용을 비활성화하려면 `--no-cli-pager` 옵션을 사용합니다. 명령줄 옵션에 대한 자세한 내용은 [AWS CLI의 명령줄 옵션](cli-configure-options.md) 섹션을 참조하세요.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --no-cli-pager
{
    "Contents": [
...
```

### 페이저 플래그를 사용하는 방법
<a name="cli-usage-pagination-flags"></a>

페이징 프로그램에서 자동으로 사용할 플래그를 지정할 수 있습니다. 플래그는 사용하는 페이징 프로그램에 따라 다릅니다. 아래의 예제는 일반적인 기본값인 `less` 및 `more`에 대한 것입니다.

------
#### [ Linux and macOS ]

별도로 지정하지 않은 경우 AWS CLI 버전 2에는 기본적으로 `less` 페이저가 사용됩니다. `LESS` 환경 변수가 설정되어 있지 않은 경우 AWS CLI 버전 2는 `FRX` 플래그를 사용합니다. AWS CLI 페이저를 설정할 때 플래그를 지정하여 플래그를 결합할 수 있습니다.

다음 예제에서는 `S` 플래그를 사용합니다. 그런 다음 이 플래그는 기본 `FRX` 플래그와 결합하여 최종 `FRXS` 플래그를 생성합니다.

```
$ export AWS_PAGER="less -S"
```

`FRX` 플래그를 원하지 않으면 해당 플래그를 무효화할 수 있습니다. 다음 예제에서는 `F` 플래그를 무효화하여 최종 `RX` 플래그를 생성합니다.

```
$ export AWS_PAGER="less -+F"
```

`less` 플래그에 대한 자세한 내용은 *manpages.org*에서 [less](http://manpages.org/less/1#options)를 참조하세요.

------
#### [ Windows ]

별도로 지정하지 않은 경우 AWS CLI 버전 2에는 기본적으로 `more`가 추가 플래그 없이 사용됩니다.

다음 예제에서는 `/c` 파라미터를 사용합니다.

```
C:\> setx AWS_PAGER "more /c"
```

`more` 플래그에 대한 자세한 내용은 *Microsoft Docs*에서 `[more](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/more)`를 참조하세요.

------

# AWS CLI에서 출력 필터링
<a name="cli-usage-filter"></a>

AWS Command Line Interface(AWS CLI)에는 개별적으로 또는 함께 사용하여 AWS CLI 출력을 필터링할 수 있는 서버 측 필터링과 클라이언트 측 필터링이 둘 다 있습니다. 서버 측 필터링이 먼저 처리되고 클라이언트 측 필터링에 대한 출력을 반환합니다.
+ 서버 측 필터링은 API에서 지원되며, 일반적으로 `--filter` 매개 변수를 사용하여 구현합니다. 이 서비스는 대량 데이터세트에 대한 HTTP 응답 시간을 단축할 수 있는 일치하는 결과만 반환합니다.
+ 클라이언트 측 필터링은 AWS CLI 매개 변수를 사용하여 `--query` 클라이언트에서 지원됩니다. 이 파라미터에는 서버 측 필터링에 없을 수 있는 기능이 있습니다.

**Topics**
+ [서버 측 필터링](#cli-usage-filter-server-side)
+ [클라이언트 측 필터링](#cli-usage-filter-client-side)
+ [서버 측 필터링과 클라이언트 측 필터링 결합](#cli-usage-filter-combining)
+ [추가 리소스](#cli-usage-filter-resources)

## 서버 측 필터링
<a name="cli-usage-filter-server-side"></a>

AWS CLI의 서버 측 필터링은 AWS 서비스 API에서 제공됩니다. AWS 서비스는 필터와 일치하는 HTTP 응답의 레코드만 반환하며, 이렇게 되면 대량 데이터세트에 대한 HTTP 응답 시간을 단축할 수 있습니다. 서버 측 필터링은 서비스 API에 의해 정의되므로, 매개 변수 이름과 함수는 서비스마다 달라집니다. 필터링에 사용되는 몇 가지 일반적인 매개 변수 이름은 다음과 같습니다.
+ `--filter`(예: [ses](https://docs.aws.amazon.com/cli/latest/reference/ses/create-receipt-filter.html) 및 [ce](https://docs.aws.amazon.com/cli/latest/reference/ce/get-cost-and-usage.html)).
+ `--filters`(예: [ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-volumes.html), [autoscaling](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/describe-tags.html) 및 [rds](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html)).
+ `filter`라는 단어로 시작하는 이름입니다(예: [https://docs.aws.amazon.com/cli/latest/reference/dynamodb/scan.html](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/scan.html) 명령의 경우 `--filter-expression`).

특정 명령에 서버 측 필터링과 필터링 규칙이 있는지에 대한 자세한 내용은 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

## 클라이언트 측 필터링
<a name="cli-usage-filter-client-side"></a>

AWS CLI은(는) `--query` 매개 변수를 사용하는 기본 제공 JSON 기반 클라이언트 측 필터링 기능을 제공합니다. `--query` 매개 변수는 출력의 내용과 스타일을 사용자 지정하는 데 사용할 수 있는 강력한 도구입니다. `--query` 매개 변수는 서버에서 다시 오는 HTTP 응답을 받아, 결과를 필터링한 후에 이를 표시합니다. 필터링하기 전에 전체 HTTP 응답이 클라이언트로 전송되므로, 클라이언트 측 필터링은 대량 데이터세트에 대한 서버 측 필터링보다 느릴 수 있습니다.

쿼리는 [JMESPath 구문](https://jmespath.org/)을 사용하여 출력을 필터링하는 표현식을 만듭니다. JMESPath 구문에 대해 알아보려면 *JMESPath 웹사이트*에서 [자습서](https://jmespath.org/tutorial.html)를 참조하세요.

**중요**  
지정한 출력 유형에 따라 `--query` 옵션 작동 방식이 변경됩니다.  
`--output text`를 지정하면 `--query` 필터를 적용하기 *전에* 해당 출력이 페이지 매김되며, AWS CLI는 해당 출력의 *각 페이지*에서 해당 쿼리를 한 번 실행합니다. 이로 인해, 쿼리에는 예상치 못한 추가 출력이 발생할 수 있는 각 페이지의 첫 번째 일치하는 요소가 포함됩니다. 출력을 추가로 필터링하려면 `head` 또는 `tail` 등 다른 명령줄 도구를 사용할 수 있습니다.
`--output json`, `--output yaml` 또는 `--output yaml-stream`을 지정하면 해당 출력을 하나의 네이티브 구조로 완전히 처리한 뒤에 `--query` 필터를 적용합니다. AWS CLI은(는) 전체 구조에 대해 한 번만 쿼리를 실행하여 필터링된 결과를 생성한 다음 출력합니다.

**Topics**
+ [시작하기 전에](#cli-usage-filter-client-side-output)
+ [식별자](#cli-usage-filter-client-side-identifiers)
+ [목록에서 선택](#cli-usage-filter-client-side-select-list)
+ [중첩된 데이터 필터링](#cli-usage-filter-client-side-nested)
+ [결과 병합](#cli-usage-filter-client-side-specific-flattening)
+ [특정 값에 대한 필터링](#cli-usage-filter-client-side-specific-values)
+ [파이핑 표현식](#cli-usage-filter-client-side-pipe)
+ [여러 식별자 값에 대한 필터링](#cli-usage-filter-client-side-miltiselect-list)
+ [식별자 값에 레이블 추가](#cli-usage-filter-client-side-multiselect-hash)
+ [함수](#cli-usage-filter-client-side-functions)
+ [고급 `--query` 예제](#cli-usage-filter-client-side-advanced)

### 시작하기 전에
<a name="cli-usage-filter-client-side-output"></a>

**참고**  
이러한 필터 표현식 예제는 기본 Linux와 유사한 쉘에 대해 작성되었습니다. 이 예제를 사용할 때는 터미널 셸에 올바른 인용 규칙을 사용해야 합니다. 터미널이 입력을 해석하는 방식은 AWS CLI로 전송되는 항목을 크게 변경할 수 있습니다. 터미널이 작은따옴표(`'`), 큰따옴표(`"`) 또는 백틱(```)을 읽는 방법은 콘텐츠 읽기 방법을 변경할 수 있습니다.  
자세한 내용은 [AWS CLI에서 문자열에 따옴표와 리터럴 사용](cli-usage-parameters-quoting-strings.md) 섹션을 참조하세요.

다음 JSON 출력은 `--query` 매개 변수가 생성할 수 있는 결과물의 예를 보여줍니다. 이 출력은 별도의 Amazon EC2 인스턴스에 연결된 세 가지 Amazon EBS 볼륨을 설명합니다.

#### 출력 예시
<a name="cli-usage-filter-client-side-output-example"></a>

```
$ aws ec2 describe-volumes
{
  "Volumes": [
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-17T00:55:03.000Z",
          "InstanceId": "i-a071c394",
          "VolumeId": "vol-e11a5288",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-e11a5288",
      "State": "in-use",
      "SnapshotId": "snap-f23ec1c8",
      "CreateTime": "2013-09-17T00:55:03.000Z",
      "Size": 30
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-18T20:26:16.000Z",
          "InstanceId": "i-4b41a37c",
          "VolumeId": "vol-2e410a47",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-2e410a47",
      "State": "in-use",
      "SnapshotId": "snap-708e8348",
      "CreateTime": "2013-09-18T20:26:15.000Z",
      "Size": 8
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2020-11-20T19:54:06.000Z",
          "InstanceId": "i-1jd73kv8",
          "VolumeId": "vol-a1b3c7nd",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-a1b3c7nd",
      "State": "in-use",
      "SnapshotId": "snap-234087fb",
      "CreateTime": "2020-11-20T19:54:05.000Z",
      "Size": 15
    }
  ]
}
```

### 식별자
<a name="cli-usage-filter-client-side-identifiers"></a>

식별자는 출력 값의 레이블입니다. 필터를 만들 때 식별자를 사용하여 쿼리 결과 범위를 좁힙니다. 다음 출력 예제에서는 `Volumes`, `AvailabilityZone`, `AttachTime` 등 모든 식별자가 강조 표시됩니다.

```
$ aws ec2 describe-volumes
{
  "Volumes": [
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-17T00:55:03.000Z",
          "InstanceId": "i-a071c394",
          "VolumeId": "vol-e11a5288",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-e11a5288",
      "State": "in-use",
      "SnapshotId": "snap-f23ec1c8",
      "CreateTime": "2013-09-17T00:55:03.000Z",
      "Size": 30
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-18T20:26:16.000Z",
          "InstanceId": "i-4b41a37c",
          "VolumeId": "vol-2e410a47",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-2e410a47",
      "State": "in-use",
      "SnapshotId": "snap-708e8348",
      "CreateTime": "2013-09-18T20:26:15.000Z",
      "Size": 8
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2020-11-20T19:54:06.000Z",
          "InstanceId": "i-1jd73kv8",
          "VolumeId": "vol-a1b3c7nd",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-a1b3c7nd",
      "State": "in-use",
      "SnapshotId": "snap-234087fb",
      "CreateTime": "2020-11-20T19:54:05.000Z",
      "Size": 15
    }
  ]
}
```

자세한 내용은 *JMESPath 웹사이트*의 [식별자](https://jmespath.org/specification.html#identifiers )를 참조하세요.

### 목록에서 선택
<a name="cli-usage-filter-client-side-select-list"></a>

목록 또는 배열은 `[`의 `Volumes` 및 `Attachments` 등 대괄호 “[시작하기 전에](#cli-usage-filter-client-side-output)” 뒤에 오는 식별자입니다.

**구문**:

```
<listName>[ ]
```

배열의 모든 출력을 필터링하려면 와일드 카드 표기법을 사용할 수 있습니다. [와일드카드](http://jmespath.org/specification.html#wildcard-expressions) 표현식은 `*` 표기법을 사용하여 요소를 반환하는 데 사용되는 표현식입니다.

다음 예제에서는 모든 `Volumes` 내용을 쿼리합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2020-11-20T19:54:06.000Z",
        "InstanceId": "i-1jd73kv8",
        "VolumeId": "vol-a1b3c7nd",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-a1b3c7nd",
    "State": "in-use",
    "SnapshotId": "snap-234087fb",
    "CreateTime": "2020-11-20T19:54:05.000Z",
    "Size": 15
  }
]
```

인덱스별로 배열의 특정 볼륨을 보려면 배열 인덱스를 호출합니다. 예를 들어, `Volumes` 배열의 첫 번째 항목은 인덱스가 0이고 `Volumes[0]` 쿼리가 생성됩니다. 배열 인덱스에 대한 자세한 내용은 *JMESPath 웹 사이트*의 [인덱스 표현식](http://jmespath.org/specification.html#index-expressions)을 참조하세요.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[0]'
{
  "AvailabilityZone": "us-west-2a",
  "Attachments": [
    {
      "AttachTime": "2013-09-17T00:55:03.000Z",
      "InstanceId": "i-a071c394",
      "VolumeId": "vol-e11a5288",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ],
  "VolumeType": "standard",
  "VolumeId": "vol-e11a5288",
  "State": "in-use",
  "SnapshotId": "snap-f23ec1c8",
  "CreateTime": "2013-09-17T00:55:03.000Z",
  "Size": 30
}
```

인덱스별로 특정 범위의 볼륨을 보려면 다음 구문과 함께 `slice`를 사용합니다. 여기서 **start**는 시작 배열 인덱스이고, **stop**은 필터가 처리를 중지하는 인덱스이고, **step**은 건너뛰기 간격입니다.

**구문**:

```
<arrayName>[<start>:<stop>:<step>]
```

다음 항목 중 하나라도 슬라이스 표현식에서 생략된 경우, 다음 기본값을 사용합니다.
+ 시작 - 목록의 첫 번째 인덱스, 0.
+ 중지 - 목록의 마지막 인덱스.
+ 단계 - 건너뛰기 단계 없음. 여기서 값은 1입니다.

처음 두 볼륨만 반환하려면 다음 예제와 같이 시작 값 0, 중지 값 2, 단계 값 1을 사용합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[0:2:1]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-18T20:26:16.000Z",
        "InstanceId": "i-4b41a37c",
        "VolumeId": "vol-2e410a47",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-2e410a47",
    "State": "in-use",
    "SnapshotId": "snap-708e8348",
    "CreateTime": "2013-09-18T20:26:15.000Z",
    "Size": 8
  }
]
```

이 예제에는 기본값이 포함되어 있으므로 슬라이스를 `Volumes[0:2:1]`에서 `Volumes[:2]`(으)로 줄일 수 있습니다.

다음 예제에서는 기본값을 생략하고 전체 배열에서 두 볼륨마다 반환합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[::2]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2020-11-20T19:54:06.000Z",
        "InstanceId": "i-1jd73kv8",
        "VolumeId": "vol-a1b3c7nd",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-a1b3c7nd",
    "State": "in-use",
    "SnapshotId": "snap-234087fb",
    "CreateTime": "2020-11-20T19:54:05.000Z",
    "Size": 15
  }
]
```

단계는 다음 예제와 같이 배열의 역순으로 필터링하는 음수를 사용할 수도 있습니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[::-2]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2020-11-20T19:54:06.000Z",
        "InstanceId": "i-1jd73kv8",
        "VolumeId": "vol-a1b3c7nd",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-a1b3c7nd",
    "State": "in-use",
    "SnapshotId": "snap-234087fb",
    "CreateTime": "2020-11-20T19:54:05.000Z",
    "Size": 15
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  }
]
```

자세한 내용은 *JMESPath 웹사이트*의 [슬라이스](https://jmespath.org/specification.html#slices)를 참조하세요.

### 중첩된 데이터 필터링
<a name="cli-usage-filter-client-side-nested"></a>

중첩된 값의 `Volumes[*]` 필터링 범위를 좁히려면 마침표 및 필터 기준을 추가하여 하위 표현식을 사용합니다.

**구문**:

```
<expression>.<expression>
```

다음 예제에서는 모든 볼륨에 대한 모든 `Attachments` 정보를 보여줍니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments'
[
  [
    {
      "AttachTime": "2013-09-17T00:55:03.000Z",
      "InstanceId": "i-a071c394",
      "VolumeId": "vol-e11a5288",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ],
  [
    {
      "AttachTime": "2013-09-18T20:26:16.000Z",
      "InstanceId": "i-4b41a37c",
      "VolumeId": "vol-2e410a47",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ],
  [
    {
      "AttachTime": "2020-11-20T19:54:06.000Z",
      "InstanceId": "i-1jd73kv8",
      "VolumeId": "vol-a1b3c7nd",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ]
]
```

중첩된 값으로 추가로 필터링하려면 중첩된 각 식별자에 대한 표현식을 추가합니다. 다음 예제에서는 모든 `State`에 대한 `Volumes`이(가) 나와 있습니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[*].State'
[
  [
    "attached"
  ],
  [
    "attached"
  ],
  [
    "attached"
  ]
]
```

### 결과 병합
<a name="cli-usage-filter-client-side-specific-flattening"></a>

자세한 내용은 *JMESPath 웹 사이트*의 [하위 표현식](https://jmespath.org/specification.html#subexpressions)을 참조하세요.

와일드카드 표기법을 제거함으로써 `Volumes[*].Attachments[*].State`에 대한 결과를 병합하여 `Volumes[*].Attachments[].State` 쿼리를 생성할 수 있습니다. 병합은 흔히 결과의 가독성을 높이는 데 유용합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[].State'
[
  "attached",
  "attached",
  "attached"
]
```

자세한 내용은 *JMESPath 웹사이트*의 [병합](https://jmespath.org/specification.html#flatten)을 참조하세요.

### 특정 값에 대한 필터링
<a name="cli-usage-filter-client-side-specific-values"></a>

목록의 특정 값을 필터링하려면 다음 구문과 같이 필터 표현식을 사용합니다.

**구문**:

```
? <expression> <comparator> <expression>]
```

표현식 비교기에는 `==`, `!=`, `<`, `<=`, `>`, `>=`이(가) 포함됩니다. 다음 예제에서는 `VolumeIds``Volumes`의 모든 `Attached`에 대해 `State`을(를) 필터링합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[?State==`attached`].VolumeId'
[
  [
    "vol-e11a5288"
  ],
  [
    "vol-2e410a47"
  ],
  [
    "vol-a1b3c7nd"
  ]
]
```

그런 다음 이를 병합하여 다음 예제처럼 되게 할 수 있습니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[?State==`attached`].VolumeId[]'
[
  "vol-e11a5288",
  "vol-2e410a47",
  "vol-a1b3c7nd"
]
```

다음 예제에서는 크기가 20보다 작은 모든 `VolumeIds`의 `Volumes`을(를) 필터링합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[?Size < `20`].VolumeId'
[
  "vol-2e410a47",
  "vol-a1b3c7nd"
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [필터 표현식](https://jmespath.org/specification.html#filterexpressions)을 참조하세요.

### 파이핑 표현식
<a name="cli-usage-filter-client-side-pipe"></a>

필터 결과를 새 목록으로 파이핑한 후, 다음 구문을 사용하여 다른 표현식으로 결과를 필터링할 수 있습니다.

**구문**:

```
<expression> | <expression>] 
```

다음 예제에서는 `Volumes[*].Attachments[].InstanceId` 표현식의 필터 결과를 가져와 배열의 첫 번째 결과를 출력합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[].InstanceId | [0]'
"i-a071c394"
```

이 예제는 먼저 다음 표현식에서 배열을 생작성하여 이 작업을 수행합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[].InstanceId'
"i-a071c394",
  "i-4b41a37c",
  "i-1jd73kv8"
```

그런 다음 해당 배열의 첫 번째 요소를 반환합니다.

```
"i-a071c394"
```

자세한 내용은 *JMESPath 웹 사이트*의 [파이프 표현식](https://jmespath.org/specification.html#pipe-expressions)을 참조하세요.

### 여러 식별자 값에 대한 필터링
<a name="cli-usage-filter-client-side-miltiselect-list"></a>

여러 식별자를 필터링하려면 다음 구문을 사용하여 다중 선택 목록을 사용합니다.

**구문**:

```
<listName>[].[<expression>, <expression>]
```

다음 예제에서는 `VolumeId` 및 `VolumeType`이(가) `Volumes` 목록에서 필터링되어 다음 표현식이 생성됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].[VolumeId, VolumeType]'
[
  [
    "vol-e11a5288",
    "standard"
  ],
  [
    "vol-2e410a47",
    "standard"
  ],
  [
    "vol-a1b3c7nd",
    "standard"
  ]
]
```

중첩된 데이터를 목록에 추가하려면 다른 다중 선택 목록을 추가합니다. 다음 예제에서는 중첩 `InstanceId` 목록에서 `State` 및 `Attachments`도 필터링하여 이전 예제를 확장합니다. 그러면 다음과 같은 표현식이 생성됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].[VolumeId, VolumeType, Attachments[].[InstanceId, State]]'
[
  [
    "vol-e11a5288",
    "standard",
    [
      [
        "i-a071c394",
        "attached"
      ]
    ]
  ],
  [
    "vol-2e410a47",
    "standard",
    [
      [
        "i-4b41a37c",
        "attached"
      ]
    ]
  ],
  [
    "vol-a1b3c7nd",
    "standard",
    [
      [
        "i-1jd73kv8",
        "attached"
      ]
    ]
  ]
]
```

더 읽기 쉽게 하려면 다음 예제와 같이 표현식을 병합합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].[VolumeId, VolumeType, Attachments[].[InstanceId, State][]][]'
[
  "vol-e11a5288",
  "standard",
  [
    "i-a071c394",
    "attached"
  ],
  "vol-2e410a47",
  "standard",
  [
    "i-4b41a37c",
    "attached"
  ],
  "vol-a1b3c7nd",
  "standard",
  [
    "i-1jd73kv8",
    "attached"
  ]
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [다중 선택 목록](https://jmespath.org/specification.html#multiselectlist)을 참조하세요.

### 식별자 값에 레이블 추가
<a name="cli-usage-filter-client-side-multiselect-hash"></a>

이 출력을 더 읽기 쉽게 하려면 다음 구문을 사용하여 다중 선택 해시를 사용합니다.

**구문**:

```
<listName>[].{<label>: <expression>, <label>: <expression>}
```

식별자 레이블이 식별자 이름과 같을 필요는 없습니다. 다음 예제에서는 `VolumeType` 값에 `VolumeType` 레이블을 사용합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].{VolumeType: VolumeType}'
[
  {
    "VolumeType": "standard",
  },
  {
    "VolumeType": "standard",
  },
  {
    "VolumeType": "standard",
  }
]
```

간단히, 다음 예제에서는 각 레이블의 식별자 이름을 유지하고 모든 볼륨에 대해 `VolumeId`, `VolumeType`, `InstanceId` 및 `State`을(를) 표시합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}'
[
  {
    "VolumeId": "vol-e11a5288",
    "VolumeType": "standard",
    "InstanceId": "i-a071c394",
    "State": "attached"
  },
  {
    "VolumeId": "vol-2e410a47",
    "VolumeType": "standard",
    "InstanceId": "i-4b41a37c",
    "State": "attached"
  },
  {
    "VolumeId": "vol-a1b3c7nd",
    "VolumeType": "standard",
    "InstanceId": "i-1jd73kv8",
    "State": "attached"
  }
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [다중 선택 해시](https://jmespath.org/specification.html#multiselecthash)를 참조하세요.

### 함수
<a name="cli-usage-filter-client-side-functions"></a>

JMESPath 구문에는 쿼리에 사용할 수 있는 많은 함수가 포함되어 있습니다. JMESPath 함수에 대한 자세한 내용은 *JMESPath 웹 사이트*의 [기본 제공 함수](https://jmespath.org/specification.html#built-in-functions)를 참조하세요.

함수를 쿼리에 통합하는 방법을 보여주기 위해 다음 예제에서는 `sort_by` 함수를 사용합니다. `sort_by` 함수는 다음 구문을 사용하여 표현식을 정렬 키로 사용해 배열을 정렬합니다.

**구문**:

```
sort_by(<listName>, <sort expression>)[].<expression>
```

다음 예제에서는 이전의 [다중 선택 해시 예제](#cli-usage-filter-client-side-multiselect-hash)를 사용하고 `VolumeId`(으)로 출력을 정렬합니다.

```
$ aws ec2 describe-volumes \
    --query 'sort_by(Volumes, &VolumeId)[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}'
[
  {
    "VolumeId": "vol-2e410a47",
    "VolumeType": "standard",
    "InstanceId": "i-4b41a37c",
    "State": "attached"
  },
  {
    "VolumeId": "vol-a1b3c7nd",
    "VolumeType": "standard",
    "InstanceId": "i-1jd73kv8",
    "State": "attached"
  },
  {
    "VolumeId": "vol-e11a5288",
    "VolumeType": "standard",
    "InstanceId": "i-a071c394",
    "State": "attached"
  }
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [sort\$1by](https://jmespath.org/specification.html#sort-by)를 참조하세요.

### 고급 `--query` 예제
<a name="cli-usage-filter-client-side-advanced"></a>

**특정 항목에서 정보를 추출하는 방법**

다음 예제에서는 목록에서 특정 항목을 찾은 다음 해당 항목에서 정보를 추출하는 데 `--query` 파라미터를 사용합니다. 이 예제에서는 지정된 서비스 엔드포인트에 연결된 모든 `AvailabilityZones`을(를) 나열합니다. 지정된 `ServiceDetails`을 가진 `ServiceName` 목록에서 해당 항목을 추출한 다음, 선택한 항목에서 `AvailabilityZones` 필드를 출력합니다.

```
$ aws --region us-east-1 ec2 describe-vpc-endpoint-services \
    --query 'ServiceDetails[?ServiceName==`com.amazonaws.us-east-1.ecs`].AvailabilityZones'
[
    [
        "us-east-1a",
        "us-east-1b",
        "us-east-1c",
        "us-east-1d",
        "us-east-1e",
        "us-east-1f"
    ]
]
```

**지정된 생성 날짜 이후 스냅샷을 표시하는 방법**

다음 예제에서는 출력에 사용 가능한 필드를 몇 개만 포함하여 지정된 날짜 이후에 생성된 모든 스냅샷을 나열하는 방법을 보여줍니다.

```
$ aws ec2 describe-snapshots --owner self \
    --output json \
    --query 'Snapshots[?StartTime>=`2018-02-07`].{Id:SnapshotId,VId:VolumeId,Size:VolumeSize}'
[
    {
        "id": "snap-0effb42b7a1b2c3d4",
        "vid": "vol-0be9bb0bf12345678",
        "Size": 8
    }
]
```

**최신 AMI를 표시하는 방법**

다음 예제에서는 가장 최근에 생성된 5개의 Amazon Machine Image(AMI)를 가장 최근부터 가장 오래된 순으로 정렬하여 나열합니다.

```
$ aws ec2 describe-images \
    --owners self \
    --query 'reverse(sort_by(Images,&CreationDate))[:5].{id:ImageId,date:CreationDate}'
[
    {
        "id": "ami-0a1b2c3d4e5f60001",
        "date": "2018-11-28T17:16:38.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60002",
        "date": "2018-09-15T13:51:22.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60003",
        "date": "2018-08-19T10:22:45.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60004",
        "date": "2018-05-03T12:04:02.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60005",
        "date": "2017-12-13T17:16:38.000Z"
    }
]
```

**비정상 Auto Scaling 인스턴스를 표시하려면**

다음 예제에서는 지정된 AutoScaling 그룹의 비정상 인스턴스에 대한 `InstanceId`만 보여줍니다.

```
$ aws autoscaling describe-auto-scaling-groups \
    --auto-scaling-group-name My-AutoScaling-Group-Name \
    --output text \
    --query 'AutoScalingGroups[*].Instances[?HealthStatus==`Unhealthy`].InstanceId'
```

**지정된 태그가 있는 볼륨을 포함하는 방법**

다음 예제에서는 `test` 태그가 있는 모든 인스턴스에 대해 설명합니다. 볼륨에 연결된 `test` 옆에 또 다른 태그가 있으면, 볼륨은 여전히 결과에 반환됩니다.

아래 표현식은 `test` 태그가 있는 모든 태그를 배열에 반환합니다. `test` 태그가 아닌 모든 태그에는 `null` 값이 포함됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Tags[?Value == `test`]'
```

**지정된 태그가 있는 볼륨을 제외하는 방법**

다음 예제에서는 `test` 태그가 없는 모든 인스턴스에 대해 설명합니다. 볼륨에 여러 태그가 있을 수 있으므로 단순 `?Value != `test`` 표현식을 사용하면 볼륨을 제외하지 않습니다. 볼륨에 연결된 `test` 옆에 또 다른 태그가 있으면, 볼륨은 여전히 결과에 반환됩니다.

`test` 태그가 있는 모든 볼륨을 제외하려면 아래 표현식으로 시작하여 `test` 태그가 있는 모든 태그를 배열에 반환합니다. `test` 태그가 아닌 모든 태그에는 `null` 값이 포함됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Tags[?Value == `test`]'
```

그런 다음 `test` 함수를 사용하여 모든 양의 `not_null` 결과를 필터링합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[?!not_null(Tags[?Value == `test`].Value)]'
```

결과를 파이핑하여 결과를 병합하면 다음 쿼리가 생성됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[?!not_null(Tags[?Value == `test`].Value)] | []'
```

## 서버 측 필터링과 클라이언트 측 필터링 결합
<a name="cli-usage-filter-combining"></a>

서버 측 필터링과 클라이언트 측 필터링을 함께 사용할 수 있습니다. 서버 측 필터링이 먼저 완료되어, `--query` 매개 변수가 필터링하는 데이터를 클라이언트로 보냅니다. 대량 데이터세트를 사용하는 경우, 먼저 서버 측 필터링을 사용하면 클라이언트 측 필터링이 제공하는 강력한 사용자 지정을 유지하면서 각 AWS CLI 호출에 대해 클라이언트로 전송되는 데이터 양을 줄일 수 있습니다.

다음 예제에서는 서버 측 필터링과 클라이언트 측 필터링을 둘 다 사용하는 Amazon EC2 볼륨을 나열합니다. 이 서비스는 `us-west-2a` 가용 영역에서 연결된 모든 볼륨의 목록을 필터링합니다. `--query` 파라미터는 또한 출력을 50보다 큰 `Size` 값을 가진 볼륨으로만 제한하며 사용자 정의 이름으로 지정된 필드만 표시합니다.

```
$ aws ec2 describe-volumes \
    --filters "Name=availability-zone,Values=us-west-2a" "Name=status,Values=attached" \
    --query 'Volumes[?Size > `50`].{Id:VolumeId,Size:Size,Type:VolumeType}'
[
    {
        "Id": "vol-0be9bb0bf12345678",
        "Size": 80,
        "VolumeType": "gp2"
    }
]
```

다음 예제에서는 여러 기준을 충족하는 이미지의 목록을 가져옵니다. 그런 다음 `--query` 파라미터를 사용하여 `CreationDate`를 기준으로 출력을 정렬하고 가장 최근 항목만 선택합니다. 마지막으로 해당 이미지의 `ImageId`를 표시합니다.

```
$ aws ec2 describe-images \
    --owners amazon \
    --filters "Name=name,Values=amzn*gp2" "Name=virtualization-type,Values=hvm" "Name=root-device-type,Values=ebs" \
    --query "sort_by(Images, &CreationDate)[-1].ImageId" \
    --output text
ami-00ced3122871a4921
```

다음 예제에서는 `length`로 목록의 항목 수를 계산하여 1000 IOPS 이상인 사용 가능한 볼륨 수를 표시합니다.

```
$ aws ec2 describe-volumes \
    --filters "Name=status,Values=available" \
    --query 'length(Volumes[?Iops > `1000`])'
3
```

다음 예시에서는 CloudFormation 스택을 사용하는 지정된 AWS 리전에서 시작 구성을 사용하는 Auto Scaling 그룹의 이름을 검색합니다.

```
$ aws autoscaling describe-auto-scaling-groups --region us-west-2 \
  --filters Name=tag-key,Values=aws:cloudformation:stack-name \
  --query 'AutoScalingGroups[?LaunchConfigurationName!=`null`].AutoScalingGroupName'
[
    "group-1",
    "group-2",
    "group-3"
]
```

## 추가 리소스
<a name="cli-usage-filter-resources"></a>

**AWS CLI 자동 프롬프트**  
필터 표현식 사용을 시작할 때 AWS CLI 버전 2에서 자동 프롬프트 기능을 사용할 수 있습니다. 자동 프롬프트 기능은 **F5** 키를 누를 때 미리 보기를 제공합니다. 자세한 내용은 [AWS CLI에서 명령 프롬프트 활성화 및 사용](cli-usage-parameters-prompting.md) 섹션을 참조하세요.

**JMESPath Terminal**  
JMESPath Terminal은 클라이언트 측 필터링에 사용되는 JMESPath 표현식을 실험하는 대화형 터미널 명령입니다. `jpterm` 명령을 사용하면 사용자가 입력할 때 터미널에 즉시 쿼리 결과가 표시됩니다. AWS CLI 출력을 터미널에 직접 파이핑하여 고급 쿼리 실험을 할 수 있습니다.  
다음 예제에서는 `aws ec2 describe-volumes` 출력을 JMESPath Terminal에 직접 파이핑합니다.  

```
$ aws ec2 describe-volumes | jpterm
```
JMESPath Terminal 및 설치 지침에 대한 자세한 내용은 *GitHub*의 [JMESPath Terminal](https://github.com/jmespath/jmespath.terminal)을 참조하세요.

**jq 유틸리티**  
`jq` 유틸리티는 클라이언트 측의 출력을 사용자가 원하는 출력 형식으로 변환하는 방법을 제공합니다. `jq` 및 설치 지침에 대한 자세한 내용은 *GitHub*의 [jq](https://stedolan.github.io/jq/)를 참조하세요.