서버에서 "포트가 이미 사용 중"
역검색 표의 첫 줄입니다. ss -tulnp | grep :8080으로 PID를 찾고 kill <PID>를 하거나, 곧바로 kill -9 $(lsof -t -i :8080)을 씁니다.
Guide
Linux 명령어 치트시트는 터미널에서 매일 치게 되는 160개 명령어를 "파일과 디렉터리, 내용 보기와 편집, 텍스트 처리, 권한과 사용자, 프로세스와 서비스, 네트워크, 압축과 묶기, 시스템 정보와 관리" 여덟 갈래로 정리하고, 각 항목에 한 줄 설명과 그대로 복사할 수 있는 예시 몇 줄을 붙였습니다. ls, find, grep, sed, awk, tar, curl, ss, journalctl처럼 옵션이 많은 명령어에는 자주 쓰는 옵션 표를 따로 달아 펼쳐서 볼 수 있습니다.
2026-09-09 업데이트4 sources7 min read
Linux 명령어 치트시트는 터미널에서 매일 치게 되는 160개 명령어를 "파일과 디렉터리, 내용 보기와 편집, 텍스트 처리, 권한과 사용자, 프로세스와 서비스, 네트워크, 압축과 묶기, 시스템 정보와 관리" 여덟 갈래로 정리하고, 각 항목에 한 줄 설명과 그대로 복사할 수 있는 예시 몇 줄을 붙였습니다. ls, find, grep, sed, awk, tar, curl, ss, journalctl처럼 옵션이 많은 명령어에는 자주 쓰는 옵션 표를 따로 달아 펼쳐서 볼 수 있습니다.
두 가지 찾기 방식을 해결합니다. 하나는 명령어 이름은 아는데 인자가 기억나지 않을 때(tar, chmod 검색)입니다. 다른 하나는 무엇을 보고 싶은지만 알 때입니다. "어떤 프로세스가 8080을 쓰고 있지", "어느 디렉터리가 디스크를 제일 많이 쓰지", "이 서비스는 왜 안 뜨지" 같은 물음을 위해 "내가 보고 싶은 것… → 무슨 명령어" 역검색 표를 따로 만들었습니다. 목표를 먼저 말하고 그것을 얻을 수 있는 명령어 2–3개를 추천순에서 호환순으로 보여 줍니다.
페이지 아래에는 브라우저에서 도는 시뮬레이션 터미널이 있습니다. 메모리 파일 시스템에 60여 개 명령어를 처리하는 Shell 인터프리터를 얹었고, 파이프, 리다이렉션, 와일드카드와 sed/awk의 흔한 부분 집합을 지원하며, 디렉터리 구조 만들기부터 파이프로 로그 집계하기까지 8개 연습 단계가 있습니다. 여러분 컴퓨터에 접근하지도 않고 네트워크도 없으니 rm -rf를 잘못 쳐도 단계가 초기화될 뿐입니다.
help는 시뮬레이터가 지원하는 모든 명령어를 보여 주고, Tab은 파일 이름을 완성합니다."포트"를 검색하면 명령어 표와 역검색 표에 동시에 걸립니다:
시뮬레이션 터미널에서 8번 단계 "파이프 조합"을 끝까지 푼 풀이:
내가 보고 싶은 것: 어떤 프로세스가 어떤 포트를 쓰고 있는지
ss -tulnp | grep :8080
lsof -i :8080
netstat -tulnp | grep 8080 구형 시스템
네트워크 › ss -tulnp 수신 포트와 해당 프로세스 보기(netstat 대체)
네트워크 › lsof -i :<포트> 어떤 프로세스가 포트를 점유했는지user@toolun-lab:~$ awk '{print $2}' access.log | sort | uniq -c | sort -rn
3 /index.html
2 /api/list
2 /about
✔ 통과: 파이프 조합: 가장 많이 방문한 경로.Unix 설계의 두 원칙이 이 표의 모양을 정했습니다. 첫째, "모든 것은 파일": 장치, 프로세스 정보(/proc), 소켓이 모두 파일 형태로 드러나기 때문에 cat /proc/cpuinfo, ls -l /dev/sd*, echo > /dev/tcp/host/port 같은 이상해 보이는 쓰임새도 성립합니다. 둘째, "각 프로그램은 한 가지 일만 잘한다": grep은 거르기만, sort는 정렬만, uniq는 인접 중복 합치기만, wc는 세기만 하며, 각자 작지만 파이프로 이어 붙이면 강력해집니다.
그래서 치트시트 예시에는 |가 자주 나옵니다. awk '{print $1}' access.log | sort | uniq -c | sort -rn | head는 작은 프로그램 다섯 개로 "가장 많이 접근한 IP"를 만들어 냅니다. 각 단계의 입력과 출력을 이해하는 편이 명령어 전체를 외우는 것보다 쓸모 있습니다.
프로세스는 시작할 때 이미 열린 "파일" 세 개를 들고 있습니다. 표준 입력(0), 표준 출력(1), 표준 오류(2)입니다. >는 표준 출력을 파일로 쓰고, 2>는 오류 스트림을 다루며, 2>&1은 오류를 출력에 합치고, &>는 bash의 축약형입니다. 일상에서 가장 흔한 조합은 cmd > out.log 2>&1 &입니다. 정상 출력과 오류가 모두 로그로 들어가고 작업은 백그라운드로 갑니다. 2>&1을 빠뜨리는 것이 "로그에 오류가 왜 없지"의 일등 원인입니다.
ls -l의 첫 칸 -rwxr-xr-x는 네 토막입니다. 종류(- 파일, d 디렉터리, l 링크), 그다음 소유자, 그룹, 그 밖의 사용자 각각의 읽기(4)·쓰기(2)·실행(1)입니다. 세 자리를 더하면 숫자 표기가 됩니다. rwx=7, r-x=5, r--=4이므로 755는 "나만 전권, 남들은 읽기와 실행", 644는 "나는 읽고 쓰기, 남들은 읽기만"입니다. 디렉터리에서 x는 "들어갈 수 있음"을 뜻하므로, x가 없는 디렉터리는 r이 있어도 내용을 나열할 수 없습니다. 600/700은 개인 키와 ~/.ssh에 쓰이며, SSH 클라이언트는 권한이 너무 열린 키 파일을 거부합니다. 더 많은 조합은 chmod 계산기에서 체크해 볼 수 있습니다.
kill이라는 이름은 오해를 부릅니다. 프로세스에 시그널을 보낼 뿐입니다. 기본값 TERM(15)은 "나가 주세요"라서 프로그램이 상태를 저장할 기회를 갖고, KILL(9)은 커널이 곧바로 끝내므로 기회가 전혀 없습니다. 그래서 먼저 kill하고, 몇 초 기다려도 안 되면 kill -9을 씁니다. HUP(1)은 데몬에서 "설정 다시 읽기"로 관례화되어 있고, nginx -s reload가 그 아래에서 이것을 씁니다.
최신 배포판은 systemd로 서비스를 관리합니다. systemctl이 시작·정지와 부팅 시 자동 시작을 맡고, journalctl이 그 로그를 한곳에 모읍니다. "서비스가 안 뜬다"를 파는 정해진 경로는 systemctl status로 상태와 마지막 로그 몇 줄 보기 → journalctl -u <서비스> -n 100으로 전체 오류 보기 → ss -tlnp로 포트가 이미 잡혀 있는지 확인하기입니다.
ifconfig, netstat, route, arp는 유지보수가 끝난 net-tools에 속하고 새 시스템에는 기본 설치되지 않습니다. 대응하는 대체는 iproute2의 ip addr, ss, ip route, ip neigh입니다. 치트시트는 둘 다 싣고, 역검색 표는 새 도구를 앞에 놓습니다. ss -tulnp의 다섯 글자는 TCP, UDP, 수신, 숫자 포트, 프로세스를 뜻하며 포트 문제를 팔 때 거의 항상 첫 수입니다.
GNU sed의 -i는 인자 없이 쓸 수 있지만, BSD sed(macOS 기본)는 -i 뒤에 백업 접미사가 반드시 필요해서 sed -i '' 's/a/b/' file처럼 씁니다. 비슷한 차이로 date -d(GNU)와 date -v(BSD), 구형 macOS에 없는 readlink -f가 있습니다. 치트시트는 GNU 버전을 기준으로 하고 macOS 차이는 항목 비고에 적어 두었습니다. brew install coreutils gnu-sed로 GNU 버전을 설치할 수 있습니다.
yast), 데스크톱 환경 명령어, 프로그래밍 언어가 딸려 보내는 CLI는 넣지 않았습니다.sed는 s///, N,Mp, Nd만, awk는 {print $N}만 지원합니다. 네트워크가 없어(curl, ssh, apt는 이유를 설명합니다) 실제 프로세스도 없고(ps, top, kill은 고정된 데모 데이터를 돌려줍니다) 대화형 편집기도 없습니다(echo >, cat >>로 파일을 씁니다).역검색 표의 첫 줄입니다. ss -tulnp | grep :8080으로 PID를 찾고 kill <PID>를 하거나, 곧바로 kill -9 $(lsof -t -i :8080)을 씁니다.
"텍스트 처리" 그룹은 grep -A3 -B1로 문맥 보기부터 awk/sort/uniq -c로 통계 내기, 회전하는 로그를 따라가는 tail -F까지 한 벌입니다. 연습 터미널 3번과 8번 단계가 바로 이 두 작업입니다.
tar -czvf → scp / rsync -avz → tar -xzvf -C /var/www/ 세 줄이 나란히 있고, rsync --delete의 함정은 비고에 있습니다.
"시스템 정보와 관리" 그룹을 cat /etc/os-release, nproc, free -h, df -h, ss -tlnp, systemctl list-units 순서로 훑으면 10분 만에 전체 그림이 잡힙니다.
사실상 불가능합니다. Linux에는 휴지통이 없고 rm은 inode를 곧바로 해제합니다. 중요한 디렉터리를 건드리기 전에 ls로 경로를 확인하고, 스크립트에서는 변수를 따옴표로 감싸고 빈 값인지 확인하며(rm -rf "${DIR:?}"/), trash-cli 같은 도구로 rm을 대신하기도 합니다.
대개 터미널이나 파일 인코딩이 어긋난 탓입니다. 먼저 file 파일이름으로 인코딩을 보고, GBK 파일이면 iconv -f GBK -t UTF-8로 UTF-8로 바꾼 뒤 다시 검색하세요. grep -a는 바이너리로 잘못 판정된 파일을 텍스트로 다룹니다.
ss -tulnp의 열은 차례로 Netid, State, Recv-Q, Send-Q, Local Address:Port, Peer Address:Port, Process입니다. 포트를 찾을 때는 Local Address:Port 열을 보고(*:8080이나 0.0.0.0:8080은 모든 인터페이스에서 수신한다는 뜻), 프로세스를 찾을 때는 마지막 열의 users:(("node",pid=842,fd=18))를 봅니다.
브라우저에서 돌아가며 네트워크 스택이 없고, 대신 요청을 보내서도 안 되기 때문입니다. 이런 명령어는 설명 한 줄과 함께 치트시트의 해당 항목을 가리킵니다. 연습의 초점은 파일, 텍스트, 권한 조작이고 이들은 메모리 파일 시스템에서 온전히 동작합니다.
이미 권한이 있는 파일을 읽는 데는 필요 없습니다. 시스템 디렉터리(/etc, /usr)를 고치거나, 1024 미만 포트를 바인딩하거나, 남의 프로세스 상세 정보를 보거나, 서비스와 패키지를 관리할 때는 root가 필요합니다. sudo는 한 명령어만 root로 실행하므로 root로 갈아타 오래 작업하는 것보다 안전합니다.
치트시트 데이터, 역검색 표, 시뮬레이션 터미널은 모두 페이지와 함께 내려받는 정적 콘텐츠로 브라우저에서 로컬로 돌아갑니다. 검색, 복사, 연습은 아무 요청도 보내지 않습니다. 즐겨찾기는 이 기기의 localStorage에 저장됩니다. 시뮬레이션 터미널의 파일 시스템은 현재 페이지 메모리에만 있고 새로 고침하면 비워지며, 실제 파일을 읽거나 쓰지 않습니다.
ls, cp, sort, cut 같은 기본 명령어의 권위 있는 설명.ss(8), ip(8), find(1), grep(1)을 포함한 온라인 매뉴얼 페이지.2026-09-09 업데이트
Linux/Shell 명령 160개를 파일, 텍스트, 권한, 프로세스, 네트워크, 압축, 시스템별로 정리하고 옵션 표와 실제 예시 제공. 「무엇을 보고 싶은가 → 어떤 명령인가」 역검색 표, 검색·복사·즐겨찾기, 연습 터미널 포함
이 도구는 아직 완전히 번역되지 않아 일부 내용이 원문 또는 대체 언어로 표시됩니다.
출력 목표로 역검색합니다. 알고 싶은 것을 먼저 말하면, 그것을 보여 주는 명령어 두세 개를 최신순·추천순으로 제시합니다.
pwd # /var/www/site
ls -la # 자세한 정보 + 숨겨진 파일 ls -lh # 사람이 읽을 수 있는 크기 ls -lt | head # 수정시간의 역순으로 최신순으로 조회
| -l | 긴 형식: 권한, 소유자, 크기, 시간 |
| -a | 로 시작하는 숨겨진 파일이 포함되어 있습니다. |
| -h | K/M/G 단위의 크기 |
| -t | 수정 시간별로 정렬 |
| -S | 크기별로 정렬 |
| -R | 재귀 하위 디렉터리 |
| -d | 디렉토리 자체만 나열하고 입력하지 마십시오. |
cd /var/log cd .. # 이전 레벨 cd - # 이전 디렉터리로 돌아갑니다. cd # 홈디렉토리(cd와 동일~)
mkdir -p app/src/{components,utils}
mkdir -m 700 private| -p | 재귀적으로 생성합니다. 이미 존재하는 경우 오류가 보고되지 않습니다. |
| -m | 권한 지정 |
| -v | 무엇이 생성되었는지 표시 |
touch README.md touch -d "2026-01-01" old.log # 시간 지정
cp a.txt b.txt cp -r src/ backup/ # 디렉토리에는 -r이 필요합니다. cp -a /etc/nginx ~/nginx-bak # 권한 및 시간 예약
| -r / -R | 재귀적으로 디렉터리 복사 |
| -a | 아카이브: -dR --preserve=all과 동일 |
| -i | 취재 전 물어보세요 |
| -n | 기존 파일을 덮어쓰지 않음 |
| -u | 소스가 업데이트된 경우에만 복사 |
| -v | 쇼 프로세스 |
mv old.txt new.txt # 이름 바꾸기 mv *.loglogs/ # 일괄 이동 mv -i a.txt dir/ # 덮어쓰기 전에 확인
| -i | 취재 전 물어보세요 |
| -n | 보장되지 않음 |
| -f | 포스 커버리지 |
| -v | 쇼 프로세스 |
rm file.txt rm -r build/ # 디렉토리 삭제 rm -rf node_modules # 존재하지 않는 것을 확인하거나 무시하지 마십시오.
rm은 휴지통에 들어가지 않습니다. rm -rf 전에 경로 변수를 에코하여 비어 있는지 확인합니다. rm -rf "$DIR"/은 DIR이 비어 있는 경우 rm -rf /와 같습니다.
| -r | 반복적으로 디렉터리 삭제 |
| -f | 묻지 말고 존재하지 않는다고 무시하십시오. |
| -i | 하나씩 확인해보세요 |
| -d | 빈 디렉터리 삭제 |
| -- | 다음 매개변수는 부적절한 옵션입니다(-로 시작하는 파일 삭제). |
rmdir empty-dir rmdir -p a/b/c # 빈 상위 디렉토리와 함께
ln -s /opt/app/current ~/app ln -sf new-target link # 기존 링크 덮어쓰기 readlink -f link # 링크가 가리키는 위치를 확인합니다.
find . -name "*.log"
find /var -type f -size +100M # 100MB보다 큰 파일
찾다 . -mtime -7 -name "*.js" # 7일 이내에 수정됨
find . -name "*.tmp" -delete
find . -type f -exec chmod 644 {} \;| -name / -iname | 이름별(-iname은 대소문자를 무시함) |
| -type f|d|l | 파일/디렉토리/링크 |
| -size +10M / -1k | 크기별 |
| -mtime -N / +N | N일/N일 전에 수정됨 |
| -maxdepth N | 제한 깊이 |
| -exec cmd {} \; | 각 결과에 대해 명령 실행 |
| -delete | 일치 항목 제거 |
| -empty | 빈 파일 또는 디렉터리 |
sudo updatedb locate nginx.conf
which python3 ls # bash 내장을 입력하면 별칭 / 내장 / 외부 명령을 볼 수 있습니다 command -v node # 스크립트에 명령이 존재하는지 확인
tree -L 2 tree -a -I "node_modules|.git" # 제외
file photo.bin # photo.bin: JPEG image data, ...
stat app.log stat -c "%s %n" * # 크기와 이름만
du -sh . 뒤 -sh * | 정렬 -rh | head # 가장 많은 공간을 차지하는 사람 du -h --max-depth=1 /var
| -s | 합계만 표시 |
| -h | 사람이 읽을 수 있는 |
| --max-depth=N | 제한 수준 |
| -a | 파일을 포함합니다 |
df -h df -h /home df -i # inode 사용량(파일이 너무 많은 경우 전체)
basename /var/log/syslog # syslog basename report.pdf .pdf # report dirname /var/log/syslog # /var/log
realpath ../config.yml
rsync -avz --progress src/ user@host:/srv/app/ rsync -av --delete ./dist/ /var/www/site/ # 대상에서 중복 파일도 삭제합니다. rsync -avn src/ dst/ # -n 미리보기 전용
소스 디렉터리 끝에 /가 있는지 여부는 다른 의미를 갖습니다. src/는 콘텐츠를 동기화하고 src는 디렉터리 자체를 동기화합니다.
| -a | 보관 모드(재귀 + 속성 유지) |
| -v | 쇼 프로세스 |
| -z | 전송 압축 |
| --delete | 대상 측에서 중복 파일 삭제 |
| -n / --dry-run | 미리보기만 가능 |
| --exclude=PAT | 들어오지 못하게 하다 |
| -P | 진행 + 중단점에서 재개 |
scp app.tar.gz user@1.2.3.4:/tmp/ scp -r user@host:/var/log/app ./logs scp -P 2222 file user@host:~ # 포트 지정(대문자 P)
cat config.yml cat -n app.js # 줄 번호 포함 cat a.txt b.txt > all.txt # 접합
| -n | 줄 번호 |
| -A | 보이지 않는 문자 표시(^M은 CRLF) |
| -s | 연속된 빈 줄 압축 |
less /var/log/syslog #/키워드 검색 n 다음 G에서 끝으로 g에서 시작으로 q 종료 F 따르기(tail -f와 유사)
| -N | 줄 번호 표시 |
| -S | 줄을 끊지 마십시오 |
| +F | 팔로우 모드로 들어가세요 |
| -i | 검색에서는 대소문자를 무시합니다. |
head -n 20 app.log head -c 100 file.bin # 처음 100바이트 head -n -5 파일 # 마지막 5줄 제외
tail -n 50 app.log tail -f /var/log/nginx/access.log tail -F app.log # 파일 회전 후에도 계속 따라가기
| -n N | 다음 N줄 |
| -f | 팔로우하고 추가하세요 |
| -F | 따라가서 파일 재구성을 처리하세요. |
| -n +N | N라인부터 끝까지 |
wc -l access.log ls | wc -l #디렉토리에 몇 개의 항목이 있습니까? 고양이 *.py | wc -l # 코드 줄 수
diff -u old.conf new.conf diff -r dir1 dir2 # 디렉토리 비교 diff <(sort a) <(sort b) # 정렬된 내용을 비교합니다.
| -u | 통합 형식 |
| -r | 디렉터리를 재귀적으로 비교 |
| -q | 다를 경우에만 신고하세요 |
| -w | 공백 무시 |
| -i | 대소문자 무시 |
cmp a.bin b.bin
nl -ba script.sh # 빈 줄에도 번호가 매겨져 있습니다
tac app.log | less
strings app.bin | grep -i version
xxd file.bin | head -20 xxd -r dump.txt > file.bin # 복원
nano /etc/hosts # Ctrl+O 저장 Ctrl+X 종료 Ctrl+W 검색 Ctrl+K 선 자르기
vim app.conf # :wq 저장하고 종료합니다 :q! 저장하지 않고 종료 /단어 검색 dd 줄 삭제 u undo :set nu 줄 번호
make 2>&1 | tee build.log 에코 "텍스트" | sudo tee /etc/file # 보호된 파일을 작성하려면 sudo를 사용하세요. cmd | tee -a log.txt # 추가
ls > list.txt echo "line" >> notes.txt cmd > out.log 2>&1 # 모두 기록 cmd 2>/dev/null # 오류 삭제 cmd &> all.log # bash 약어
ps aux | grep nginx cat log | grep ERROR | wc -l history | tail -20
grep -rn "TODO" src/
grep -i error app.log
grep -v "^#" nginx.conf | grep -v "^$" # 주석과 빈 줄 제거
grep -E "5[0-9]{2}" access.log # 확장 정규식
grep -l "main" *.c # 파일 이름만 나열
grep -A3 -B1 "Exception" app.log # 컨텍스트의 처음 1줄과 마지막 3줄| -r / -R | 재귀 디렉터리 |
| -n | 줄 번호 표시 |
| -i | 대소문자 무시 |
| -v | 선택 반전(패턴이 없는 행) |
| -E | 확장 정규 표현식(egrep과 동일) |
| -F | 고정 문자열로 |
| -w | 전체 단어 일치 |
| -c | 줄 수만 세어보세요 |
| -l | 일치하는 파일 이름만 나열 |
| -o | 일치하는 부분만 출력 |
| -A/-B/-C N | N 줄의 컨텍스트 이후/이전/이전 및 이후 |
| --include="*.js" | 반복 시 파일 이름 제한 |
rg "TODO" --type ts
rg -n "fetch\(" src/sed 's/foo/bar/g' a.txt # 대체 결과 출력 sed -i 's/foo/bar/g' a.txt # 파일을 직접 수정합니다(GNU) sed -i.bak 's/8080/80/' app.conf # 변경하기 전에 백업 만들기 sed 's#/usr/local#/opt#g' f # 구분 기호를 바꿀 수 있습니다.
| -i | 제자리 수정(macOS에서는 -i '' 필요) |
| -n | p 명령으로 선택한 줄만 인쇄 |
| -e | 여러 스크립트 |
| -E | 확장 정규 |
| g 플래그 | 한 줄에 모두 바꾸기 |
sed -n '10,20p' app.log # 줄 10-20 sed '5d' f.txt # 5번째 줄 삭제 sed '/^$/d' f.txt # 빈 줄 삭제 sed '3i\new line' f.txt # 3번째 라인 앞에 삽입
awk '{print $1}' access.log | 정렬 | 유니크 -c | 정렬 -rn | head # 가장 많이 방문한 IP
awk -F: '{print $1}' /etc/passwd # 사용자 이름
awk '$3 > 100 {print $0}' data.txt # 세 번째 열은 100행보다 큽니다.
awk '{sum += $2} END {print sum}' f # Sum| -F <구분자> | 필드 구분 기호(기본값은 공백) |
| $0 / $1 / $NF | 행 전체 / 첫 번째 열 / 마지막 열 |
| NR | 현재 줄 번호 |
| BEGIN{} / END{} | 시작 전/끝 후 실행 |
| /정기적인/{…} | 일치하는 행만 처리 |
cut -d, -f1,3 data.csv cut -d: -f1 /etc/passwd -c1-8 파일 #을 문자 위치별로 잘라내기
sort names.txt sort -n nums.txt # 숫자 값 기준 sort -k2 -t, -r data.csv # 2열을 기준으로 역순으로 정렬 sort -u list.txt # 중복 항목 정렬 및 제거 sort -h size.txt # K/M/G 크기에 따라
| -n | 가치로 |
| -r | 역순 |
| -k N | N열 기준 |
| -t <구분자> | 열 구분 기호 |
| -u | 중복 제거 |
| -h | 사람이 읽을 수 있는 크기 |
| -V | 버전 번호 정렬(1.2 < 1.10) |
sort words.txt | uniq -c | sort -rn .txt 정렬 | uniq -d # 중복된 항목만 표시 .txt 정렬 | uniq -u # 고유한 것만 표시
echo hello | tr a-z A-Z # HELLO tr -d '\r' < win.txt > unix.txt # CR 제거 tr -s ' ' < f # 연속된 공백을 압축합니다. 에코 $PATH | tr ':' '\n' # 한 줄에 하나씩
find . -name "*.log" | xargs rm
찾다 . -이름 "*.txt" -print0 | xargs -0 wc -l # 파일 이름에 공백이 포함되어 있습니다.
고양이 urls.txt | xargs -n1 -P4 컬 -sO # 4방향 병렬
echo a b c | xargs -I{} echo "item: {}"| -0 | NUL로 구분됨(find -print0 사용) |
| -n N | 매번 N 매개변수 전달 |
| -I {} | 공간을 차지하려면 {}를 사용하세요. |
| -P N | N 평행 |
| -r | 입력이 비어 있으면 실행하지 않음 |
paste -d, names.txt emails.txt
join -t, -1 1 -2 1 <(sort a.csv) <(sort b.csv)
cat /etc/fstab | column -t mount | column -t
echo abc | rev # cba
fold -w 80 -s long.txt # -s 공백에서 접기
iconv -f GBK -t UTF-8 gbk.txt > utf8.txt iconv -l | grep -i gb # 지원되는 인코딩 나열
dos2unix script.sh sed -i "s/\r$//" script.sh # dos2unix가 설치되지 않은 경우
curl -s https://api.github.com/repos/git/git | jq .stargazers_count jq ".items[] | .name" data.json jq -r ".[].id" list.json # -r 따옴표가 없는 원래 문자열 고양이 a.json | jq . # 서식 지정
echo "Hello" echo -e "a\tb\nc" echo $HOME echo "PATH=$PATH" >> ~/.bashrc
printf "%-10s %5d\n" name 42 printf "%.2f\n" 3.14159 printf "%s\n" *.txt # 한 줄에 하나의 파일 이름
seq 1 10 seq 0 5 100 # 단계 크기 5 for i in $(seq 1 3); do echo $i; done
echo "2^10" | bc echo "scale=3; 10/3" | bc echo "obase=16; 255" | bc # 16진수로 변환
chmod 755 script.sh # rwxr-xr-x chmod 644 file.txt # rw-r--r-- chmod 600 ~/.ssh/id_ed25519 # 자신만 읽고 쓸 수 있습니다. chmod -R 755 public/ # 재귀
| 755 | 디렉터리/실행 파일의 공통 값 |
| 644 | 일반 파일의 공통 값 |
| 600 | 개인 키 및 비밀번호 파일 |
| 700 | 개인 디렉터리(예: ~/.ssh) |
| -R | 재귀 |
chmod +x 배포.sh # 실행 파일 추가 chmod u+w,go-w file # 소유자는 쓸 수 있고 다른 사람은 쓸 수 없습니다 chmod a-x file chmod g+s shared/ # 디렉토리 setgid: 새 파일 상속 그룹
sudo chown www-data:www-data -R /var/www/site sudo chown $USER file.txt chgrp 개발자 프로젝트/ # 셔플만
umask umask 027 # 그룹은 읽기 전용이며 다른 그룹에는 권한이 없습니다
sudo apt update sudo -i # 루트 대화형 쉘로 전환 sudo -u postgres psql # 다른 사용자로 실행 스도 !! # 이전 작업을 다시 실행하려면 sudo를 사용하세요.
su - deploy 출구 # 돌아와
whoami id id 배포 # 다른 사용자 보기
sudo useradd -m -s /bin/bash deploy sudo passwd deploy sudo usermod -aG sudo 배포 # sudo 그룹에 가입
sudo usermod -aG docker $USER newgrp docker # 또는 다시 로그인하여 적용하세요.
sudo userdel -r olduser
passwd sudo passwd deploy sudo passwd -l 배포 # 계정 잠금
groups groups www-data cat /etc/group | grep docker
who w last -n 10 lastlog
ssh-keygen -t ed25519 -C "me@example.com" cat ~/.ssh/id_ed25519.pub ssh-copy-id user@host # 서버에 공개 키를 설치합니다.
ssh user@1.2.3.4 ssh -p 2222 user@host #포트 지정 ssh -i ~/.ssh/key.pem ubuntu@host ssh -L 8080:localhost:80 user@host # 포트 전달 ssh user@host "uptime" # 하나의 명령만 실행
| -p | 포트 |
| -i | 개인 키 파일 |
| -L 로컬:대상:포트 | 로컬 포트 포워딩 |
| -N | 전달만 하면 셸이 열리지 않습니다. |
| -v | 연결 문제 디버깅 |
Host prod
HostName 1.2.3.4
User deploy
Port 2222
IdentityFile ~/.ssh/prod_keyps aux | grep nginx ps -ef | grep java ps aux --sort=-%mem | head # 메모리를 가장 많이 소모하는 머리 ps -p 1234 -o pid,etime,cmd # 프로세스가 얼마나 오랫동안 실행되었습니까?
| aux | BSD 스타일: 터미널을 포함한 모든 사용자, 장황함 |
| -ef | UNIX 스타일: 상위 프로세스를 포함한 모든 프로세스 |
| --sort=-%cpu | CPU를 기준으로 역순으로 정렬 |
| -p PID | 프로세스 지정 |
| -o 필드 | 맞춤 열 |
pgrep -f "node server.js" pgrep -l nginx # 이름 포함 pkill -f "node server.js" # 찾아서 종료
top top -o %MEM top -p 1234 # 특정 프로세스만 보기
htop htop -u www-data
kill 1234 kill -9 1234 # 불순종하면 죽인다 kill -HUP 1234 # 서비스가 구성을 다시 로드하도록 합니다. kill -l # 신호 목록
| -15 / -TERM | 기본값: 일반 종료 요청 |
| -9 / -KILL | 정리할 기회도 주지 않고 강제종료 |
| -1 / -HUP | 과부하 구성에 일반적으로 사용됩니다. |
| -2 / -INT | Ctrl+C와 같음 |
| -STOP / -CONT | 일시중지/재개 |
killall node killall -9 chrome
npm run build & jobs fg %1 # Ctrl+Z는 현재 포그라운드 작업을 일시 중지한 다음 bg를 사용하여 백그라운드에서 계속합니다.
nohup python server.py > server.log 2>&1 & 에코 $! # PID가 방금 시작되었습니다
tmux new -s work # Ctrl+B를 누른 다음 d를 사용하여 분리 tmux ls tmux attach -t work tmux kill-session -t work
systemctl status nginx systemctl status --failed # 서비스 실패
sudo systemctl restart nginx sudo systemctl reload nginx # 연결을 중단하지 않고 구성을 다시 로드합니다.
sudo systemctl enable --now docker sudo systemctl disable apache2 systemctl is-enabled nginx
systemctl list-units --type=service --state=running systemctl list-unit-files | grep enabled
journalctl -u nginx -f journalctl -u app -n 200 --no-pager journalctl --since "1 hour ago" Journalctl -p err -b # 부팅 이후 오류 sudo Journalctl --vacuum-size=500M # 정리
| -u <단위> | 서비스 |
| -f | 따르다 |
| -n N | 마지막 N줄 |
| --since / --until | 시간 범위 |
| -p err | 레벨별로 필터링 |
| -b | 이번 스타트업 |
| -k | 커널 메시지 |
crontab -e # 매일 3시 30분에 백업 30 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1 # 5분마다 */5 * * * * /usr/bin/curl -s https://example.com/ping crontab -l # 보기
echo "systemctl restart app" | at 03:00 atq #대기열 atrm 3 # 삭제
watch -n 2 "df -h" watch -d free -m # -d 변경 사항 강조 표시
time ./build.sh time curl -s https://example.com > /dev/null
timeout 10 ping example.com timeout -s KILL 30 ./stuck.sh
lsof -p 1234 lsof +D /var/log # 이 디렉토리의 파일을 누가 사용하고 있습니까? 이소프 | grep delete # 삭제되었지만 점유된 파일(디스크가 해제되지 않음)
strace -p 1234 strace -f -e trace=network node app.js strace -c ./cmd # 통계
nice -n 19 tar czf big.tgz data/ renice -n 10 -p 1234
ss -tulnp ss -tlnp | grep :80 ss -s # 연결 통계 ss -tan state established
| -t / -u | TCP / UDP |
| -l | 모니터만 |
| -n | 숫자 포트가 서비스 이름을 확인하지 않습니다. |
| -p | 프로세스 표시(모두 보려면 루트가 필요함) |
| -a | 모두 연결 |
netstat -tulnp | grep 3000 netstat -an | grep ESTABLISHED | wc -l
lsof -i :8080 lsof -i tcp -sTCP:LISTEN kill -9 $(lsof -t -i :3000) # 점유자를 직접 죽이기
ip addr ip -4 -br 주소 # 합리화 호스트 이름 -I # IP만
ip route ip Route get 8.8.8.8 # 특정 주소로 가는 방법은 무엇입니까?
ping -c 4 example.com ping -i 0.2 -c 20 10.0.0.1
traceroute example.com mtr -rw example.com
컬 -I https://example.com # 응답 헤더만 읽습니다.
컬 -sS https://api.example.com/x | jq . # 자동이지만 오류를 보고합니다.
컬 -o file.zip -L https://…/file.zip # 리디렉션을 다운로드하고 따르세요.
curl -X POST -H "Content-Type: application/json" -d '{"a":1}' https://api.example.com/items
curl -u user:pass https://…
curl -w "%{http_code} %{time_total}\n" -o /dev/null -s https://example.com| -I | 요청 헤더만(HEAD) |
| -L | 리디렉션을 따르세요 |
| -o 파일 / -O | 파일에 저장/원격 파일 이름 사용 |
| -X 방법 | 요청 방법 |
| -H "헤더:값" | 요청 헤더 |
| -d 데이터 | 요청 본문(기본 POST) |
| -s / -S | 무음/오류가 있는 무음 |
| -v | 전체 상호작용 표시 |
| -k | 인증서 오류 무시(디버깅용) |
| -w 형식 | 출력 상태 코드, 시간 소비 등 |
wget https://example.com/file.tar.gz wget -c https://…/big.iso # 계속 다운로드 wget -qO- https://example.com | head # 화면에 출력 wget -r -np -nH --cut-dirs=1 https://example.com/docs/
dig example.com dig +short example.com dig MX example.com dig @8.8.8.8 example.com # DNS 지정 dig -x 93.184.216.34 # 역방향 검사
nslookup example.com nslookup -type=txt example.com
host example.com
sudo nano /etc/hosts 127.0.0.1 dev.example.com
nc -zv example.com 443 nc -l 8080 # 8080 모니터 에코 "안녕하세요" | nc 호스트 8080 # 데이터 보내기
telnet smtp.example.com 25
sudo ufw status sudo ufw allow 22 sudo ufw allow 80/tcp sudo ufw allow from 10.0.0.0/8 to any port 5432 sudo ufw enable
22를 열기 전에 릴리스해야 합니다. 그렇지 않으면 SSH가 자동으로 잠깁니다.
sudo firewall-cmd --list-all sudo firewall-cmd --add-port=8080/tcp --permanent sudo firewall-cmd --reload
sudo iptables -L -n -v --line-numbers sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
sudo tcpdump -i eth0 port 80 -nn sudo tcpdump -i any 호스트 10.0.0.5 -w cap.pcap # 파일을 Wireshark에 저장
sudo iftop -i eth0 nload
ip neigh arp -a
tar -czvf site.tar.gz site/ tar -czf logs.tgz --exclude="*.tmp" logs/ tar -cJvf site.tar.xz site/ # xz는 더 작고 느리게 압축합니다.
| -c | 만들다 |
| -x | 풀다 |
| -t | 목록 내용 |
| -z / -j / -J | gzip / bzip2 / xz |
| -v | 파일 표시 |
| -f 파일 | 아카이브 파일 이름(파일 이름을 따라야 함) |
| -C 디렉토리 | 디렉토리로 전환한 후 조작하세요. |
| --exclude=PAT | 들어오지 못하게 하다 |
tar -xzvf site.tar.gz tar -xzvf site.tar.gz -C /var/www/ tar -xf any.tar.* # 새 버전의 tar는 자동으로 압축 형식을 인식합니다. tar -tzvf site.tar.gz # 먼저 내용을 살펴보겠습니다.
gzip big.log # big.log.gz 가져오기 gzip -k big.log # 원본 파일 유지 gunzip big.log.gz zcat big.log.gz | grep ERROR # 압축을 풀지 않고 직접 보기
zip -r project.zip project/ -x "*/node_modules/*" zip -e secret.zip file.txt # 암호화
unzip archive.zip unzip archive.zip -d out/ unzip -l archive.zip # 목록만 보기 unzip -O gbk cn.zip # Windows 중국어 파일 이름이 깨졌을 때
7z x archive.7z 7z a -mx9 out.7z dir/ 7z x file.rar
xz -9 big.sql xz -d big.sql.xz bzip2 -k file
split -b 100M big.iso part_ cat part_* > big.iso
sha256sum ubuntu.iso sha256sum -c SHA256SUMS md5sum file.zip
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress && sync dd if=/dev/zero of=test.bin bs=1M count=100 # 100MB 테스트 파일
of= 잘못된 장치를 쓰면 디스크가 직접 지워집니다. 실행하기 전에 lsblk를 세 번 확인하십시오.
uname -a uname -m # x86_64 / aarch64 cat /etc/os-release # 릴리스 버전
hostnamectl sudo hostnamectl set-hostname web-01
uptime # 로드 > CPU 코어 수(nproc)는 대기 중임을 나타냅니다.
free -h free -m -s 2 # 2초마다 새로 고침
nproc lscpu | grep -E "Model name|^CPU\(s\)"
lsblk lsblk -f # 파일 시스템 및 UUID 포함 sudo fdisk -l
sudo mount /dev/sdb1 /mnt/usb sudo umount /mnt/usb 마운트 | 컬럼 -t # 마운트됨 cat /etc/fstab # 부팅 시 자동으로 마운트
vmstat 1 10
iostat -x 1 5
sudo dmesg -T | tail -50 sudo dmesg -T | grep -i "killed process" # OOM된 사람은 누구입니까?
env | sort printenv HOME echo $PATH | tr ":" "\n"
export JAVA_HOME=/usr/lib/jvm/java-17 export PATH="$HOME/.local/bin:$PATH" echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc
alias ll="ls -alF" alias gs="git status" unalias ll 별칭 # 목록
history | grep ssh !105 sudo !! 역사 -c # 지우기
sudo apt update && sudo apt upgrade sudo apt install htop apt search nginx apt show nginx sudo apt remove --purge pkg && sudo apt autoremove
| update | 소프트웨어 소스 인덱스 새로 고침 |
| upgrade | 설치된 패키지 업그레이드 |
| install / remove | 설치/제거 |
| search / show | 검색 / 상세 |
| autoremove | 더 이상 필요하지 않은 종속성 정리 |
| list --installed | 설치된 목록 |
sudo dnf install -y git sudo dnf update dnf search nginx sudo yum install epel-release # 기존 시스템
sudo pacman -Syu sudo pacman -S neovim pacman -Ss keyword sudo pacman -Rns pkg
brew install jq brew upgrade brew list brew search ripgrep
sudo snap install code --classic snap list
sudo dpkg -i app.deb sudo apt -f install dpkg -l | grep nginx dpkg -L nginx #어떤 파일이 패키지되어 있나요?
sudo shutdown -h now sudo reboot sudo shutdown -r +10 "10분 후에 유지 관리 다시 시작" sudo shutdown -c # 취소
date date "+%Y-%m-%d %H:%M:%S" date -d "yesterday" +%F 날짜 +%s # 타임스탬프 date -d @1700000000 # 타임스탬프를 날짜로 변환
timedatectl sudo timedatectl set-timezone Asia/Shanghai timedatectl list-timezones | grep Asia
cal cal 2026 cal -3 # 1개월 전후
lsmod | grep nvidia sudo modprobe br_netfilter
lspci | grep -i vga lsusb
ulimit -n ulimit -n 65535 # 현재 세션 cat /proc/sys/fs/file-max
chsh -s $(which zsh) echo $SHELL
source ~/.bashrc . ~/.zshrc # 동의어
#!/usr/bin/env bash set -euo Pipefail # 오류 시 중지, 정의되지 않은 변수 오류, 파이프 오류 전송 for f in *.log; do 에코 "프로세스 $f" done
man tar man 5 crontab # 섹션 5: 파일 형식 tar --help | less tldr tar # 커뮤니티 샘플 버전(설치 필요)
메모리에서 동작하는 작은 파일 시스템과 Shell 인터프리터입니다. ls / cd / cat / grep / sed / awk / find / chmod / tar 등 60개 이상의 명령어를 지원하며 파이프, 리디렉션, 와일드카드도 사용할 수 있습니다. 8개 단계는 “디렉터리 구조 만들기”부터 “파이프로 집계”까지입니다. 네트워크에 연결하지 않고 실제 파일도 건드리지 않습니다. Git 연습은Git 명령어 모음.