카테고리 없음

[bash] 명령행 인자($1)를 cut으로 분리해서 처리하는 기법 (delimiter : '.')

미친토끼 2025. 3. 12. 13:17

 

bash에서 명령행 인자로 $1을 받아, 그 문자열을 가공해서 명령을 처리하는 하나의 방식.

 

awk나 sed를 사용해도 처리할 수 있지만 cut을 간단히 사용할 수도 있다.

가령 "maps.google.com"이라는 문자열이 있다면, 거기서 "maps.google"과 "com"을 변수에 담아서 사용해보자.

 

# 구분자를 '.'로 사용해서 첫번째 단어를 추출하는 방법

$ echo "maps.google.com" | cut -d '.' -f 1

maps

 

$ 두 번째 단어부터 끝까지 추출하는 방법

$ echo "maps.google.com" | cut -d '.' -f 2-

google.com

 

하지만 끝 단어 'com'만 뽑아내는 옵션이 없다. 보통 파일 확장자가 마지막에 오기 때문에 이것이 중요하다.

이럴 때 'rev'이라는 명령어가 있는데 문자열을 뒤집어주는 것이다. 누군가가 머리 굴린 결과를 보고 조금 감탄했다. ㅋㅋ

 

$ echo "maps.google.com" | rev | cut -d'.' -f 1 | rev

com

 

rev이 한글도 뒤집어준다.

그럼 com을 제외한 앞부분 문자열은 어떻게 구할까?

 

$ echo "maps.google.com" | rev | cut -d'.' -f 2- | rev

maps.google

 

아래는 간단한 테스트 코드다.

# 테스트 문자열
IN="test_1.girl.mp4"

# 확장자 구하기 :  'mp4'
EXT=$(echo $IN | rev | cut -d'.' -f 1 | rev)

# 확장자 제외한 파일명 구하기: 'test_1.girl'
PREFIX=$(echo $IN | rev | cut -d'.' -f 2- | rev)
echo $EXT
echo $PREFIX

 

이제 이것을 실전에서 사용하는 예제를 만들어본다. ffmpeg로 동영상을 회전시켜 파일로 저장하는 기능을 좀더 편하게 bash 쉘 스크립트로 짠 것인데, ffmpeg 기본 사용 명령은 이렇다.

 

$ ffmpeg -i in.mp4 -vf "transpose=2" out.mp4

 

아래 스크립트에 실행 권한을 줘서,

$ mpeg test_1.girl.mp4 

하는 식으로 실행하면 ffmpeg를 사용해

test_1.girl_rotated.mp4

라는, 회전한 동영상을 만들어준다.

#!/bin/bash

# 파일명: mpeg
# 사용법: mpeg [변환할동영상]
# 동영상을 ffmpeg로 회전시키는 프로그램
# 첫번째 인자로 변환할 동영상 파일 지정
# original.mp4 => original_rotated.mp4
# 인자로 주어진 파일 찾아서 없으면 에러.
# IN="test_1.girl.mp4"

if [ ! -f $1 ]; then
   echo "$1 : not exist."
   exit 
fi

IN=$1

# 확장자 구하기 :  가령 'mp4'
EXT=$(echo $IN | rev | cut -d'.' -f 1 | rev)

# 확장자 제외한 파일명 구하기: 가령 'test_1.girl'
PREFIX=$(echo $IN | rev | cut -d'.' -f 2- | rev)
# echo $EXT
# echo $PREFIX

# ffmpeg : transpose 값
# 0 = 90도를 시계 반대 방향으로 돌리고 상하 반전 시킨다.(기본값)
# 1 = 90도를 시계 방향으로 돌린다.
# 2 = 90도를 시계 반대 방향으로 돌린다.
# 3 = 90도를 시계 방향으로 돌리고 상하 반전 시킨다.
ffmpeg -i $IN -vf "transpose=2" $PREFIX"_rotated".$EXT

# echo $PREFIX"_rotated".$EXT
# 아래 명령을 참고했음. 구분자 '.'로 나눈 마지막 단어를 구하는 방법
# echo "maps.google.com" | rev | cut -d'.' -f 1 | rev