# 디렉토리 이동
cd {path} # 기본
cd ~ # 홈 디렉토리로 이동
cd - # 직전 위치로 이동
# 현재 경로 확인
pwd
# 현재 위치 파일/디렉토리 리스트
ls # 기본
ls -l # 현재 위치 파일/디렉토리 리스트 자세히
ls -hl # 현재 위치 파일/디렉토리 리스트 자세히 + 사람이 보기 쉽게 (용량 표기 보기 쉽게)
# 디스크 Filesystem 확인
df # 기본
df -h # 용량 표기 보기 쉽게
du # 기본
du -h # 용량 표기 보기 쉽게
du -s # 현재 디렉토리의 전체 사용량
du --max-depth=N # 하위 디렉토릭까지 표시 (1이면 현재 디렉토리)
du -h --max-depth=1 # 현재 디렉토리의 용량들 보기
# 켜져있는 시간
uptime # 기본
uptime -p # 사람이 읽기 쉬운 형식으로 가동 시간만 확인
uptime -s # 시스템이 언제 부팅되었는지 확인
# UTC기준 현재 시스템 시간 출력
date
# 타임존과 시간 확인
timedatectl
# 타임존을 서울로 변경
sudo timedatectl set-timezone Asia/Seoul
# 현재 프로세스 보기
top # 기본
htop # 컬러모드. 별도 설치 필요
# 프로세스 정보
ps # 사용자와 관련된 프로세스 출력
ps -ef # 전체 시스템에서 실행한 프로세스 정보
ps -ef | grep {KEYWORD} # 전체 시스템에서 실행한 프로세스 중 KEYWORD가 들어있는 리스트 출력
# 프로세스 정렬 및 상위 10개 추출
# ps -eo ...: 사용자가 지정한 형식(-o)으로 모든 프로세스(-e) 정보를 출력
# pid,cmd,%cpu: 프로세스 ID, 명령어, CPU 사용률 등 보고 싶은 정보
# --sort=-%cpu: CPU 사용량을 기준으로 내림차순 정렬 (-가 내림차순)
# | head: 결과를 상위 10개 라인만 보여줌
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
# 포트 찾기
lsof -i :{PORT} # PORT 찾기
# PID 찾기
pgrep {KEYWORD} # KEYWOR가 들어간 프로세스 PID 리스트
# 프로세스 죽이기
pkill {PROCESS_NAME} # PROCESS_NAME 죽이기
pkill -f {KEYWORD} # KEYWORD가 들어간 프로세스 죽이기
# 백그라운드 실행 프로세스 검색
jobs
# PID 죽이기
sudo kill {PID} # 기본값 -15로 사용됨
sudo kill -9 {PID} # 강제로 죽이기
sudo kill -9 $(pgrep KEYWORD) # KEYWORD에 관련된 PID 죽이기
# 인터페이스 확인
ifconfig
# 다른 서버 쉘
# options
# -p {PORT} : 포트
# -i {PEM_PATH} : 키파일로 접속하는 경우
# -L {LOCAL_PORT:TARGET_IP:TARGET_PORT}: 로컬 포트포워딩 규칙 (터널링)
# -f : SSH 실행 직후 백그라운드로 이동
# -N : 명령 실행 없이 포트포워딩만 수행
# -n : stdin 무시(백그라운드 실행 시 필요)
# -T : 터미널 할당 없음(포워딩만 수행)
ssh 사용자이름@[IP 또는 도메인] -p 22
# 예시 (쉘 접속)
ssh -i key.pem ec2-user@127.0.0.1 -p 22
# 터널링
# 외부 pc에서 (zsh를 사용한다면 bash로 변경)
# 연결 성공시, localhost:[출력 PORT] 로 접속 가능
ssh 사용자이름@[HostName] -NnT -L [로컬 PORT]:[목적지 IP]:[목적지 PORT]
# 압축
tar -czvf FILENAME.tar.gz # 현재 경로 + 압축
tar -czvf FILENAME.tar.gz {PATH} # 지정된 경로 + 압축
# 압축 해제
tar -xzvf FILENAME.tar.gz # 현재 경로 + 압축
tar -xzvf FILENAME.tar.gz {PATH} # 지정된 경로 + 압축
# 분할 압축 (1024MB 예시)
tar -czvf - {PATH} | split -b 1024m - {NEW_FILENAME}
#분할 압축 해제
cat FILENAME.tar.gz* | tar xvzf -
# alias 저장
# ~/.bash_profile 편집해서 추가
vi ~/.bash_profile
# 아래 양식으로 내용 작성
alias {command}='명령어'
# ex) alias cmd='sh /home/ec2-user/run.sh'
# alias 적용 (필수)
source ~/.bash_profile
# 파일 그대로 출력
cat 경로
# 파일 처음 기준 출력
head {FILE_PATH} # 첫 10줄 표기
# 파일의 마지막 기준 출력
# options
# -f : 실시간 출력
# -n : 숫자 입력시, 지정된 라인수만큼 내용 출력
# -v : 파일 헤더와 이름 출력. 여러 파일을 동시에 할 경우 기본값
# -q : 파일 헤더와 이름 미출력. 단일 파일을 할 경우 기본값
tail {FILE_PATH} # 마지막 10줄 표기
# 포함하는 단어 검색
grep {KEYWORD}
# 기본적으로 정규식으로 문구가 사용됨
# options
# -i : 대소문자 구분 없이 검색
# -v : 해당 패턴과 일치하지 않는 줄을 출력
# -n : 줄 번호와 같이 출력
# -w : 단어 단위로 문자열 검색
# -E : 확장 정규표현식 사용 (메타문자에 따로 escape 처리 하지 않아도 됨)
# -F : 정규표현식 사용하지 않음
tail {FILE_PATH} | grep {KEYWORD}
# 예시
tail -f access.log # 실시간 출력
tail -f {FILE_PATH} | grep {KEYWORD} # KEYWORD가 포함된 줄만 실시간 출력
tail -f {FILE_PATH} | grep -i {KEYWORD} # KEYWORD가 포함된 줄만 대소문자 구분 없이 실시간 출력
tail -f {FILE_PATH} | grep -in {KEYWORD} # KEYWORD가 포함된 줄만 대소문자 구분 없이 줄번호와 같이 실시간 출력
# 동일한 라인 중복 제거하여 출력
uniq # 기본
uniq -c # 같은 라인이 몇번 나오는지 카운팅
uniq -u # 반복되지 않은 행만 출력
uniq -d # 반복된 행만 출력
uniq -i # 대소문자 구별하지 않고 정렬
# 예시
cat {FILE_PATH} | uniq -c
# 정렬
# 글자 기준으로 정렬한다. a...z순
sort # 기본. a-z순
sort -f # 대소문자 구별 없이
sort -r # 역순. z-a순
# 예시
cat {FILE_PATH} | sort | uniq -c # FILE_PATH 읽으면서 정렬하고, 중복 제거하고, 반복된 수 행 표시
# 글자 카운팅
wc -c {FILE_PATH} # byte 수
wc -m {FILE_PATH} # 문자 수
wc -l {FILE_PATH} # 줄 수
wc -L {FILE_PATH} # 가장 긴 줄의 길이
wc -w {FILE_PATH} # 단어 수
# no hang up의 줄임말, 실행시 nohup.out 파일 생성. 터머닐 종료시 종료될 수 있음.
# > /dev/null : 출력되는 모든 내용을 버려서 화면이 어지러워지는 것을 방지
# & : 프로세스를 백그라운드에서 실행
nohup {EXECUTE_COMMAND} # 기본
nohup {EXECUTE_COMMAND} & # 출력 내용 유지하면서 백그라운드 유지
nohup {EXECUTE_COMMAND} > dev/null & # 출력 내용 모두 버리면서 백그라운드 유지
# 예시 (jar파일 실행)
nohup java NAME.jar & # 출력 내용 유지하면서 백그라운드 유지
nohup java NAME.jar > dev/null & # 출력 내용 모두 버리면서 백그라운드 유지
# 기본
awk '패턴 { 액션 }' 파일명
ex) awk '{ print $1 }' file.txt # 첫 번째 컬럼 프린트
# 특정 컬럼 출력
awk '{ print $1, $3 }' file.txt
# 컬럼 개수 출력
awk '{ print NF }' file.txt
# 마지막 컬럼 출력
awk '{ print $NF }' file.txt
# 특정 문자열 포함한 라인만 출력
awk '/error/ { print }' access.log
# 특정 숫자 조건 필터링
awk '$3 > 100 { print $0 }' data.txt
# 두 조건 조합 (AND/OR)
awk '$2 == "200" && $3 > 100 { print }' access.log
# 헤더 출력, 끝에 요약 출력 (BEGIN/END)
awk 'BEGIN { print "Start" } { print $1 } END { print "Done" }' file.txt
# 콤마 구분 CSV처리
awk -F',' '{ print $2 }' data.csv
# 출력 구분자 변경
awk -F',' 'BEGIN {OFS=" | "} { print $1, $3 }' data.csv
# 특정 컬럼 합계
awk '{ sum += $3 } END { print sum }' file.txt
# 평균 계산
awk '{ sum += $2; count++ } END { print sum/count }' data.txt
# 특정 컬럼 치환
awk '{ gsub("apple", "banana"); print }' file.txt
# 전체 컬럼 합쳐서 출력
awk '{ print $1 ":" $2 ":" $3 }' file.txt
# Nginx 로그에서 IP만 뽑기
awk '{ print $1 }' access.log
# 404 발생 횟수 세기
awk '$9 == 404 { count++ } END { print count }' access.log
# 요청 건수 상위 10 IP
awk '{cnt[$1]++} END {for (ip in cnt) print cnt[ip], ip}' access.log | sort -nr | head
# 컬럼 값 기준 합계
# 예: 상품ID 별 매출 합계
awk '{ sum[$1] += $3 } END { for (id in sum) print id, sum[id] }' sales.txt
# JSON 흉내 출력
awk -F',' '{ print "{\"name\":\"" $1 "\", \"age\":" $2 "}" }' people.csv
# ps 결과에서 메모리 상위 5개
ps aux | awk '{print $4, $11}' | sort -nr | head -5
# 디스크 사용량만 출력
df -h | awk 'NR>1 {print $1, $5}'