리눅스 명령어

Linux

0 views

cat 명령어

1. 개요

  • cat 명령어는 Concatenate And Print Files의 약자로 하나 이상의 파일 내용을 표준 출력으로 연결하여 출력하는 유틸리티이다.
    • 또한 파일을 생성하거나 다른 파일의 내용을 추가하는 용도로도 사용된다.

2. 동작 원리

2.1 파일 디스크럽터와 I/O 스트림

  1. 파일 열기
    1. cat 명령이 실행되면 OS는 인자로 전달된 각 파일을 읽고 해당 파일에 대한 파일 디스크립터를 할당
  2. 데이터 읽기
    1. 파일 디스크립터를 통해 파일 시스템으로부터 데이터를 버퍼 단위로 읽어 들인다.
    2. 이는 한 번에 파일 전체를 메모리에 올리는 것이 아니라, 효율적인 I/O 처리를 위해 작은 덩어리(블록)로 처리하는 방식이다.
  3. 표준 출력
    1. 읽어 들인 데이터를 표준 출력 스트림을 통해 화면(일반적으로 터미널)에 출력한다.

2.2 리다이렉션과의 결합

  • cat이 파일을 생성하거나 합칠 수 있는 것은 쉘의 리다이렉션 기능 덕분이다.
    • 파일 생성/덮어쓰기 (>):
      • 사용자가 cat > newfile.txt를 입력하면, 쉘은 표준 입력을 cat 프로세스에 연결하고, newfile.txt 파일을 열어 표준 출력을 이 파일로 연결한다.
      • cat은 사용자가 터미널에 입력하는 내용을 읽어 파일에 그대로 쓴다.
    • 파일 내용 추가 (>>):
      • cat file1.txt >> file2.txt를 입력하면, 쉘은 file2.txt를 추가 모드로 열어 표준 출력을 연결한다.
      • catfile1.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)을 호출한다.
    1. 사용자가 cd /home 입력.
    2. 쉘이 chdir("/home") 함수 실행.
    3. 커널이 프로세스의 메타데이터 중 '현재 디렉터리' 포인터를 변경.
    4. 쉘 환경 변수 $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 이미지로 판별.

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 예제

  1. 기본 사용

    1. 파일 종류를 사람이 읽기 쉬운 형태로 출력한다.
    $ file /bin/ls
    /bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, ...
    
  2. MIME Type 출력 ( -i or —mime)

    1. 스크립트나 프로그램에서 처리하기 용이하도록 MIME Type 형식으로 출력한다.
    2. 웹 서버 설정이나 자동화 스크립트 작성 시 필수적이다.
    $ file -i image.png
    image.png: image/png; charset=binary
    
    $ file -i script.py
    script.py: text/x-script.python; charset=utf-8
    
  3. 간결하게 보기 (-b or —brief)

    1. 파일명은 제외하고 결과만 출력한다.
    $ file -b /etc/passwd
    ASCII text
    
  4. 심볼릭 링크 원본 확인 (-L or —dereference)

    1. 기본적으로 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, ...
    
  5. 압축된 파일 내부 확인 (-z)

    1. 압축 파일 내부의 파일 종류를 확인하려고 시도한다.
    $ file -z data.gz
    data.gz: ASCII text (gzip compressed data, was "data.txt", ...)
    

find 명령어

1. 개요

  • find 는 지정된 디렉터리 트리를 재귀적으로 순회하며, 사용자가 지정한 조건을 만족하는 파일이나 디렉터리를 검색하고 지정된 작업을 수행하는 유틸리티다.

2. 동작 원리

2.1 디렉터리 순회

  • find는 즉시 실제 디렉터리 구조를 하나하나 방문하여 검사한다.
    1. opendir/readdir
      1. 시작 경로의 디렉터리를 연다.
    2. stat/lstat
      1. 각 파일의 메타데이터(inode 정보: 크기, 권한, 타임스탬프 등)를 시스템 호출로 읽어온다.
    3. Filtering
      1. 사용자가 지정한 조건(이름, 크기 등)과 메타데이터를 비교한다.
    4. Recursion
      1. 하위 디렉터리가 나오면 동일한 과정을 재귀적으로 반복한다.

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 주요 옵션

  1. 검색 조건: 이름 및 속성
옵션설명사용 예시비고
-name pattern지정한 패턴과 파일명이 일치하는 파일을 찾는다. (대소문자 구분 O)find . -name "*.txt"와일드카드 사용 시 따옴표("") 필수
-iname pattern대소문자를 구분하지 않고 파일명을
검색한다.find . -iname "readme.md"Case-Insensitive
-type c파일의 유형(Type)을 기준으로 검색한다.find . -type df: 파일, 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정크 파일 정리 시 유용함
  1. 검색 조건: 시간 및 크기
옵션설명사용 예시비고
-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증분 백업 시 유용
  1. 동작 및 제어
옵션설명사용 예시비고
-print검색 결과를 표준 출력으로 표시한다. (기본값)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)보다 클 경우를 대비한 방식이다.
      1. 청크 분할 (Chunking):
        1. 입력 데이터를 메모리 버퍼 크기만큼 읽어들인다.
      2. 내부 정렬 (Internal Sort):
        1. 읽어들인 데이터 블록(청크)을 퀵 정렬(Quick Sort) 혹은 힙 정렬(Heap Sort) 등을 사용하여 메모리 내에서 정렬한다.
      3. 임시 파일 생성:
        1. 정렬된 청크를 디스크의 임시 디렉터리(보통 /tmp)에 저장한다.
      4. 병합 (Merge):
        1. 모든 데이터가 청크 단위로 정렬되어 디스크에 저장되면, 이를 다시 읽어들이며 하나로 병합 (N-way Merge)하여 최종 정렬된 출력을 생성한다.

2.2 시간 복잡도와 비교 방식

  • 시간 복잡도:
    • 일반적인 경우 O(NlogN)O(N \log N)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 주요 옵션 분석

옵션설명비고
-nNumeric sort. 문자열이 아닌 숫자로 인식하여 정렬한다.'10'이 '2'보다 뒤에 오도록 처리
-rReverse. 내림차순으로 정렬한다.기본값은 오름차순
-kKey. 특정 필드(열)를 기준으로 정렬한다.sort -k 2 (2번째 열 기준)
-tTag separator. 필드 구분자를 지정한다.기본은 공백(Space/Tab)
-uUnique. 중복된 라인을 제거하고 하나만 출력한다.uniq 명령어 대체 가능
-oOutput. 결과를 파일로 저장한다.리다이렉션(>) 주의사항 해결책

3.3 예시

  1. 숫자 기준 내림차순 정렬

    • 파일 내 숫자가 문자로 인식되지 않도록 -n을 사용하고, 큰 수부터 나오도록 -r을 사용한다.
    # 파일 내용(numbers.txt): 1, 10, 2
    sort -nr numbers.txt
    
    # 출력 결과:
    # 10
    # 2
    # 1
    
  2. CSV 파일의 특정 컬럼 기준 정렬

    • /etc/passwd 파일처럼 구분자가 :인 경우, 3번째 필드(UID)를 기준으로 숫자 정렬을 수행한다.
    # -t: 구분자 지정, -k: 3번째 필드, -n: 숫자 정렬
    sort -t: -k3n /etc/passwd
    
  3. 다중 키 정렬 (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) 스트림 처리를 수행한다.
    1. 버퍼 로드: 첫 번째 라인을 읽어 메모리 버퍼(Previous Line)에 저장한다.
    2. 비교 (Compare): 두 번째 라인을 읽어 버퍼에 있는 라인과 비교한다.
      • 일치하면: 중복으로 간주하고 건너뛴다(옵션에 따라 카운트 증가).
      • 다르면: 버퍼에 있던 내용을 출력하고, 방금 읽은 라인을 새로운 버퍼로 교체한다.
    3. 반복: 파일 끝(EOF)까지 이 과정을 반복한다.

2.2 결정적 한계 (The Trap)

  • uniq"붙어 있는" 중복만 인식한다.
    • 만약 똑같은 데이터가 떨어져 있다면(예: 1번째 줄과 10번째 줄) uniq는 이를 다른 데이터로 취급한다.
  • 따라서 **uniq**는 반드시 sort 명령어와 함께 사용해야 100% 정확하게 작동한다.

2.3 시간 복잡도

  • 입력 데이터가 이미 정렬되어 있다는 가정하에, 데이터를 한 번만 훑으면 되므로 O(N)O(N)O(N)의 선형 시간 복잡도를 가짐.
    • 매우 빠르고 메모리 효율적이다.

3. 사용법 및 구문

3.1 기본 구문

uniq [OPTION]... [INPUT [OUTPUT]]

3.2 주요 옵션 분석

옵션설명비고
-cCount. 각 라인이 몇 번 중복되었는지 횟수를 함께 출력한다.가장 많이 쓰이는 옵션
-dDuplicate. 중복된 라인만 출력한다. (하나만 표시)유니크한 값은 제외됨
-uUnique. 중복되지 않은(단 한 번만 등장한) 라인만 출력한다.-d의 반대 개념
-iIgnore case. 대소문자를 구분하지 않고 비교한다.'Apple'과 'apple'을 같게 취급

3.3 예시

  1. 잘못된 사용 vs 올바른 사용

    • 데이터가 정렬되지 않은 상태에서 uniq를 쓰면 중복 제거가 되지 않는다.
    # cat fruits.txt
    # apple
    # banana
    # apple  <-- 떨어진 중복
    
    # [잘못된 사용]
    uniq fruits.txt
    # 결과: apple, banana, apple (중복 제거 안 됨)
    
    # [올바른 사용] sort와 파이프(|)로 연결
    sort fruits.txt | uniq
    # 결과:
    # apple
    # banana
    
  2. 데이터 빈도 분석 (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)

  1. 바이트 읽기: 대상 파일을 처음부터 끝까지 바이트 단위로 읽어들인다.
  2. 필터링 (Filtering): 읽어들인 바이트가 출력 가능한 문자 범위에 속하는지 검사한다.
    • 일반적으로 ASCII 코드의 32(Space) ~ 126(~) 사이의 값과 탭(Tab), 개행(New line) 문자를 포함한다.
  3. 임계값 검사 (Threshold Check):
    • 기본적으로 연속된 4개 이상의 출력 가능한 문자가 발견될 때만 이를 '문자열'로 판단하고 출력한다.
    • 3개 이하의 연속된 문자는 단순한 우연(기계어 코드와 겹침)일 확률이 높기 때문에 Noise으로 간주하여 무시함.
  4. 종료 처리: 출력 불가능한 문자(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) 등
-aAll. 파일의 전체를 스캔한다.일부 시스템에서는 데이터 섹션만 스캔하므로 전체 스캔 시 사용

3.3 실전 코드 예시

  1. 실행 파일에서 정보 추출하기

    • /bin/ls 명령어 안에 포함된 텍스트를 추출한다.
    strings /bin/ls | head
    # 결과 예시:
    # /lib64/ld-linux-x86-64.so.2
    # libselinux.so.1
    # ... (라이브러리 경로 등이 보임)
    
  2. 최소 길이 지정으로 잡음 제거

    • 너무 짧은 문자열은 제외하고, 10글자 이상의 의미 있는 문장만 찾는다.
    strings -n 10 suspicious_file.bin
    
  3. 문자열의 위치(Offset) 확인 (리버싱 필수 옵션)

    • 문자열이 파일의 어느 위치에 있는지 16진수(x) 주소와 함께 출력한다.
    strings -t x program.exe
    
    # 출력 결과:
    #  40a0 Hello World
    #  40b5 Access Denied
    

base64 명령어

1. 개요

  • Base64는 8비트 이진 데이터(Binary Data)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로 이루어진 문자열로 변환(Encoding)하는 방식이다.

2. 동작 원리

  • Base64는 암호화(Encryption) 방식이 아니라, 데이터의 표현 포맷을 바꾸는 인코딩(Encoding) 방식이다.
    • 핵심 원리는 3바이트를 4문자로 변환하는 것이다.

2.1 비트 스트림 재구성 (Bit Manipulation)

  • 컴퓨터의 기본 데이터는 8비트(1바이트) 단위지만, Base64는 이를 6비트 단위로 재조정한다.
    1. 입력: 8비트 데이터 3개를 가져온다. (총 3×8=24 비트)
    2. 분할: 24비트를 6비트씩 4개의 그룹으로 쪼갠다. (총 4×6=24 비트)
    3. 매핑 (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바이트 남음= 한 개 부착 (=)

2.3 데이터 크기 증가

  • 3바이트의 데이터를 표현하기 위해 4바이트(문자)를 사용하므로, 인코딩 후 데이터 크기는 원본 대비 약 33% 증가한다.

3. 사용법 및 구문 (Syntax)

3.1 기본 구문

base64 [OPTION]... [FILE]

3.2 주요 옵션 분석

옵션설명비고
-d****, --decodeDecode. Base64로 인코딩된 데이터를 다시 원본으로 복호화한다.필수 옵션
-w****, --wrap=COLSWrap. 지정한 열(Column) 수마다 개행한다.0으로 설정 시 개행 없이 한 줄로 출력
(스크립트 처리 시 중요)
-i****, --ignore-garbageIgnore. 비(非) 알파벳 문자가 섞여 있어도 무시하고 복호화한다.손상된 데이터 처리 시 유용

3.3 예시

  1. 문자열 인코딩 및 디코딩

    • echo 사용 시 줄바꿈 문자가 포함되지 않도록 -n 옵션을 사용하는 것이 중요하다.
    # 인코딩: "Hello" -> "SGVsbG8="
    echo -n "Hello" | base64
    # 출력: SGVsbG8=
    
    # 디코딩: "SGVsbG8=" -> "Hello"
    echo "SGVsbG8=" | base64 -d
    # 출력: Hello
    
  2. 바이너리 파일(이미지 등) 텍스트 변환

    • 이미지 파일을 텍스트로 변환하여 HTML/CSS에 직접 삽입하거나, JSON 페이로드에 포함시킬 때 사용한다.
    # 이미지 파일을 base64 문자열로 변환 (줄바꿈 없이)
    base64 -w 0 logo.png > logo_b64.txt
    
    # 다시 이미지로 복구
    base64 -d logo_b64.txt > logo_restored.png
    
  3. SSH 공개키 또는 인증서 확인

    • cat 명령어로 읽으면 깨지는 파일도 base64로 보면 전송 가능한 형태인지 확인할 수 있다.
    base64 ~/.ssh/id_rsa.pub
    

tr 명령어

1. 개요

  • tr (Translate) 명령어는 표준 입력으로 받은 텍스트 데이터의 문자를 변환, 압축, 또는 삭제하여 표준 출력으로 내보내는 유틸리티다.
    • 파일명을 인자로 받지 않고 오직 스트림(Stream)만 처리한다는 점이 특징이다.

2. 동작 원리

  • tr은 매우 가볍고 빠르지만, 동작 방식에 대한 명확한 이해가 없으면 의도치 않은 결과를 낳을 수 있다.

2.1 매핑 테이블

  • tr은 실행 시 내부적으로 치환 테이블을 생성한다.
    1. 입력: SET1SET2라는 두 개의 문자 집합을 인자로 받는다.
    2. 매핑: SET1의 첫 번째 문자는 SET2의 첫 번째 문자로, 두 번째는 두 번째로... 순서대로 1:1 매핑된다.
      • 예시: tr 'abc' '123' → a=1, b=2, c=3
    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 버퍼링과 스트림 처리

  • sedawk 같은 복잡한 텍스트 프로세서와 달리, tr은 문맥(Context)이나 라인(Line) 개념이 없다.
    • 오직 들어오는 문자 하나하나에 집중하므로 메모리 사용량이 극도로 적고 속도가 매우 빠르다.

3. 사용법 및 구문 (Syntax)

3.1 기본 구문

tr [OPTION]... SET1 [SET2]

3.2 주요 옵션 분석

옵션설명비고
-dDelete. SET1에 있는 문자를 입력에서 삭제한다.SET2 인자가 필요 없다.
-sSqueeze. SET1에 있는 문자가 연속으로 반복될 경우 하나로 축소한다.공백 제어에 유용
-cComplement. SET1포함되지 않은 문자들만 선택한다.주로 -d와 조합하여 "이것 빼고 다 지워라"로 쓴다.
-tTruncate. SET1의 길이에 맞춰 SET2의 길이를 자른다.매핑 오류 방지용

3.3 실전 코드 예시

  1. 대소문자 변환 (가장 흔한 사용법)

    • [a-z]와 같은 범위 지정도 가능하지만, POSIX 문자 클래스([:lower:])를 사용하는 것이 로케일 호환성 면에서 안전하다.
    # 소문자를 대문자로 변환
    echo "Hello World" | tr '[:lower:]' '[:upper:]'
    # 결과: HELLO WORLD
    
  2. 불필요한 문자 삭제 (d)

    • 윈도우에서 작성된 텍스트 파일의 개행 문자(\r, CR)를 리눅스 포맷으로 바꿀 때 유용하다.
    # '\r' (Carriage Return) 삭제
    cat windows_file.txt | tr -d '\r' > linux_file.txt
    
  3. 중복 공백 제거 (s)

    • 스페이스가 여러 개 섞인 지저분한 데이터를 정리할 때 강력하다.
    # 연속된 공백을 하나의 공백으로 축소
    echo "This    is   a    test" | tr -s ' '
    # 결과: This is a test
    
  4. 특정 문자 외 모두 제거 (cd)

    • 숫자만 추출하고 싶을 때, "숫자가 아닌 것(-c)"을 "삭제(-d)"하는 방식을 사용한다.
    # 문자열에서 숫자만 남기기
    echo "My phone number is 010-1234-5678" | tr -cd '[:digit:]'
    # 결과: 01012345678
    

Loading comments...