Linux

[Linux] 명령어 실행 결과를 다른 명령 인자로 전달하기

비번변경 2023. 5. 31. 21:48

개요

예로 들어 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?

http://bahndal.egloos.com/577448