💻 리눅스 문자열 처리와 치환 완벽 가이드
🔍 expr, awk, sed, 변수 치환까지 한 번에 익히는 실전 예제
터미널에서 간단히 문자열을 다루는 일은 리눅스 환경에서 의외로 자주 필요한 작업입니다.
파일 이름을 일괄 변경하거나, 로그 파일에서 특정 패턴을 찾아 수정하는 경우, 혹은 스크립트에서 변수 값을 가공해야 할 때도 있죠.
이럴 때 expr, awk, sed, ${var//a/b} 같은 도구와 문법을 잘 활용하면 작업 효율이 크게 향상됩니다.
특히 명령어 조합과 정규표현식을 적절히 이용하면 복잡한 문자열 처리도 단 한 줄로 끝낼 수 있습니다.
이번 글에서는 리눅스에서 문자열을 다루는 핵심 명령어와 치환 기법을 체계적으로 정리합니다.
각 도구별 특징과 사용 예시를 비교하며, 실제 현업과 스크립트 작성 시 어떻게 적용할 수 있는지도 살펴봅니다.
초보자도 이해할 수 있도록 기본 문법부터 실전 응용까지 순서대로 설명하니, 끝까지 따라오시면 문자열 처리 능력이 한층 업그레이드될 것입니다.
📋 목차
🧮 expr로 기본 문자열 연산하기
리눅스에서 expr 명령어는 간단한 산술 연산뿐만 아니라 문자열 처리에도 유용하게 사용할 수 있습니다.
특히 문자열 길이 확인, 부분 문자열 추출, 패턴 매칭 등 기초적인 작업을 빠르게 처리할 때 적합합니다.
간단하지만 스크립트에서 자주 쓰이는 기능이 많아 알아두면 좋습니다.
📏 문자열 길이 확인하기
문자열 길이를 확인하려면 length 함수를 사용할 수 있습니다.
예를 들어, expr length "Hello World"를 실행하면 11이 출력됩니다.
이 기능은 입력값 검증이나 문자열 처리 전후 변화를 확인할 때 유용합니다.
expr length "Hello World"
# 출력: 11
✂️ 부분 문자열 추출
substr 함수를 사용하면 문자열의 특정 위치에서 원하는 길이만큼 잘라낼 수 있습니다.
예를 들어 expr substr "abcdef" 2 3는 2번째 문자부터 3글자(bcd)를 출력합니다.
이 기능은 고정된 포맷의 데이터에서 일부를 추출하는 데 자주 쓰입니다.
expr substr "abcdef" 2 3
# 출력: bcd
🔍 패턴 매칭
expr은 정규표현식을 사용해 문자열에서 특정 패턴이 일치하는 부분의 길이나 위치를 찾을 수 있습니다.
예를 들어 expr "Hello123" : 'Hello[0-9]+'는 Hello123 전체의 길이인 8을 반환합니다.
이 방법은 간단한 데이터 유효성 검사나 포맷 확인에 유용합니다.
expr "Hello123" : 'Hello[0-9]+'
# 출력: 8
💡 TIP: expr은 단순하고 가볍지만, 복잡한 문자열 조작에는 awk나 sed와 함께 사용하는 것이 더 효과적입니다.
📊 awk로 패턴 매칭과 데이터 가공
awk는 파일이나 표준 입력에서 데이터를 읽고, 각 행을 패턴에 맞춰 처리하는 강력한 텍스트 처리 도구입니다.
로그 분석, CSV 파일 가공, 특정 열만 추출하는 작업 등 다양한 상황에서 활용됩니다.
특히 필드 구분자를 자유롭게 설정할 수 있어 구조화된 데이터를 다루기에 적합합니다.
📄 특정 열 출력하기
기본적으로 awk는 공백을 필드 구분자로 인식하며, 각 필드는 $1, $2와 같이 접근할 수 있습니다.
예를 들어 awk '{print $1, $3}' data.txt는 각 행의 첫 번째와 세 번째 필드를 출력합니다.
awk '{print $1, $3}' data.txt
# 첫 번째, 세 번째 열 출력
🔍 패턴 매칭 후 처리
awk는 특정 패턴과 일치하는 행만 골라 처리할 수 있습니다.
예를 들어 awk '/ERROR/ {print $0}' log.txt는 ERROR라는 단어가 포함된 행만 출력합니다.
이를 활용하면 로그 파일에서 원하는 정보만 빠르게 추출할 수 있습니다.
awk '/ERROR/ {print $0}' log.txt
# ERROR가 포함된 행 출력
🔧 필드 구분자 변경
CSV 파일처럼 쉼표로 구분된 데이터를 처리하려면 -F 옵션을 사용합니다.
예를 들어 awk -F, '{print $2}' file.csv는 각 행의 두 번째 필드를 출력합니다.
이 방식은 탭, 세미콜론 등 다양한 구분자를 지정할 때도 동일하게 적용됩니다.
awk -F, '{print $2}' file.csv
# CSV에서 두 번째 열 출력
💎 핵심 포인트:
awk는 조건문, 반복문, 변수 등을 활용해 간단한 스크립트 수준의 데이터 처리도 가능하므로, sed나 grep보다 복잡한 로직이 필요할 때 유용합니다.
✂️ sed로 문자열 치환과 수정
sed는 스트림 편집기(Stream Editor)로, 파일이나 입력 스트림에서 문자열을 찾아 수정하거나 삭제하는 데 매우 강력합니다.
단순한 치환부터 복잡한 패턴 기반의 변환까지 다양한 기능을 제공하며, 대규모 텍스트 처리에 특히 유리합니다.
🔄 단어 치환하기
sed에서 가장 기본적인 기능은 s/old/new/ 형태의 치환 명령입니다.
예를 들어 sed 's/apple/orange/' file.txt는 각 행에서 첫 번째 apple을 orange로 바꿉니다.
모든 항목을 바꾸려면 마지막에 g 플래그를 추가합니다.
# 첫 번째 apple만 치환
sed 's/apple/orange/' file.txt
# 모든 apple을 orange로 치환
sed 's/apple/orange/g' file.txt
📍 특정 줄에서만 변경
줄 번호를 지정하면 해당 줄에서만 치환을 적용할 수 있습니다.
예를 들어 sed '2s/foo/bar/' file.txt는 두 번째 줄의 foo만 bar로 변경합니다.
또한 범위를 지정하여 여러 줄에 걸쳐 작업하는 것도 가능합니다.
# 2번째 줄만 변경
sed '2s/foo/bar/' file.txt
# 2~4번째 줄만 변경
sed '2,4s/foo/bar/g' file.txt
🧹 줄 삭제와 정리
치환 외에도 d 명령을 사용하면 특정 줄을 삭제할 수 있습니다.
예를 들어 sed '/DEBUG/d' log.txt는 DEBUG가 포함된 모든 줄을 삭제합니다.
이 기능은 로그 정리나 불필요한 데이터 제거에 자주 활용됩니다.
# DEBUG가 포함된 줄 삭제
sed '/DEBUG/d' log.txt
⚠️ 주의: sed 명령을 실행하면 기본적으로 원본 파일을 수정하지 않고 결과만 출력합니다.
원본 파일을 바로 수정하려면 -i 옵션을 사용해야 하지만, 실수 방지를 위해 반드시 백업을 만들어 두는 것이 안전합니다.
🔄 Bash 변수 치환 문법 활용
Bash에서는 변수를 다룰 때 다양한 치환 문법을 제공하여, 문자열 일부 변경이나 패턴 기반 제거를 간단히 처리할 수 있습니다.
이 방식은 외부 명령어 호출 없이 쉘 내부에서 바로 처리되므로 성능도 빠르고, 스크립트의 가독성도 높일 수 있습니다.
✏️ 문자열 일부 치환
가장 많이 쓰이는 문법 중 하나는 ${변수/패턴/대체문자열}입니다.
예를 들어, text="apple banana apple"일 때 ${text/apple/orange}는 첫 번째 apple만 orange로 바꿉니다.
모든 항목을 바꾸려면 //를 사용합니다.
text="apple banana apple"
echo ${text/apple/orange}
# 출력: orange banana apple
echo ${text//apple/orange}
# 출력: orange banana orange
🚀 문자열 앞뒤 패턴 제거
변수에서 특정 패턴을 제거하려면 # 또는 % 기호를 사용합니다.
#은 앞에서부터, %는 뒤에서부터 패턴을 잘라냅니다.
패턴에 ## 또는 %%를 쓰면 가장 긴 패턴이 적용됩니다.
path="/home/user/docs/file.txt"
echo ${path#*/}
# home/user/docs/file.txt
echo ${path##*/}
# file.txt
echo ${path%/*}
# /home/user/docs
echo ${path%%/*}
# (빈 문자열)
💡 기본값 설정 및 치환
변수가 비어 있을 때 기본값을 설정하는 것도 가능합니다.
${변수:-기본값} 문법을 사용하면, 변수가 설정되지 않았거나 비어 있을 때만 기본값을 반환합니다.
unset var
echo ${var:-default}
# 출력: default
💡 TIP: Bash 변수 치환 문법은 외부 명령어를 호출하지 않기 때문에 속도가 매우 빠릅니다. 대량의 문자열 처리나 반복문 안에서 특히 유리합니다.
💡 실무에서 유용한 문자열 처리 팁
리눅스에서 문자열 처리는 단순한 텍스트 변경을 넘어, 데이터 전처리, 로그 분석, 자동화 스크립트 제작 등 다양한 분야에서 활용됩니다.
아래 팁들은 expr, awk, sed, Bash 치환 문법을 효율적으로 조합하는 방법을 중심으로 구성했습니다.
🛠️ 명령어 파이프라인으로 작업 효율 높이기
여러 도구를 파이프로 연결하면 한 번에 복잡한 처리를 할 수 있습니다.
예를 들어, 로그에서 특정 단어가 포함된 행을 추출한 뒤, 해당 단어를 다른 단어로 바꾸고, 마지막으로 카운트하는 작업을 한 줄로 처리할 수 있습니다.
grep "ERROR" app.log | sed 's/ERROR/WARN/g' | wc -l
# ERROR를 WARN으로 바꾼 후 개수 출력
⏱️ 대량 데이터 처리 속도 향상
반복문 내부에서 sed나 awk를 매번 실행하면 속도가 느려집니다.
가능하다면 한 번의 호출로 모든 데이터를 처리하거나, Bash 변수 치환 문법을 활용하여 불필요한 프로세스 실행을 줄이는 것이 좋습니다.
💬 작업량이 많을수록 ‘명령어 호출 최소화’가 성능 최적화의 핵심입니다.
🔍 정규표현식 적극 활용
정규표현식을 익혀두면 단순한 치환에서 복잡한 데이터 패턴 처리까지 가능해집니다.
예를 들어 이메일 주소나 IP 주소 형식을 검증하고, 필요한 값만 추출하는 작업을 awk나 sed로 쉽게 구현할 수 있습니다.
# IP 주소 추출 예시
grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' server.log
📂 파일 일괄 이름 변경
문자열 치환 문법은 파일 이름 일괄 변경에도 활용됩니다.
예를 들어 모든 .txt 파일 확장자를 .bak으로 변경하려면 for 반복문과 변수 치환을 결합하면 됩니다.
for file in *.txt; do
mv "$file" "${file%.txt}.bak"
done
💎 핵심 포인트:
실무에서는 여러 문자열 처리 기법을 혼합하여 사용하면 훨씬 유연하고 효율적인 작업이 가능합니다.
❓ 자주 묻는 질문 (FAQ)
expr과 awk, sed 중 어느 것이 가장 빠른가요?
sed로 여러 패턴을 한 번에 치환할 수 있나요?
awk에서 필드 구분자를 공백이 아닌 다른 문자로 변경할 수 있나요?
Bash 변수 치환 문법은 모든 셸에서 동작하나요?
정규표현식은 expr, awk, sed 모두에서 동일하게 동작하나요?
sed -i 옵션을 사용할 때 주의할 점은 무엇인가요?
awk로 합계나 평균 계산도 할 수 있나요?
변수 치환과 sed 치환 중 어떤 것을 선택해야 하나요?
📝 리눅스 문자열 처리의 핵심 정리
리눅스에서 문자열 처리와 치환은 스크립트 작성, 데이터 가공, 로그 분석 등 다양한 환경에서 필수적으로 사용되는 기술입니다.
expr는 간단하고 빠르게 기본 연산을 수행할 수 있고, awk는 패턴 매칭과 구조화된 데이터 처리에 강력합니다.
sed는 대규모 텍스트 변환과 치환에서 탁월하며, Bash 변수 치환 문법은 명령어 호출 없이도 빠른 처리가 가능합니다.
이 네 가지 방법을 상황에 맞게 조합하면 대부분의 문자열 조작 작업을 효과적으로 수행할 수 있습니다.
또한, 실무에서는 명령어 파이프라인과 정규표현식을 함께 활용해 처리 속도를 높이고, 복잡한 변환을 간단히 구현할 수 있습니다.
이 글에서 다룬 기법들을 익히면 리눅스 환경에서의 문자열 작업이 훨씬 효율적이고 생산적으로 바뀔 것입니다.
🏷️ 관련 태그 : 리눅스문자열처리, expr, awk, sed, bash변수치환, 리눅스스크립트, 정규표현식, 로그분석, 데이터전처리, 문자열치환, 쉘스크립트팁