[Linux] Shell Script 정리 (작성중)

beaver.zip·2024년 9월 13일
1
post-custom-banner

Linux

  • 서버에서 자주 사용하는 OS로, 안정성 및 신뢰성이 높다.
  • 쉘 커맨드/스크립트는 자주 쓰는 것 위주로 학습하고, 필요한 코드는 구글링하자.

Shell

= 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 터미널/콘솔

  • sh: 최초의 쉘
  • bash: Linux 표준 쉘
  • zsh: Mac OS 카탈리나 이후 기본 쉘

Shell Commands

man

  • Shell Command의 매뉴얼 문서를 보고 싶은 경우
  • e.g. man python3

mkdir

  • MaKe DIRectory; 새 폴더 생성
  • e.g. mkdir beaver

ls

  • List Segments; 폴더 내 파일 목록을 출력
    - -a all; 전체 파일 출력
    - -l long; 권한, 소유자, 생성일, 용량 등을 길게 출력
    - -h human-readable; 사람이 읽기 쉽도록 용량을 GB, MB 등 표현
  • e.g. ls / ls ~ / ls -al / ls -lh

pwd

  • Print Working Directory; 현재 폴더 경로를 절대 경로로 보여줌
  • e.g. pwd

cd

  • Change Directory; 폴더 이동하기
  • e.g. cd beaver

echo

  • 터미널에 텍스트 출력 (Python의 print와 유사)
  • e.g. echo "hi"
  • echo `command`: command 결과 출력
  • e.g. echo `pwd`

cp

  • CoPy; 파일 또는 폴더 복사
    - -r recursive; 폴더 복사 시, 폴더 안에 파일이 있으면 재귀적으로 모두 복사
    - -f force; 강제로 복사
  • e.g. cp beaver1.zip beaver2.zip

vi

  • vim 편집기로 파일 생성 및 수정
  • e.g. vi beaver.sh
i (Insert Mode)
ESC (Command Mode)
: (Last Line Mode)
 현재 파일명으로 저장
	- q: 종료(저장 X)
	- q!: 강제 종료(! = 강제)
	- wq: 저장 후 종료
	- /문자: 문자 탐색 (n = 계속 탐색)
	- set nu: vi 라인 번호 출력
  • 삭제
    - dd: 현재 줄 삭제
    - x: 커서 위치의 글자 1개 삭제 (5x: 글자 5개 삭제)
  • 복사
    - yy: 현재 줄 복사
    - p: 현재 줄 바로 아래에 붙여넣기
  • 이동
    - k: 위 / j: 아래 / h: 왼쪽 / l: 오른쪽 (혹은 방향키로 이동)

bash

  • Shell Script 실행
  • e.g. bash beaver.sh

sudo

  • SUperuser DO; 커맨드를 슈퍼 유저(최고 권한, 관리자 권한)으로 실행
  • e.g. sudo rm 1.sh

mv

  • MoVe; 파일 또는 폴더 이동 or 이름 변경
  • e.g. mv beaver1.sh beaver2.sh

cat

  • conCATenate; 특정 파일 내용 출력
  • 여러 파일을 인자로 주면 합쳐서(concat) 출력
    - e.g. cat beaver1.sh beaver2.sh
  • 파일에 저장(OVERWRITE)하고 싶은 경우
    - e.g. cat beaver1.sh beaver2.sh **>** beaver3.sh
  • 파일에 추가(APPEND)하고 싶은 경우
    - e.g. cat beaver1.sh beaver2.sh **>>** beaver3.sh

clear

  • 터미널 창을 깨끗하게 해줌

history

  • 최근에 입력한 쉘 커맨드 history 출력
  • !숫자: 해당 커맨드 재이용 가능
  • e.g. history -> !1004

find

  • 파일 및 디렉토리를 검색할 때 사용
  • find -name "file": 현재 폴더에서, file이라는 이름을 가지는 파일 및 폴더 검색

export

  • 환경 변수를 설정할 때 사용
  • e.g. export water="물" // 주의: 띄어쓰면 안됨. Shell에선 붙여서 써야 함.)
  • echo $water // "물" 출력
  • 주의: export로 환경 변수를 설정한 경우, 터미널이 꺼지면 사라지게 됨.
  • 환경 변수를 영구적으로 저장하고 싶다면 .bashrc, .zshrc (Shell에 따라 다름)에 저장
  • e.g. vi ~/.zshrc 실행 -> 맨 마지막 줄에 export water="물" 입력-> :wq로 저장
    -> 이후 재로그인 하거나 source ~/zshrc 사용 시 적용 완료

alias

  • 기본 명령어의 별칭 설정 가능
  • 터미널에 alias 입력 시 현재 설정된 별칭 확인 가능
  • e.g. alias ll2='ls -l'

tree

  • 설치 필요: apt-get install tree
  • 폴더의 하위 구조를 계층적으로 표현 -> 폴더 구조 설명에 유용
  • e.g. tree -L 2: 2단계까지 보여줌

head, tail

  • 파일의 앞/뒤 n행 출력
  • pandas.DataFrame의 head, tail과 유사
  • e.g. head -n 3 beaver.sh

sort

  • 행 단위 정렬
    - -r 내림차순 정렬(default: 오름차순)
    - -n Numeric Sort(숫자 정렬)
  • e.g. cat fruits.txt | sort -r // fruits.txt의 결과를 내림차순 정렬

uniq

  • 중복된 행이 연속으로 있는 경우 중복 제거
  • sort와 함께 사용 가능
  • e.g. cat fruits.txt | uniq
  • e.g. cat fruits.txt | sort | uniq | wc -l // 중복 제거한 결과가 몇 줄인지 출력

grep

  • 파일에 주어진 패턴 목록과 매칭되는 라인 검색
    -grep 옵션 패턴 파일명
    - -i 대소문자 구분 없이 찾기
    - -w 정확히 그 단어만 찾기
    - -v 특정 패턴 제외한 결과 출력
    - -E 정규 표현식 사용

cut

  • 파일에서 특정 필드 추출
    - -f 잘라낼 필드 지정
    - -d 필드 구분자 (default: \t)

awk

  • 텍스트 처리 도구
  • awk 'pattern {action}' input_file
    - pattern 특정 패턴을 지정
    - action 선택된 줄에 대해 수행할 동작
    - $1, $2 첫번째 필드, 두번째 필드
    - -F 구분자
  • e.g. awk -F: '{print $1}' cut_file

Redirection & Pipe

표준 스트림(Stream)
![[Pasted image 20240911040753.png]]

  • Unix에서 동작하는 프로그램은 커맨드 실행 시 3개의 stream 생성
  • stdin: 0으로 표현, 입력
  • stdout: 1로 표현, 출력
  • stderr: 2로 표현, 디버깅 정보 or 에러

Redirection

  • 프로그램의 출력(stdout)을 다른 파일이나 스트림에 전달
  • : 덮어쓰기(Overwite); 파일이 없으면 생성 및 저장

  • : 맨 아래에 추가(Append)

  • e.g.
echo "hi" > test.sh // test.sh 생성해 "hi" 저장(Overwrite)
echo "bye" > test.sh // test.sh의 맨 아래에 "bye" 추가(Append)
python train.py > log_file 2>&1 & // 에러 메시지가 log_file에 저장됨
// 2>&!: 표준 에러(stderr, 2)를 표준 출력(stdout, 1)으로 redirect
// &:백그라운드에서 실행

Pipe

  • 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
  • A의 Output을 B의 Input으로 사용
  • e.g. ls | grep "vi" > output.txt // 현재 폴더에서, 파일명에 vi가 들어간 파일 찾아 output.txt에 저장
  • e.g. history | grep "echo" // 최근 입력한 커맨드 중 echo가 들어간 명령어 찾기

서버에서 자주 쓰는 쉘 커맨드

ps

  • Process Status; 현재 실행되고 있는 프로세스 출력
  • 실행 중인 PID(Process ID)를 찾기 위해 사용
    - -e: 모든 프로세스
    - -f: full format으로 자세히 보여줌

curl

  • Client URL; Command Line 기반의 Data Transfer 커맨드

  • Request를 테스트할 수 있는 명령어

  • e.g. curl -X localhost:5000/ {data}

  • 웹 서버 작성 후 요청이 제대로 실행되는지 확인 가능

  • 더 가독성있게 출력하는 httpie도 있음

  • 회사에선 Postman도 활용

df

  • Disk Free; 현재 사용 중인 디스크 용량 확인
    - -h: 사람이 읽기 쉬운 형태로 출력
  • 실제 현업에서 Disk 용량이 100% 차서 서비스가 멈추는 경우가 있음.

ssh

  • 안전하게(데이터가 모두 암호화) 원격으로 컴퓨터에 접속하고 명령을 실행할 수 있는 프로토콜
  • ssh port: 22
    [Pasted image 20240911042909.png]
  • ssh 사용 이유
    1. 보안
    - 클라이언트/서버의 통신을 암호화해서 데이터를 안전하게 전송
    - 도청과 같은 보안 위협으로부터 데이터 보호
    2. 원격 접속
    - 물리적으로 떨어진 서버(예: 서버실, 클라우드 서버)에 접속 가능
    3. 터널링(포트 포워딩) 기능
  • e.g.
usage: ssh -i /path/to/private-key.pem username@hostname(ip) -p 포트번호

ssh -i beaver.pem root@okcomputer -p 30952
// beaver.pem Key를 사용해 okcomputer의 30952 포트에 root로 접속
  • ssh의 터널링
    - 터널링 = 방화벽 등으로 인해 직접 접근이 제한될 경우, 안전한 터널을 통해
    - ![[Pasted image 20240911045523.png]]
    - e.g. ssh -L 8080:localhost:30952 사용자명@ssh_서버

scp

  • Secure Copy; SSH를 이용해 네트워크로 연결된 호스트 간 파일 전송
    - -r: 재귀적으로 복사
    - -P: ssh 포트 지정
    - -i: ssh 설정을 활용해 실행
  • (local => remote) scp local_path user@ip:remote_directory
  • (remote => local) scp user@ip:remote_directory local_path
  • (remote=>remote) scp user@ip:remote_directory user2@ip2:target_remote_directory

nohup

  • 터미널 종료 후에도 계속 작업이 유지되도록 실행 (백그라운드 실행)
  • e.g. nohup python3 app.py &
  • nohup으로 실행된 파일은 permission이 755여야 함
  • 종료: ps ef | grep app .py -> pid 찾은 후 kill -9 pid
  • 로그는 nohup.out에 저장됨
  • nohup 외에 screen이란 도구도 있음

chmod

  • Change Mode; 파일의 권한 변경
  • Unix에서 파일이나 폴더의 시스템 모드를 변경
  • ls -al(혹은 ll)로 권한 확인 가능
    - 소유자 / 그룹 / 기타 사용자
    - r: read(읽기), 4
    - w: write(쓰기), 2
    - x: excute(실행), 1
    - -: denied
  • e.g. chmod 755 beaver.sh // 파일의 permision을 755로 변경
  • 755 = rwx r-x r-x // 소유자 7, 그룹 5, 기타 사용자 5

python

Shell Script

  • Shell Command의 조합

  • .sh 파일에 생성, bash [filename].sh로 실행

  • #!/bin/bash Shebang; 이 스크립트를 Bash shell로 해석

  • 인자
    - $1, $2, $3: 1, 2, 3번째 인수를 참조
    - $#: 변수를 사용해 전달된 인수의 개수 확인
    - $@: 모든 변수에 접근

  • 함수
    - python처럼 함수 정의 및 사용 가능
    - 사용: 함수명+인자
    - 변수 할당: 변수=$(함수명+인자)

# 함수 정의
function add_numbers {
	local result=$(($1+$2))
	echo $result
}

# 함수 호출
sum=$(add_numbers 10 20)
echo "두 수의 합: $sum"
  • 조건문
    - python처럼 if, while, case문이 존재
    - python처럼 \==, !=, &&, || 연산자 사용 가능
  • 파일 관련 조건문
    - -e exist; 파일 존재 여부 확인
    - -f file; 파일 여부 확인
    - -d directory; 디렉토리 여부 확인
    - -r readable; 읽기 여부 확인

Shell Script 활용하기

  • Python이 설치되어 있지 않은 경우 유용함.
  • script성으로 실행할 수 있는 것들
    - e.g. 모델 학습 시, 여러 파라미터를 정의해 순차적으로 학습하는 script
    - e.g. 로그 파일 분석, 데이터 전처리
  • 서버를 잘 다루기 위해선 쉘 커맨드, 쉘 스크립트에 대해 알아야 함.
  • 여러 명령어가 존재함을 알아두고, 필요할 때 검색해서 쓰자.
  • grep, awk, cut 등을 사용해 Python 없이 데이터 처리가 가능
  • 쉘 스크립트로 모델 학습, 백그라운드 실행, 로그 파일 구성하는 task는 현업에서 많이 진행
profile
NLP 일짱이 되겠다.
post-custom-banner

0개의 댓글