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

beaver.zip·2024년 9월 13일
0

Linux

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

Shell Command

쉘이란?

  • 사용자가 문자를 입력해 컴퓨터에 명령(e.g. ls, mkdir)할 수 있도록 하는 프로그램
    터미널/콘솔
  • 쉘을 실행하기 위해 문자를 입력 받아 컴퓨터에 전달
  • 프로그램의 출력을 화면에 작성

sh

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

쉘 UX

  • username@hostname:current_folder
    - hostname = 컴퓨터 네트워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장
    - host = 우리 컴퓨터

기본 쉘 커맨드

man

  • 쉘 커맨드의 매뉴얼 문서를 보고 싶은 경우
  • e.g. mbeaan 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; 현재 폴더 경로를 절대 경로로 보여줌

cd

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

echo

  • 터미널에 텍스트 출력 (Python의 print와 유사)
  • e.g. echo "hi"
  • echo `쉘 커맨드` 입력 시 쉘 커맨드의 결과를 출력
  • 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 모드; 파일 수정 가능
    - ESC = Command 모드
    - ESC: = Last Line 모드
    - w: 현재 파일명으로 저장
    - q: 종료(저장 X)
    - q!: 강제 종료(! = 강제)
    - wq: 저장 후 종료
    - /문자: 문자 탐색 (n = 계속 탐색)
    - set nu: vi 라인 번호 출력
  • 삭제
    - dd: 현재 줄 삭제
    - x: 커서 위치의 글자 1개 삭제 (5x: 글자 5개 삭제)
  • 복사
    - yy: 현재 줄 복사
    - p: 현재 줄 바로 아래에 붙여넣기
  • 이동
    - k: 위 / j: 아래 / h: 왼쪽 / l: 오른쪽 (혹은 방향키로 이동)

bash

  • 쉘 스크립트 실행
  • e.g. bash beaver.sh

sudo

  • superuser do; 커맨드를 슈퍼 유저(최고 권한, 관리자 권한)으로 실행
  • e.g. sudo rm -rf // 실행하지 말 것; 젠부샤쓰

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 ![[Pasted image 20240910174952.png]]
  • e.g. !1004![[Pasted image 20240910175031.png]]

find

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

export

  • 환경 변수 설정할 때 사용

  • e.g. export water="물" // 띄어쓰면 안됨. 쉘에선 붙여서 써야 함.

  • echo $water // "물" 출력

  • export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게 됨.

  • 환경변수를 영구적으로 저장하고 싶다면 .bashrc, .zshrc(쉘에 따라 다름; MAC은 .zshrc)에 저장

  • e.g. vi ~/.zshrc 실행 -> 맨 마지막 줄에 export water="물" 입력-> :wq로 저장

  • 이후 재로그인 하거나 source ~/zshrc 사용시 적용 완료

alias

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

tree

  • 설치: apt-get install tree
  • 폴더의 하위 구조를 계층적으로 표현
  • 프로젝트 소개 시, 구조 설명에 유용
  • tree -L 레벨
    - 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.
    ![[Pasted image 20240910180610.png]]
    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

쉘 스크립트

  • 쉘 커맨드의 조합
  • .sh 파일을 생성하고 그 안에 쉘 커맨드를 추가
  • #!/bin/bash: Shebag; 이 스크립트를 Bash shell로 해석
  • python처럼 if, while, case문이 존재하며, 작성 시 bash [filename].sh 로 실행
  • 인자
    - $1, $2, $3: 1, 2, 3번째 인수를 참조
    - $#: 변수를 사용해 전달된 인수의 개수 확인
    - $@: 모든 변수에 접근
  • 함수
    - python처럼 함수 정의 및 사용 가능
    - 사용: 함수명+인자
    - 변수 할당: 변수=$(함수+인자)
# 함수 정의
	function add_numbers {
	local result=$(( $1 + $2 ))
	echo $result
	}

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

쉘 스크립트 활용하기

  • Python이 설치되어 있지 않은 경우 유용함.

  • script성으로 실행할 수 있는 것들

  • e.g. 모델 학습 시, 여러 파라미터를 정의해 순차적으로 학습하는 script

  • e.g. 로그 파일 분석, 데이터 전처리

  • 서버를 잘 다루기 위해선 쉘 커맨드, 쉘 스크립트에 대해 알아야 함.

  • 여러 명령어가 존재함을 알고, 필요할 때 검색해서 쓰기

  • grep, awk, cut 등을 사용해 Python 없이 데이터 처리가 가능

  • 쉘 스크립트로 모델 학습, 백그라운드 실행, 로그 파일 구성하는 task는 현업에서 많이 진행

profile
NLP 일짱이 되겠다.

0개의 댓글