Command Line Tool은 GUI없이 텍스트 명령어만으로 시스템을 제어할 수 있게 해주는 프로그램. 즉, 쉘로 리눅스를 다룰 때 사용하는 도구이다.
가장 기본적이고 필수적인 Command Line Tool을 목적과 기능에 따라 분류해서 공부하자.
grep
과 find
는 리눅스에서 강력한 검색 도구.
grep은 파일 내용에서 특정 패턴을 찾고, find는 파일 시스템에서 파일을 찾는다.
grep
(Global Regular Expression Print)은 정규 표현식을 지원하여 복잡한 텍스트 패턴도 찾을 수 있으며, 또한 파일 내부의 특정 문자열을 찾거나 다른 명령어의 출력에서 특정 줄을 필터링하는 데 사용할 수 있다.
기본 형식 : grep [옵션] 검색패턴 [파일명]
파일명 부분을 입력하지 않으면 표준 입력으로 받은 데이터를 검색한다. 그래서 파이프라인과 결합해 자주 사용한다.
ex : cat 파일 | grep [옵션] 검색패턴
cat 명령어의 출력 결과를 grep으로 검색하는 형식
주요 사용 옵션
옵션 | 설명 |
---|---|
-i | 대소문자를 구분하지 않고 검색 |
-v | 패턴과 일치하지 않는 행을 출력 |
-n | 검색 결과와 함께 행 번호를 출력 |
-l | 패턴이 포함된 파일의 이름만 출력 |
-c | 패턴이 일치하는 행의 개수만 출력 |
-r | 하위 디렉토리를 포함한 모든 파일에서 검색 |
-w | 단어 단위로 패턴을 검색 |
-A n | 일치하는 행과 그 이후 n개의 행을 출력 |
-B n | 일치하는 행과 그 이전 n개의 행을 출력 |
-C n | 일치하는 행과 그 전후 n개의 행을 출력 |
# example.txt 파일에서 "error" 문자열 검색
grep "error" example.txt
# 현재 디렉토리의 모든 .log 파일에서 "error" 검색
grep "error" *.log
# "Error", "ERROR", "error" 모두 검색
grep -i "error" example.txt
# 각 검색 결과의 행 번호도 함께 출력
grep -n "error" example.txt
# 현재 디렉토리와 하위 모든 디렉토리에서 "error" 검색
grep -r "error" .
# 에러 발생 행과 그 전후 2줄씩 함께 출력
grep -C 2 "error" example.txt
# 대소문자 무시하고, 행 번호와 함께, 에러 관련 내용이 아닌 행 검색
grep -inv "error" example.txt
grep은 정규 표현식도 지원하므로, 더 복잡한 패턴 검색도 가능
# 숫자로 시작하는 행 검색
grep "^[0-9]" example.txt
# 이메일 주소 형식 검색
grep "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}" example.txt
실제 작업에서는 파이프라인과 함께 자주 사용된다.
파이프라인(|
)은 첫번째 명령어의 출력을 두 번째 명령어의 입력으로 전달한다.
-> grep과 함께 사용할 때 특정 명령어의 출력 결과에서 관심있는 부분만 필터링할 수 있게 해준다.
# 프로세스 목록에서 특정 프로세스 찾기
ps aux | grep "nginx"
# 이 명령어는 다음과 같이 작동:
# 1. ps aux가 모든 실행 중인 프로세스 목록을 출력
# 2. 이 출력이 grep "nginx"로 전달됨
# 3. grep이 전달받은 목록에서 "nginx"가 포함된 행만 찾아서 출력
다른 예시들
# 네트워크 연결 상태에서 특정 포트 찾기
netstat -an | grep ":80"
# 시스템 로그에서 에러 메시지만 찾기
dmesg | grep "error"
# 설치된 패키지 목록에서 특정 패키지 찾기
dpkg -l | grep "python"
# 디렉토리 목록에서 특정 파일 찾기
ls -l | grep ".txt"
파이프라인 여러 번 연결도 가능
# 프로세스 목록에서 "python"을 찾고, 그 중에서 "error" 포함된 것을 찾기
ps aux | grep "python" | grep "error"
find 명령어는 파일 시스템에서 파일이나 디렉토리를 검색하는 도구.
grep이 파일 내용을 검색한다면 find는 파일 시스템을 탐색하여 파일이나 디렉토리 자체를 찾는다.
기본 형식 : find [검색 시작 위치] [검색 옵션] [동작]
주요 사용 옵션
옵션 | 설명 |
---|---|
-name | 파일 이름으로 검색 (대소문자 구분) |
-iname | 파일 이름으로 검색 (대소문자 무시) |
-type | 파일 유형으로 검색 (f:일반파일, d:디렉토리, l:심볼릭링크) |
-size | 파일 크기로 검색 (+n:초과, -n:미만, n:정확히) |
-mtime | 수정된 시간으로 검색 (일 단위) |
-mmin | 수정된 시간으로 검색 (분 단위) |
-perm | 파일 권한으로 검색 |
-user | 소유자로 검색 |
-empty | 빈 파일이나 디렉토리 검색 |
-maxdepth | 검색할 하위 디렉토리 깊이 제한 |
# 현재 디렉토리에서 test.txt 파일 찾기
find . -name "test.txt"
# 대소문자 구분 없이 .txt 파일 모두 찾기
find . -iname "*.txt"
# 디렉토리만 찾기
find . -type d
# 일반 파일만 찾기
find . -type f
# 심볼릭 링크 찾기
find . -type l
# 100MB보다 큰 파일 찾기
find . -size +100M
# 1KB보다 작은 파일 찾기
find . -size -1k
# 7일 이내에 수정된 파일 찾기
find . -mtime -7
# 24시간 이내에 수정된 파일 찾기
find . -mmin -1440
find는 검색 결과에 대해 추가 작업을 수행할 수 있는 -exec
옵션도 제공한다.
# 찾은 모든 .tmp 파일 삭제
find . -name "*.tmp" -exec rm {} \;
# 찾은 모든 .txt 파일의 권한 변경
find . -name "*.txt" -exec chmod 644 {} \;
find 명령어의 특별한 점은 정확한 파일의 위치나 이름을 모르더라도 파일의 특성(크기, 수정 시간, 권한 등) 으로 검색이 가능하다는 것.
-> 시스템 관리나 문제 해결 시 매우 유용한 도구이다.
위 명령어들은 시스템과 파일의 상태를 분석하는 도구들. stat은 파일의 상세한 메타데이터를 보여주고, wc는 파일의 행 수, 단어 수, 바이트 수를 계산한다. df와 du는 디스크 사용량을 분석하는데, df는 전체 디스크 공간 사용현황을, du는 특정 디렉토리나 파일이 차지하는 공간을 보여준다.
stat은 파일시스템의 상세한 정보를 보여주는 도구라고 했다. 파일 크기, 권한, 소유자, 수정 시간 등 모든 메타데이터를 확인할 수 있다.
기본 형식 : stat [옵션] 파일명
stat example.txt
# 출력 예시:
# File: example.txt
# Size: 1234 Blocks: 8 IO Block: 4096 regular file
# Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)
# Access: 2025-02-09 10:00:00.000000000 +0900
# Modify: 2025-02-09 10:00:00.000000000 +0900
# Change: 2025-02-09 10:00:00.000000000 +0900
파일의 줄 수, 단어 수, 바이트 수를 계산한다. 특히 테스트 처리나 로그 분석에서 매우 유용
기본 사용법 : wc [옵션] 파일명
# 주요 옵션:
-l : 줄 수만 출력
-w : 단어 수만 출력
-c : 바이트 수만 출력
-m : 문자 수만 출력
df(disk free)는 시스템의 전체 디스크 공간 사용 현황을 보여준다.
df [옵션]
# 가장 많이 사용되는 형태:
df -h # 사람이 읽기 쉬운 형태로 출력 (GB, MB 등)
# 출력 예시:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 100G 50G 50G 50% /
du(disk usage)는 특정 디렉토리나 파일이 사용하는 디스크 공간을 보여준다.
du [옵션] [경로]
# 자주 사용되는 옵션 조합:
du -sh * # 현재 디렉토리의 각 항목별 총 사용량
du -h --max-depth=1 # 현재 디렉토리의 직계 하위 항목들의 사용량
위 도구들은 서로 보완적으로 사용. 예를 들어 시스템의 디스크 공간이 부족할 때의 일반적인 분석과정은
tar와 tr은 파일을 처리하고 변환하는 도구이다. tar은 여러 파일을 하나의 아카이브로 묶거나 풀 수 있으며, 압축 기능도 지원하다. tr은 문자를 변환하거나 삭제하는 데 사용되며, 텍스트 데이터를 가공할 때 유용하다.
tar은 여러 파일을 하나의 아카이브 파일로 묶거나 반대로 아카이브를 풀 때 사용하는 도구.
아카이브와 압축은 실제로 서로 다른 개념이다. 아카이브는 여러 파일과 디렉토리를 하나의 파일로 "묶는" 것이다. 이 과정에서는 실제로 파일 크기를 줄이지 않는다. tar명령어의 기본 기능이 바로 이것. 결과물로 .tar 확장자를 가진 파일이 생성된다.
압축은 파일의 실제 크기를 줄이는 과정이다. 데이터를 더 효율적인 형태로 변환하여 저장 공간을 절약하는 것인데, gzip, bzip2와 같은 도구들이 이 작업을 수행한다.
리눅스에서 자주 보는 .tar.gz파일은 이 두 가지 과정을 모두 거친 것.
기본 사용법 : tar [옵션들] [아카이브 파일명] [대상파일들 / 디렉토리들]
여기서 중요한 점은 -f 옵션을 사용할 때의 규칙. -f 옵션은 항상 아카이브 파일명 바로 앞에 위치해야 한다. 즉 옵션들의 마지막에 반드시 f가 와야함.
tar 명령어의 주요 옵션. tar의 옵션들은 크게 기본 동작을 지정하는 옵션과 부가적인 기능을 추가하는 옵션으로 나눌 수 있다.
기본 동작 지정하는 핵심 옵션들
| 옵션 | 설명 |
|------|------|
| -c | 새로운 아카이브 생성 (create) |
| -x | 아카이브에서 파일 추출 (extract) |
| -t | 아카이브 내용 확인 (list) |
| -f | 아카이브 파일 이름 지정 (file) - 거의 항상 사용됨 |
압축 관련 옵션들
| 옵션 | 설명 |
|------|------|
| -z | gzip 압축 사용 (.tar.gz 또는 .tgz) |
| -j | bzip2 압축 사용 (.tar.bz2) |
| -J | xz 압축 사용 (.tar.xz) |
부가 기능 옵션들
| 옵션 | 설명 |
|------|------|
| -v | 진행 상황 자세히 표시 (verbose) |
| -p | 파일 권한 유지 (preserve permissions) |
| -P | 절대 경로 허용 (absolute paths) |
| -r | 기존 아카이브에 파일 추가 (append) |
| -u | 더 새로운 파일만 추가 (update) |
| --exclude | 특정 파일/디렉토리 제외 |
이러한 옵션들은 보통 조합해서 사용한다. 가장 일반적인 사용 예시를 보면
# 가장 흔한 사용법: 파일들을 gzip으로 압축하여 아카이브 생성
tar -czf backup.tar.gz /path/to/files
-> 해당 명령어는 /path/to/files 경로에 있는 모든 파일과 디렉토리를 가져와서 backup.tar.gz라는 압축된 아카이브 파일을 생성한다. 이는 마치 여러 문서를 하나의 폴더에 넣고 그 폴더를 압축하는 것과 같다.
# 아카이브 내용 확인
tar -tvf backup.tar.gz
-> 이 명령어는 backup.tar.gz 파일의 내용을 확인한다. 실행하면 아카이브 안에 있는 모든 파일과 디렉토리의 목록이 표시된다. 파일의 권한,소유자,크기,수정 날짜 등 상세정보도 함께. 압축 파일을 실제로 풀지 않고도 내용을 미리 볼 수 있게 해준다.
# 아카이브 압축 해제
tar -xzf backup.tar.gz
-> backup.tar.gz 파일을 현재 디렉토리에 압축 해제한다. 아카이브 안의 모든 파일과 디렉토리가 원래의 구조대로 복원
# 특정 디렉토리에 아카이브 압축 해제
tar -xzf backup.tar.gz -C /target/directory
-> 세번째 명령어와 비슷하지만. 압축을 해제할 위치를 직접 지정. -C 옵션 뒤에 오는 경로에 모든 파일이 압축 해제.
# 특정 파일/디렉토리를 제외하고 아카이브 생성
tar -czf backup.tar.gz --exclude='*.tmp' /path/to/files
tr은 문자 단위의 변환과 삭제 수행
기본 형식 : tr [옵션] 집합1 [집합2]
여기서 집합1의 각 문자는 집합2의 대응하는 문자로 변환된다.
tr은 주로 파이프라인과 함께 사용되며, 표준 입력으로부터 데이터를 받아 처리한다.
주요 옵션들
| 옵션 | 설명 |
|------|------|
| -d | 집합1에 지정된 문자들을 삭제 |
| -s | 연속된 중복 문자를 하나로 압축 |
| -c | 집합1에 지정되지 않은 문자들을 처리 |
실제 사용
문자 변환의 기본적인 사용
# 소문자를 대문자로 변환
echo "hello world" | tr 'a-z' 'A-Z'
# 출력: HELLO WORLD
# 숫자를 별표로 변환
echo "phone: 123-456-7890" | tr '0-9' '*'
# 출력: phone: ***-***-****
특정 문자 삭제
# 모든 숫자 삭제
echo "hello123world456" | tr -d '0-9'
# 출력: helloworld
# 모든 공백 문자 삭제
echo "hello world" | tr -d ' '
# 출력: helloworld
연속된 문자 압축
# 연속된 공백을 하나로 압축
echo "hello world" | tr -s ' '
# 출력: hello world
# 연속된 줄바꿈을 하나로 압축
cat file.txt | tr -s '\n'
tr은 데이터 정제나 텍스트 형식 변환에서 특히 유용하다. 예를 들어, CSV 파일의 구분자를 변경하거나, 로그 파일에서 불필요한 문자를 제거하는 데 자주 사용된다.
# CSV 파일의 쉼표를 탭으로 변환
cat data.csv | tr ',' '\t' > data.tsv
# 파일에서 모든 제어 문자 제거
cat file.txt | tr -d '[:cntrl:]'