자주 쓰는 명령어
Note

<>: 필수값, (): 선택값

디렉토리

sh
# 디렉토리 이동 cd <FILE_PATH> # 기본 cd ~ # 홈 디렉토리로 이동 cd - # 직전 위치로 이동 # 현재 경로 확인 pwd # 현재 위치 파일/디렉토리 리스트 ls # 기본 ls -l # 리스트 자세히 ls -hl # 리스트 자세히 + 용량 표기 보기 쉽게 ls -ahl # 리스트 자세히 + 용량 표기 보기 쉽게 + 숨겨진 정보

시스템

sh
# 디스크 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 # date 포맷팅 date "+%Y-%m-%d %H:%M:%S" # 오늘 yyyy-MM-DD HH:mm:ss date "+%F %T" # 오늘 yyyy-MM-DD HH:mm:ss date -d "yesterday" "+%Y-%m-%d" # 어제 # 타임존 변경 없이 임시로 특정 타임존 변환해서 보고 싶을 때 TZ=Asia/Seoul date TZ=Asia/Seoul date "+%Y-%m-%d" # 포맷팅 TZ=Asia/Seoul date -d "yesterday" "+%Y-%m-%d" # 포맷팅 $(TZ=Asia/Seoul date -d "yesterday" +%Y-%m-%d)

프로세스

sh
# 현재 프로세스 보기 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 죽이기 # IO 상태 확인 iostat # 프로세스 콜 확인 ()는 선택, <>는 필수 strace (OPTIONS) <COMMAND> # options # -ff : child 프로세스들도 추적해준다. 각 프로세스별로 결과가 저장된다. # -f : child 프로세스들도 추적해준다. 결과가 하나의 파일로 저장된다. # -tt : 타임스탬프 us 단위로 출력. # -r : 각 시스템콜에 소요된 시간을 출력해준다. # -e : 특정 시스템콜 필터링 추적. 없으면 모두 출력. 반대로 특정 시스템콜들만 제외하고 싶다면 -e trace=\!openat,close 로 설정 # -o : 결과를 파일로 저장한다. (지정하지 않으만면 표준 에러로 터미널에 나타난다. 2> 를 이용해 리다이렉션이 가능하다) # -p : 특정 pid 추적 # -c : 시스템 콜 통계 출력 strace -o trace.log ls # ls 명령어 추적 후 trace.log에 저장

네트워크

sh
# 인터페이스 확인 ifconfig # 다른 서버 쉘 접속 ssh 사용자이름@<IP|DOMAIN> -p 22 # options # -p 포트 # -i : 키파일로 접속하는 경우 # -f : SSH 실행 직후 백그라운드로 이동 # -N : 명령 실행 없이 포트포워딩만 수행 # -n : stdin 무시(백그라운드 실행 시 필요) # -T : 터미널 할당 없음(포워딩만 수행) # -L : 로컬 포트포워딩 규칙 ssh -i key.pem ec2-user@127.0.0.1 -p 22 # 터널링 # 외부 pc에서 (zsh를 사용한다면 bash로 변경) # 연결 성공시, localhost:[출력 PORT] 로 접속 가능 ssh 사용자이름@<HOST> -NnT -L <LOCAL PORT>:<TARGET IP>:<TARGET PORT> # 도메인 소유자 whois <DOJMAIN> # NS IP 찾기 nslookup <DOJMAIN> # DNS 정보 찾기 ## ()는 선택 사항, <>는 필수사항 dig (@IP) <DOMAIN> (Q-TYPE) (Q-OPTION) # @IP: 특정 네임서버를 통해 DNS 조회. 생략시 /etc/resolv.conf에 등록된 네임서버를 이용 # 타입 종류 # A : IPv4 # AAAA : IPv6 # MX : 메일서버 # NS : 네임서버 # SOA : 권한 시작 지점 # TXT : 텍스트 정보 # ANY : 모든 레코드 # 옵션 종류 # +short : 간단한 결과 출력 # +trace : DNS 조회 과정 추적 # +dnssec : DNSSEC 정보 포함 # +tcp : TCP 프로토콜 사용 # -x : 역방향 조회 (IP to 도메인) # -p : 특정 포트로 쿼리 # 네트워크 상태 확인 ss -tnlp netstat -tnlp # options # -a, --all: 모든 소켓 정보 표시 # -t, --tcp: TCP 소켓 정보 표시 # -u, --udp: UDP 소켓 정보 표시 # -n, --numeric: 주소 및 포트를 숫자로 표시 # -p, --processes: 소켓을 사용 중인 프로세스 정보 표시 # -l, --listening: 리스닝 소켓 정보 표시 # -r, --resolve: 주소 및 포트를 호스트 이름 및 서비스 이름으로 변환

압축

sh
# 압축 ## 현재 경로 tar -cvf <FILENAME>.tar tar -czvf <FILENAME>.tar.gz ## 경로 지정 tar -cvf <FILENAME>.tar <TARGET_PATH> tar -czvf <FILENAME>.tar.gz <TARGET_PATH> # 압축 해제 ## 현재 경로 tar -xvf <FILENAME>.tar tar -xzvf <FILENAME>.tar.gz ## 경로 지정 tar -xvf <FILENAME>.tar <TARGET_PATH> tar -xzvf <FILENAME>.tar.gz <TARGET_PATH> # 분할 압축 (1024MB 예시) tar -czvf - <TARGET_PATH> | split -b 1024m - <분할된 파일명.tar.> #분할 압축 해제 cat <FILENAME>.tar.gz* | tar xvzf -

alias

sh
# alias 저장 # ~/.bash_profile 편집해서 추가 vi ~/.bash_profile # 아래 양식으로 내용 작성 alias <command>='명령어' # ex) alias cmd='sh /home/ec2-user/run.sh' # alias 적용 source ~/.bash_profile

파일 관련

sh
# 파일 그대로 출력 cat <FILE_PATH> cat /dev/null > <FILE_PATH> # 해당 파일을 빈 값으로 만들기 # 파일 처음 기준 출력 head <FILE_PATH> # 첫 10줄 표기 # 파일의 마지막 기준 출력 # options # -f : 실시간 출력 # -n : 숫자 입력시, 지정된 라인수만큼 내용 출력 # -v : 파일 헤더와 이름 출력. 여러 파일을 동시에 할 경우 기본값 # -q : 파일 헤더와 이름 미출력. 단일 파일을 할 경우 기본값 tail <FILE_PATH> # 마지막 10줄 표기 tail -100f <FILE_PATH> # 마지막 100줄 표기 후 실시간 출력 # 포함하는 단어 검색 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> # 단어 수

실행 관련

sh
# no hang up의 줄임말, 실행시 nohup.out 파일 생성. 터머닐 종료시 종료될 수 있음. # > /dev/null : 출력되는 모든 내용을 버려서 화면이 어지러워지는 것을 방지 # & : 프로세스를 백그라운드에서 실행 nohup <COMMAND> # 기본 nohup <COMMAND> & # 출력 내용 유지하면서 백그라운드 유지 nohup <COMMAND> > dev/null & # 출력 내용 모두 버리면서 백그라운드 유지 # 예시 (jar파일 실행) nohup java <NAME>.jar & # 출력 내용 유지하면서 백그라운드 유지 nohup java <NAME>.jar > dev/null & # 출력 내용 모두 버리면서 백그라운드 유지

DIFF

sh
# Linux ## diff 생성 diff -u old_file.c new_file.c > changes.patch ## 적용 patch -p1 < changes.patch # Git 이용 ## diff 생성 git diff > changes.patch ## 적용 git apply changes.patch

awk 자주 쓰는 패턴

sh
# 기본 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}'