0 views
cat 명령어
1. 개요
- cat 명령어는 Concatenate And Print Files의 약자로 하나 이상의 파일 내용을 표준 출력으로 연결하여 출력하는
유틸리티이다.
- 또한 파일을 생성하거나 다른 파일의 내용을 추가하는 용도로도 사용된다.
2. 동작 원리
2.1 파일 디스크럽터와 I/O 스트림
- 파일 열기
- cat 명령이 실행되면 OS는 인자로 전달된 각 파일을 읽고 해당 파일에 대한 파일 디스크립터를 할당
- 데이터 읽기
- 파일 디스크립터를 통해 파일 시스템으로부터 데이터를 버퍼 단위로 읽어 들인다.
- 이는 한 번에 파일 전체를 메모리에 올리는 것이 아니라, 효율적인 I/O 처리를 위해 작은 덩어리(블록)로 처리하는 방식이다.
- 표준 출력
- 읽어 들인 데이터를 표준 출력 스트림을 통해 화면(일반적으로 터미널)에 출력한다.
2.2 리다이렉션과의 결합
cat이 파일을 생성하거나 합칠 수 있는 것은 쉘의 리다이렉션 기능 덕분이다.- 파일 생성/덮어쓰기 (
>):- 사용자가
cat > newfile.txt를 입력하면, 쉘은 표준 입력을cat프로세스에 연결하고,newfile.txt파일을 열어 표준 출력을 이 파일로 연결한다. cat은 사용자가 터미널에 입력하는 내용을 읽어 파일에 그대로 쓴다.
- 사용자가
- 파일 내용 추가 (
>>):cat file1.txt >> file2.txt를 입력하면, 쉘은file2.txt를 추가 모드로 열어 표준 출력을 연결한다.cat은file1.txt의 내용을 읽어file2.txt의 기존 내용 끝에 덧붙여 쓴다.
- 파일 생성/덮어쓰기 (
3. 사용법 및 구문
3.1 기본 구문
cat [옵션] [파일...]
3.2 예시
-
파일 내용 출력: 가장 기본적인 사용법이다.
cat test_file.txt -
여러 파일 연결 출력 (Concatenate): 두 파일의 내용을 순서대로 합쳐서 출력한다.
cat header.txt body.txt footer.txt -
파일 내용 생성 및 덮어쓰기:
cat > new_document.txt # 입력할 내용을 터미널에 직접 타이핑한다. # 입력을 마치려면 Ctrl + D (EOF, End Of File)를 누른다.
3.3 주요 옵션
| 단축 옵션 | 전체 옵션 | 설명 | 예시 |
|---|---|---|---|
-n | --number | 모든 출력 라인에 번호를 매긴다. | cat -n script.py |
-b | --number-nonblank | 비어있지 않은 라인에만 번호를 매긴다. -n을 덮어쓴다. | cat -b log.txt |
-E | --show-ends | 각 라인의 끝에 $ 기호를 표시한다. (줄바꿈 문자를 시각화) | cat -E config.ini |
-T | --show-tabs | 탭 문자(Tab)를 ^I로 표시한다. | cat -T makefile |
-v | --show-nonprinting | 라인 피드(LFD) 및 탭(TAB)을 제외한 출력 불가능한 제어 | |
문자들을 **^**와 M- 표기로 가시화한다. | cat -v data.bin | ||
-s | --squeeze-blank | 반복되는 빈 출력 라인을 하나의 빈 라인으로 압축하여 표시한다. | cat -s report.log |
-A | --show-all | -vET 옵션과 동일하다. (비출력 문자, 줄 끝, 탭 모두 표시) | cat -A debug.txt |
-e | -vE 옵션과 동일하다. | cat -e document.txt | |
-t | -vT 옵션과 동일하다. | cat -t source.c | |
-u | 출력 버퍼링을 하지 않음을 의미했으나, 현재는 무시된다. | ||
--help | 도움말을 출력하고 종료한다. | ||
--version | 버전 정보를 출력하고 종료한다. |
cd 명령어
1. 개요
- Change Directory 의 약자로 쉘의 현재 작업 디렉터리를 변경하는 명령어이다.
- 사용자가 파일 시스템 계층 구조 내에서 다른 위치로 이동할 수 있게 한다.
2. 동작 원리
2.1 쉘 내장 명령어
- 대부분의 명령어(예:
ls,mkdir,cat)는/bin이나/usr/bin에 실행 파일로 존재한다.- 하지만
cd는 실행 파일이 존재하지 않는다.
- 하지만
- 이유
- 리눅스에서 새로운 명령어를 실행하면 부모 프로세스(쉘)가 자식 프로세스를 복제(fork)하여 실행한다.
- 만약
cd가 별도의 프로그램이라면,cd프로그램이 실행되어 자식 프로세스의 위치만 바꾸고 종료될 뿐, 부모 프로세스인 '내 쉘'의 위치는 변하지 않는다.
- 결론
- 따라서
cd는 쉘 자체에 내장된 기능으로 구현되어 있어, 현재 쉘 프로세스의 상태를 직접 변경한다.
- 따라서
2.2 시스템 콜
- 내부적으로는
chdir()이라는 시스템 콜(System Call)을 호출한다.- 사용자가
cd /home입력. - 쉘이
chdir("/home")함수 실행. - 커널이 프로세스의 메타데이터 중 '현재 디렉터리' 포인터를 변경.
- 쉘 환경 변수
$PWD(현재 위치)와$OLDPWD(이전 위치) 값을 갱신.
- 사용자가
3. 사용법 및 구문
3.1 경로 지정 방식
-
절대 경로 (Absolute Path)
-
Root,
/부터 시작하여 전체 주소를 적는 방식. 어디에 있든 항상 동일한 곳으로 간다.cd /usr/bin # 현재 위치와 상관없이 무조건 /usr/bin 으로 이동
-
-
상대 경로 (Relative Path):
-
현재 내가 있는 위치를 기준으로 이동하는 방식.
cd inhere # 현재 폴더 안에 있는 inhere 폴더로 이동 cd ./inhere # 위와 동일 (. 은 현재 위치를 의미)
-
3.2 경로
| 기호 | 의미 | 예시 | 설명 |
|---|---|---|---|
~ | 홈 디렉터리 | cd ~ | 사용자의 개인 홈 폴더(/home/user)로 즉시 귀환 |
.. | 상위 디렉터리 | cd .. | 부모 폴더로 한 칸 위로 이동 |
- | 이전 경로 | cd - | '뒤로 가기' 버튼. 방금 전 있던 곳으로 복귀 |
. | 현재 디렉터리 | cd . | 제자리 이동 (실질적 이동 없음) |
| (없음) | 홈 디렉터리 | cd | 아무것도 안 쓰고 엔터치면 집(~)으로 이동 |
file 명령어
1. 개요
- file 명령어는 지정된 파일의 데이터 유형을 판별하여 출력하는 도구다.
- 파일의 확장자 등에 의존하지 않고 파일 헤더의 매직 넘버의 내부 구조를 분석하여 결과를 반환한다.
2. 동작 원리
2.1 파일 시스템 테스트
- 시스템 호출(stat)을 통해 파일의 메타데이터를 확인한다.
- 파일이 비어있는지 확인
- 파일이 특수 파일인지 확인
- Symlink: 심볼릭 링크
- Socket, FIFO(Pipe): 통신용 파일
- Block/Character Device: 장치 파일
- 이 단계에서 식별되면 즉시 결과를 반환하고 종료한다.
2.2 매직 테스트
- 파일의 헤더에 위치한 특정 바이트 패턴, 즉 매직 넘버를 데이터베이스와 대조한다.
- Magic Database 위치
- 일반적으로
/usr/share/misc/magic또는/etc/magic에 컴파일된 형태로 존재한다
- 일반적으로
- 동작 예시
- 파일의 첫 4바이트가
0x7F 0x45 0x4C 0x46라면 → **ELF (리눅스 실행 파일)**로 판별. - 파일의 첫 바이트가
0xFF 0xD8 0xFF라면 → JPEG 이미지로 판별. - 파일의 첫 바이트가
0x89 0x50 0x4E 0x47라면 → PNG 이미지로 판별.
- 파일의 첫 4바이트가
- Magic Database 위치
2.3 언어 테스트
- 위 두 테스트에서 결과가 나오지 않으면 파일 내용을 텍스트로 가정하고 분석한다.
- 인코딩 확인
- ASCII, UTF-8, ISO-8859-1 등 문자셋을 추측한다.
- 특정 키워드 검색
C program text,HTML document,shell script등을 판별하기 위해 문법적 특징을 찾는다.
- 이 모든 것에도 해당하지 않으면 최종적으로 "data" (알 수 없는 바이너리)라고 출력한다.
- 인코딩 확인
3. 사용법 및 구문
3.1 기본 문법
file [옵션] [파일명]
3.2 주요 옵션
| 옵션 | Long Option | 설명 | 사용 예시 |
|---|---|---|---|
| -b | --brief | 파일명은 제외하고 결과만 간결하게 출력한다. | file -b script.py |
| -i | --mime | 사람이 읽는 포맷 대신 MIME Type 문자열을 출력한다. | |
| (자동화 처리에 필수) | file -i image.png | ||
| -L | --dereference | 심볼릭 링크 자체의 정보가 아닌, 링크가 가리키는 원본 파일을 | |
| 추적하여 분석한다. | file -L /usr/bin/python | ||
| -z | --uncompress | 압축된 파일(gz, bz2 등)의 압축을 풀지 않고 내부 파일의 종류를 | |
| 검사한다. | file -z data.gz | ||
| -f | --files-from | 분석할 파일 목록이 담긴 텍스트 파일을 지정하여 한 번에 처리한다. | file -f filelist.txt |
| -k | --keep-going | 첫 번째 매칭에서 멈추지 않고, 가능한 모든 매칭 결과를 찾아서 | |
| 출력한다. | file -k ambiguous.file | ||
| -s | --special-files | 블록/문자 장치 파일 등을 단순히 장치로만 보지 않고, 내부 데이터를 | |
| 읽어서 파일 시스템 종류 등을 파악한다. | file -s /dev/sda1 |
3.3 예제
-
기본 사용
- 파일 종류를 사람이 읽기 쉬운 형태로 출력한다.
$ file /bin/ls /bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, ... -
MIME Type 출력 ( -i or —mime)
- 스크립트나 프로그램에서 처리하기 용이하도록 MIME Type 형식으로 출력한다.
- 웹 서버 설정이나 자동화 스크립트 작성 시 필수적이다.
$ file -i image.png image.png: image/png; charset=binary $ file -i script.py script.py: text/x-script.python; charset=utf-8 -
간결하게 보기 (-b or —brief)
- 파일명은 제외하고 결과만 출력한다.
$ file -b /etc/passwd ASCII text -
심볼릭 링크 원본 확인 (-L or —dereference)
- 기본적으로 file은 링크 자체를 식별하지만, -L 옵션을 주면 링크가 가리키는 원본 파일을 분석한다.
$ file /usr/bin/python3 /usr/bin/python3: symbolic link to python3.8 $ file -L /usr/bin/python3 /usr/bin/python3: ELF 64-bit LSB executable, x86-64, ... -
압축된 파일 내부 확인 (-z)
- 압축 파일 내부의 파일 종류를 확인하려고 시도한다.
$ file -z data.gz data.gz: ASCII text (gzip compressed data, was "data.txt", ...)
find 명령어
1. 개요
- find 는 지정된 디렉터리 트리를 재귀적으로 순회하며, 사용자가 지정한 조건을 만족하는 파일이나 디렉터리를 검색하고 지정된 작업을 수행하는 유틸리티다.
2. 동작 원리
2.1 디렉터리 순회
- find는 즉시 실제 디렉터리 구조를 하나하나 방문하여 검사한다.
- opendir/readdir
- 시작 경로의 디렉터리를 연다.
- stat/lstat
- 각 파일의 메타데이터(inode 정보: 크기, 권한, 타임스탬프 등)를 시스템 호출로 읽어온다.
- Filtering
- 사용자가 지정한 조건(이름, 크기 등)과 메타데이터를 비교한다.
- Recursion
- 하위 디렉터리가 나오면 동일한 과정을 재귀적으로 반복한다.
- opendir/readdir
2.2 단락 평가 (Short-circuit Evaluation)
- find의 검색 조건은 논리 연산자로 연결되는데, 효율성을 위해 단락 평가를 수행한다.
- 만약 find . -name “*.log” -size +10M 명령어를 시행한다고 가정하면
- find는 파일 이름을 먼저 확인하고 .log로 끝나지 않으면 파일 크기를 확인하지 않고 건너뛴다.
- 즉, 연산 비용이 낮은 조건을 먼저 작성하고 비용이 높은 조건을 뒤에 배치하면 성능적으로 더 뛰어나진다.
3. 사용법 및 구문
3.1 기본 문법
find [검색 시작 경로] [검색 조건(Expression)] [동작(Action)]
- 경로:
.(현재 디렉터리),/(루트),/home/user등. - 조건:
name,type,mtime,size등. - 동작:
print(기본값, 출력),delete,exec등.
3.2 주요 옵션
- 검색 조건: 이름 및 속성
| 옵션 | 설명 | 사용 예시 | 비고 |
|---|---|---|---|
-name pattern | 지정한 패턴과 파일명이 일치하는 파일을 찾는다. (대소문자 구분 O) | find . -name "*.txt" | 와일드카드 사용 시 따옴표("") 필수 |
-iname pattern | 대소문자를 구분하지 않고 파일명을 | ||
| 검색한다. | find . -iname "readme.md" | Case-Insensitive | |
-type c | 파일의 유형(Type)을 기준으로 검색한다. | find . -type d | f: 파일, d: 디렉터리, l: 심볼릭 링크 |
-perm mode | 파일의 권한(Permission)을 기준으로 | ||
| 검색한다. | find . -perm 755 | -perm /4000: SetUID 설정된 파일 검색 | |
-user name | 특정 소유자(User)의 파일을 검색한다. | find . -user root | 사용자 이름 또는 UID 사용 가능 |
-group name | 특정 그룹(Group) 소유의 파일을 | ||
| 검색한다. | find . -group dev_team | ||
| -empty | 크기가 0인 비어있는 파일이나 | ||
| 디렉터리를 찾는다. | find . -empty | 정크 파일 정리 시 유용함 |
- 검색 조건: 시간 및 크기
| 옵션 | 설명 | 사용 예시 | 비고 |
|---|---|---|---|
-size n | 파일 크기로 검색한다. (+: 초과, -: 미만) | find . -size +1G | 단위: k(KB), M(MB), G(GB) |
-mtime n | 파일 내용 수정(Modify) 시간 기준 (일 단위) | find . -mtime -7 | -7: 7일 이내, +7: 7일 이전 |
-atime n | 파일 접근(Access) 시간 기준 (일 단위) | find . -atime +30 | 오랫동안 읽지 않은 파일 찾을 때 사용 |
-ctime n | 파일 속성 변경(Change) 시간 기준 (일 단위) | find . -ctime -1 | 권한, 소유자 등이 변경된 파일 |
-newer file | 기준이 되는 특정 파일보다 최근에 수정된 파일을 찾는다. | find . -newer timestamp.log | 증분 백업 시 유용 |
- 동작 및 제어
| 옵션 | 설명 | 사용 예시 | 비고 |
|---|---|---|---|
| 검색 결과를 표준 출력으로 표시한다. (기본값) | find . -name "*.log" -print | 생략 가능 | |
| -delete | 검색된 파일을 즉시 삭제한다. | find . -name "*.tmp" -delete | 주의: 되돌릴 수 없음 |
-exec cmd | 검색된 파일에 대해 명령어를 실행한다. | find . -name "*.sh" -exec chmod +x {} \; | {}: 파일명, \;: 명령 종료 |
| -ls | 검색 결과를 ls -dils 형식 | ||
| (상세 정보)으로 출력한다. | find . -perm 777 -ls | ||
-maxdepth n | 하위 디렉터리 검색 깊이를 제한한다. | find . -maxdepth 1 -name "*.conf" | 1: 현재 디렉터리만 검색 |
| (재귀 X) | |||
| -prune | 특정 디렉터리를 검색 경로에서 | ||
| 제외한다. | find . -path ./backup -prune -o -print | 특정 폴더 통째로 건너뛸 때 사용 |
sort 명령어
1. 개요
- Sort 명령어는 리눅스 및 유닉스 계열 운영체제에서 텍스트 파일의 행을 특정 기준에 따라 정렬하여 표준 출력으로
내보내는 역할을 한다.
- 단순한 텍스트 정렬뿐만 아니라 병합, 중복 제거, 키 기반의 복잡한 데이터 처리를 수행한다.
2. 동작 원리
- 단순히 텍스트를 읽고 출력하는 것이 아니라, 메모리 관리와 알고리즘 최적화가 내부적으로 수행된다.
2.1 정렬 알고리즘 (External Merge Sort)
- GNU
sort는 기본적으로 외부 병합 정렬(External Merge Sort) 알고리즘을 사용한다.- 이는 데이터가 메모리(RAM)보다 클 경우를 대비한 방식이다.
- 청크 분할 (Chunking):
- 입력 데이터를 메모리 버퍼 크기만큼 읽어들인다.
- 내부 정렬 (Internal Sort):
- 읽어들인 데이터 블록(청크)을 퀵 정렬(Quick Sort) 혹은 힙 정렬(Heap Sort) 등을 사용하여 메모리 내에서 정렬한다.
- 임시 파일 생성:
- 정렬된 청크를 디스크의 임시 디렉터리(보통
/tmp)에 저장한다.
- 정렬된 청크를 디스크의 임시 디렉터리(보통
- 병합 (Merge):
- 모든 데이터가 청크 단위로 정렬되어 디스크에 저장되면, 이를 다시 읽어들이며 하나로 병합 (N-way Merge)하여 최종 정렬된 출력을 생성한다.
- 청크 분할 (Chunking):
- 이는 데이터가 메모리(RAM)보다 클 경우를 대비한 방식이다.
2.2 시간 복잡도와 비교 방식
- 시간 복잡도:
- 일반적인 경우 O(NlogN)의 성능을 보장한다.
- 로케일(Locale)의 영향:
sort는 현재 시스템의 로케일 설정(LC_COLLATE)을 따른다.- 예를 들어,
en_US.UTF-8에서는 대소문자나 특수문자의 정렬 순서가 사전식 정의를 따르므로, 단순 바이트 비교보다 오버헤드가 크다.
2.3 메모리 구조
- 사용자는
S(buffer size) 옵션을 통해 정렬에 사용할 메인 메모리 크기를 지정할 수 있다.- 메모리를 많이 할당할수록 디스크 I/O(임시 파일 생성 빈도)가 줄어들어 속도가 빨라진다.
3. 사용법 및 구문
3.1 기본 구문
sort [OPTION]... [FILE]...
3.2 주요 옵션 분석
| 옵션 | 설명 | 비고 |
|---|---|---|
-n | Numeric sort. 문자열이 아닌 숫자로 인식하여 정렬한다. | '10'이 '2'보다 뒤에 오도록 처리 |
-r | Reverse. 내림차순으로 정렬한다. | 기본값은 오름차순 |
-k | Key. 특정 필드(열)를 기준으로 정렬한다. | sort -k 2 (2번째 열 기준) |
-t | Tag separator. 필드 구분자를 지정한다. | 기본은 공백(Space/Tab) |
-u | Unique. 중복된 라인을 제거하고 하나만 출력한다. | uniq 명령어 대체 가능 |
-o | Output. 결과를 파일로 저장한다. | 리다이렉션(>) 주의사항 해결책 |
3.3 예시
-
숫자 기준 내림차순 정렬
- 파일 내 숫자가 문자로 인식되지 않도록
-n을 사용하고, 큰 수부터 나오도록-r을 사용한다.
# 파일 내용(numbers.txt): 1, 10, 2 sort -nr numbers.txt # 출력 결과: # 10 # 2 # 1 - 파일 내 숫자가 문자로 인식되지 않도록
-
CSV 파일의 특정 컬럼 기준 정렬
/etc/passwd파일처럼 구분자가:인 경우, 3번째 필드(UID)를 기준으로 숫자 정렬을 수행한다.
# -t: 구분자 지정, -k: 3번째 필드, -n: 숫자 정렬 sort -t: -k3n /etc/passwd -
다중 키 정렬 (Advanced)
- 2번째 필드를 기준으로 먼저 정렬하고, 값이 같으면 1번째 필드를 기준으로 정렬한다.
# 성(Last Name)으로 정렬 후, 이름(First Name)으로 정렬 sort -k2,2 -k1,1 names.txt
uniq 명령어
1. 개요
uniq(Unique) 명령어는 텍스트 데이터에서 인접한(Adjacent) 중복 라인을 필터링하거나 삭제하는 유틸리티다.- 주로 정렬된 데이터의 중복을 제거하거나 중복 횟수를 카운트하여 통계를 낼 때 사용한다.
2. 동작 원리
uniq는 매우 단순하지만 치명적인 특징을 가지고 있다.- 이를 이해하지 못하면 데이터 정합성이 깨질 수 있다.
2.1 인접 비교 알고리즘 (Sequential Comparison)
uniq는 파일 전체를 한 번에 메모리에 올리지 않고, 라인 단위(Line-by-line) 스트림 처리를 수행한다.- 버퍼 로드: 첫 번째 라인을 읽어 메모리 버퍼(Previous Line)에 저장한다.
- 비교 (Compare): 두 번째 라인을 읽어 버퍼에 있는 라인과 비교한다.
- 일치하면: 중복으로 간주하고 건너뛴다(옵션에 따라 카운트 증가).
- 다르면: 버퍼에 있던 내용을 출력하고, 방금 읽은 라인을 새로운 버퍼로 교체한다.
- 반복: 파일 끝(EOF)까지 이 과정을 반복한다.
2.2 결정적 한계 (The Trap)
uniq는 "붙어 있는" 중복만 인식한다.- 만약 똑같은 데이터가 떨어져 있다면(예: 1번째 줄과 10번째 줄)
uniq는 이를 다른 데이터로 취급한다.
- 만약 똑같은 데이터가 떨어져 있다면(예: 1번째 줄과 10번째 줄)
- 따라서 **
uniq**는 반드시sort명령어와 함께 사용해야 100% 정확하게 작동한다.
2.3 시간 복잡도
- 입력 데이터가 이미 정렬되어 있다는 가정하에, 데이터를 한 번만 훑으면 되므로 O(N)의 선형 시간 복잡도를 가짐.
- 매우 빠르고 메모리 효율적이다.
3. 사용법 및 구문
3.1 기본 구문
uniq [OPTION]... [INPUT [OUTPUT]]
3.2 주요 옵션 분석
| 옵션 | 설명 | 비고 |
|---|---|---|
-c | Count. 각 라인이 몇 번 중복되었는지 횟수를 함께 출력한다. | 가장 많이 쓰이는 옵션 |
-d | Duplicate. 중복된 라인만 출력한다. (하나만 표시) | 유니크한 값은 제외됨 |
-u | Unique. 중복되지 않은(단 한 번만 등장한) 라인만 출력한다. | -d의 반대 개념 |
-i | Ignore case. 대소문자를 구분하지 않고 비교한다. | 'Apple'과 'apple'을 같게 취급 |
3.3 예시
-
잘못된 사용 vs 올바른 사용
- 데이터가 정렬되지 않은 상태에서
uniq를 쓰면 중복 제거가 되지 않는다.
# cat fruits.txt # apple # banana # apple <-- 떨어진 중복 # [잘못된 사용] uniq fruits.txt # 결과: apple, banana, apple (중복 제거 안 됨) # [올바른 사용] sort와 파이프(|)로 연결 sort fruits.txt | uniq # 결과: # apple # banana - 데이터가 정렬되지 않은 상태에서
-
데이터 빈도 분석 (Histogram)
- 로그 파일 분석 시 가장 강력한 패턴이다.
# sort로 정렬 -> uniq -c로 횟수 집계 -> sort -nr로 빈도수 내림차순 정렬 sort access.log | uniq -c | sort -nr # 결과 예시: # 150 192.168.1.10 (가장 많이 접속한 IP) # 42 192.168.1.5 # 1 10.0.0.1
strings
1. 개요
strings명령어는 바이너리 파일(실행 파일, 라이브러리, 이미지 등) 내부에서 출력 가능한 문자열 시퀀스를 검색하여 표준 출력으로 보여주는 유틸리티다.
2. 동작 원리
strings는 파일을 구조적으로(헤더, 섹션 등) 분석하는 것이 아니라, 단순히 바이트 스트림(Byte Stream)으로 취급하여 스캔한다.
2.1 스캐닝 알고리즘 (Sequential Scanning)
- 바이트 읽기: 대상 파일을 처음부터 끝까지 바이트 단위로 읽어들인다.
- 필터링 (Filtering): 읽어들인 바이트가 출력 가능한 문자 범위에 속하는지 검사한다.
- 일반적으로 ASCII 코드의 32(Space) ~ 126(~) 사이의 값과 탭(Tab), 개행(New line) 문자를 포함한다.
- 임계값 검사 (Threshold Check):
- 기본적으로 연속된 4개 이상의 출력 가능한 문자가 발견될 때만 이를 '문자열'로 판단하고 출력한다.
- 3개 이하의 연속된 문자는 단순한 우연(기계어 코드와 겹침)일 확률이 높기 때문에 Noise으로 간주하여 무시함.
- 종료 처리: 출력 불가능한 문자(Non-printable character, 예: Null byte
0x00)를 만나면 현재 문자열 인식을 종료하고 다음 시퀀스를 찾는다.
2.2 인코딩 처리
- 기본적으로 7-bit ASCII를 기준으로 동작하지만, 최신
strings는 옵션을 통해 8-bit, 16-bit(Unicode), 32-bit 등의 다양한 인코딩 형식도 스캔할 수 있다.- 이는 리틀 엔디안(Little-endian)이나 빅 엔디안(Big-endian)으로 저장된 문자열을 찾는 데 필수적이다.
3. 사용법 및 구문
3.1 기본 구문
strings [OPTION]... [FILE]...
3.2 주요 옵션 분석
| 옵션 | 설명 | 비고 |
|---|---|---|
-n <number> | Min length. 지정한 길이 이상의 문자열만 출력한다. | 기본값은 4. 잡음을 줄일 때 유용하다. |
-t <radix> | Radix(Offset). 문자열이 발견된 파일 내 위치(오프셋)를 함께 출력한다. | x(16진수), d(10진수), o(8진수) |
-e <encoding> | Encoding. 문자의 인코딩 방식을 지정한다. | s(7bit, 기본), b(16bit big), l(16bit little) 등 |
-a | All. 파일의 전체를 스캔한다. | 일부 시스템에서는 데이터 섹션만 스캔하므로 전체 스캔 시 사용 |
3.3 실전 코드 예시
-
실행 파일에서 정보 추출하기
/bin/ls명령어 안에 포함된 텍스트를 추출한다.
strings /bin/ls | head # 결과 예시: # /lib64/ld-linux-x86-64.so.2 # libselinux.so.1 # ... (라이브러리 경로 등이 보임) -
최소 길이 지정으로 잡음 제거
- 너무 짧은 문자열은 제외하고, 10글자 이상의 의미 있는 문장만 찾는다.
strings -n 10 suspicious_file.bin -
문자열의 위치(Offset) 확인 (리버싱 필수 옵션)
- 문자열이 파일의 어느 위치에 있는지 16진수(
x) 주소와 함께 출력한다.
strings -t x program.exe # 출력 결과: # 40a0 Hello World # 40b5 Access Denied - 문자열이 파일의 어느 위치에 있는지 16진수(
base64 명령어
1. 개요
- Base64는 8비트 이진 데이터(Binary Data)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로 이루어진 문자열로 변환(Encoding)하는 방식이다.
2. 동작 원리
- Base64는 암호화(Encryption) 방식이 아니라, 데이터의 표현 포맷을 바꾸는 인코딩(Encoding) 방식이다.
- 핵심 원리는 3바이트를 4문자로 변환하는 것이다.
2.1 비트 스트림 재구성 (Bit Manipulation)
- 컴퓨터의 기본 데이터는 8비트(1바이트) 단위지만, Base64는 이를 6비트 단위로 재조정한다.
- 입력: 8비트 데이터 3개를 가져온다. (총 3×8=24 비트)
- 분할: 24비트를 6비트씩 4개의 그룹으로 쪼갠다. (총 4×6=24 비트)
- 매핑 (Indexing): 각 6비트의 값(0~63)을 Base64 색인표에 대입하여 문자로 변환한다.
- 색인표:
A-Z(0-25),a-z(26-51),0-9(52-61),+(62),/(63)
- 색인표:
2.2 패딩 (Padding, =****)
- 입력 데이터의 길이가 3바이트(24비트)의 배수가 아닐 경우, 부족한 비트를 0으로 채우고 결과 문자열 끝에
=문자를 붙여 길이를 맞춘다.- 1바이트 남음:
=두 개 부착 (==) - 2바이트 남음:
=한 개 부착 (=)
- 1바이트 남음:
2.3 데이터 크기 증가
- 3바이트의 데이터를 표현하기 위해 4바이트(문자)를 사용하므로, 인코딩 후 데이터 크기는 원본 대비 약 33% 증가한다.
3. 사용법 및 구문 (Syntax)
3.1 기본 구문
base64 [OPTION]... [FILE]
3.2 주요 옵션 분석
| 옵션 | 설명 | 비고 |
|---|---|---|
-d****, --decode | Decode. Base64로 인코딩된 데이터를 다시 원본으로 복호화한다. | 필수 옵션 |
-w****, --wrap=COLS | Wrap. 지정한 열(Column) 수마다 개행한다. | 0으로 설정 시 개행 없이 한 줄로 출력 |
| (스크립트 처리 시 중요) | ||
-i****, --ignore-garbage | Ignore. 비(非) 알파벳 문자가 섞여 있어도 무시하고 복호화한다. | 손상된 데이터 처리 시 유용 |
3.3 예시
-
문자열 인코딩 및 디코딩
echo사용 시 줄바꿈 문자가 포함되지 않도록-n옵션을 사용하는 것이 중요하다.
# 인코딩: "Hello" -> "SGVsbG8=" echo -n "Hello" | base64 # 출력: SGVsbG8= # 디코딩: "SGVsbG8=" -> "Hello" echo "SGVsbG8=" | base64 -d # 출력: Hello -
바이너리 파일(이미지 등) 텍스트 변환
- 이미지 파일을 텍스트로 변환하여 HTML/CSS에 직접 삽입하거나, JSON 페이로드에 포함시킬 때 사용한다.
# 이미지 파일을 base64 문자열로 변환 (줄바꿈 없이) base64 -w 0 logo.png > logo_b64.txt # 다시 이미지로 복구 base64 -d logo_b64.txt > logo_restored.png -
SSH 공개키 또는 인증서 확인
cat명령어로 읽으면 깨지는 파일도 base64로 보면 전송 가능한 형태인지 확인할 수 있다.
base64 ~/.ssh/id_rsa.pub
tr 명령어
1. 개요
tr(Translate) 명령어는 표준 입력으로 받은 텍스트 데이터의 문자를 변환, 압축, 또는 삭제하여 표준 출력으로 내보내는 유틸리티다.- 파일명을 인자로 받지 않고 오직 스트림(Stream)만 처리한다는 점이 특징이다.
2. 동작 원리
tr은 매우 가볍고 빠르지만, 동작 방식에 대한 명확한 이해가 없으면 의도치 않은 결과를 낳을 수 있다.
2.1 매핑 테이블
tr은 실행 시 내부적으로 치환 테이블을 생성한다.- 입력:
SET1과SET2라는 두 개의 문자 집합을 인자로 받는다. - 매핑:
SET1의 첫 번째 문자는SET2의 첫 번째 문자로, 두 번째는 두 번째로... 순서대로 1:1 매핑된다.- 예시:
tr 'abc' '123'→ a=1, b=2, c=3
- 예시:
- 실행: 입력 스트림에서 바이트를 하나씩 읽어(Byte-by-byte), 매핑 테이블에 해당 문자가 있으면 변환하고 없으면 그대로 출력한다.
- 입력:
2.2 표준 입력 전용
tr의 가장 큰 특징이자 초보자가 자주 범하는 실수는 파일을 직접 인자로 받을 수 없다는 점이다.- 불가능:
tr 'a' 'b' file.txt(에러 발생 혹은 무반응) - 가능:
cat file.txt | tr 'a' 'b'또는tr 'a' 'b' < file.txt
- 불가능:
2.3 버퍼링과 스트림 처리
sed나awk같은 복잡한 텍스트 프로세서와 달리,tr은 문맥(Context)이나 라인(Line) 개념이 없다.- 오직 들어오는 문자 하나하나에 집중하므로 메모리 사용량이 극도로 적고 속도가 매우 빠르다.
3. 사용법 및 구문 (Syntax)
3.1 기본 구문
tr [OPTION]... SET1 [SET2]
3.2 주요 옵션 분석
| 옵션 | 설명 | 비고 |
|---|---|---|
-d | Delete. SET1에 있는 문자를 입력에서 삭제한다. | SET2 인자가 필요 없다. |
-s | Squeeze. SET1에 있는 문자가 연속으로 반복될 경우 하나로 축소한다. | 공백 제어에 유용 |
-c | Complement. SET1에 포함되지 않은 문자들만 선택한다. | 주로 -d와 조합하여 "이것 빼고 다 지워라"로 쓴다. |
-t | Truncate. SET1의 길이에 맞춰 SET2의 길이를 자른다. | 매핑 오류 방지용 |
3.3 실전 코드 예시
-
대소문자 변환 (가장 흔한 사용법)
[a-z]와 같은 범위 지정도 가능하지만, POSIX 문자 클래스([:lower:])를 사용하는 것이 로케일 호환성 면에서 안전하다.
# 소문자를 대문자로 변환 echo "Hello World" | tr '[:lower:]' '[:upper:]' # 결과: HELLO WORLD -
불필요한 문자 삭제 (
d)- 윈도우에서 작성된 텍스트 파일의 개행 문자(
\r, CR)를 리눅스 포맷으로 바꿀 때 유용하다.
# '\r' (Carriage Return) 삭제 cat windows_file.txt | tr -d '\r' > linux_file.txt - 윈도우에서 작성된 텍스트 파일의 개행 문자(
-
중복 공백 제거 (
s)- 스페이스가 여러 개 섞인 지저분한 데이터를 정리할 때 강력하다.
# 연속된 공백을 하나의 공백으로 축소 echo "This is a test" | tr -s ' ' # 결과: This is a test -
특정 문자 외 모두 제거 (
cd)- 숫자만 추출하고 싶을 때, "숫자가 아닌 것(
-c)"을 "삭제(-d)"하는 방식을 사용한다.
# 문자열에서 숫자만 남기기 echo "My phone number is 010-1234-5678" | tr -cd '[:digit:]' # 결과: 01012345678 - 숫자만 추출하고 싶을 때, "숫자가 아닌 것(
Loading comments...