개요
예로 들어 AWS 계정 내 모든 S3 버킷에 대한 버전 관리 기능 활성화 여부를 확인하고 싶다.
계정 내 S3 버킷 목록은 list-buckets 명령어로 확인할 수 있고,
aws s3api list-buckets
버킷의 버전 관리 기능 활성화 여부는 get-bucket-versioning 명령어에 확인할 버킷을 지정하여 확인할 수 있다.
aws s3api get-bucket-versioning --bucket BUCKET_NAME
이 두 개 명령을 묶어서 하나의 명령어로 처리하고 싶다.
방법을 적어둔다.
xargs
빈칸이나 새 줄로 구분된 표준 입력을 읽어 명령어의 인자(argument)로 전달할 수 있는 명령어다. 앞 명령어의 출력을 다음 명령어의 입력으로 전달하는 PIPE(|)와 같이 사용한다.
xargs [OPTIONS] [COMMAND [initial-arguments]]
예시 )
아래 명령어는 file1, file2, file3이라는 이름의 파일을 한 번에 생성한다.
echo "file1 file2 file3" | xargs touch
이 명령어는 다음 명령어와 동일하다.
touch file1 file2 file3
여려 명령을 실행할 때는 -I 옵션을 사용한다. -I 옵션에 replace-str을 정의하면 정의한 replace-str가 xargs에 의해 인자로 대체된다.
예시 )
아래 명령어는 file1, file2, file3 이라는 이름의 파일을 생성하고 ls 명령을 실행한다.
echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'
참고로 -t 옵션은 실행 명령어를 출력한다.
돌아와서
개요에서 말했던 AWS S3 버킷 목록에 대한 버전 관리 기능 활성화 여부를 확인하기 위해서는 다음과 같은 방식으로 명령어를 작성하면 된다.
1. get-bucket-versioning 명령에 전달할 버킷 이름 출력
aws s3api list-buckets --query Buckets[*].[Name] --output text
2. 파이프와 함께 xargs 대체 문자열 정의
aws s3api list-buckets --query Buckets[*].[Name] --output text | xargs -tI {}
3. get-bucket-versioning 명령 수행
aws s3api list-buckets --query Buckets[*].[Name] --output text \
| xargs -tI {} aws s3api get-bucket-versioning --bucket {}
참고 문서
https://jjeongil.tistory.com/1574
https://man7.org/linux/man-pages/man1/xargs.1.html
Is there a way to pipe the output of one AWS CLI command as the input to another?