ML/AI/SW Developer

Linux & Shell Command

0. 강의 소개

Part2의 지난 두 강의에서 웹 프로그래밍에 대한 지식이 없어도 프로토타이핑을 하는 방법에 대해서 학습을 하였는데요, Part2의 남은 과정에서는 그외의 전반적인 서빙을 위해 필요한 기술들에 대해서 학습을 해보도록 하겠습니다. 그 중 첫번째로 서버 프로그래밍을 위해 가장 중요한 Linux에 대한 지식과 Shell Command들에 대해서 학습해보는 시간을 이번 강의에서 갖도록 하겠습니다.

1. Linux

1.1 Linux를 알아야 하는 이유

  • 서버에서 자주 사용하는 OS
    • Mac, Window도 있으나… 유료!
  • Free, 오픈소스
    • 여러 버전이 존재, 개인 커스텀 가능
  • 안전성, 신뢰성
    • 굉장히 오래됨
  • 쉘 커맨드, 쉘 스크립트

1.2 CLI, GUI

  • CLI : Terminal
    • Comand line interface
  • GUI : Desktop
    • Graphic user interface
  • CLI 환경에 익숙해지자!!!

1.3 대표적인 Linux 배포판

  • https://www.reddit.com/r/linuxmasterrace/comments/7diwwi/linux_distro_timelin
  • Debian
    • 온라인 커뮤니티에서 제작해 배포
  • Ubuntu
    • 영국의 캐노니컬이라는 회사에서 만든 배포판으로 쉽고 편한 설치
    • 초보자들이 쉽게 접근할 수 있도록 만듬
  • Redhat
    • 레드햇이라는 회사에서 배포한 리눅스
  • CentOS
    • Red Hat이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전

1.5 Linux, Shell Script 학습 가이드

  • 최초엔 자주 사용하는 쉘 커맨드, 쉘 스크립트 위주로 학습
  • 필요한 코드가 있는 경우 검색해서 찾기
  • 해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기
  • 왜 이렇게 되는가? 생각하며 배경 지식이 필요한 경우 Linux, OS 학습(아마도 커널)

1.6 Linux를 사용하는 방법

  • VirtualBox에 Linux 설치, Docker로 설치
  • WSL 사용(윈도우)
  • Notebook에서 터미널 실행
  • 2.4 Cloud에서 띄우는 인스턴스에서 연습

2. Shell Command

2.1 쉘의 종류

  • 쉘: 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램
  • 터미널/콘솔: 쉘을 실행하기 위해 문자를 입력받아 전달, 출력을 화면에 작성
  • sh: 최초의 쉘
  • bash: Linux 표준 쉘
  • zsh: Mac 카탈리나 OS 기본 쉘
  • hostname : 컴퓨터 네트워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장

          username@hostname:current_folder
    

2.2 쉘을 사용하는 경우

  • 서버에서 접속해서 사용하는 경우
  • crontab 등 Linux의 내장 기능을 활용하는 경우
  • 데이터 전처리를 하기 위해 쉘 커맨드를 사용
  • Docker를 사용하는 경우
  • 수백대의 서버를 관리할 경우
  • Jupyter Notebook의 Cell에서 앞에 !를 붙이면 쉘 커맨드가 사용됨
  • 터미널에서 python3, jupyter notebook 도 쉘 커맨드
  • Test Code 실행
  • 배포 파이프라인 실행(Github Action 등에서 실행)

2.3 기본 쉘 커맨드

  • mkdir : 폴더 생성
mkdir folder_name
  • ls : 현재 접근한 폴더의 폴더, 파일 확인 (List Segments)
ls -a # .으로 시작하는 파일, 폴더를 포함해 전체 파일 출력
ls -l # 퍼미션, 소유자, 만든 날짜, 용량까지 출력
ls -h # 용량을 사람이 읽기 쉽도록 GB, MB 등 표현
  • pwd : 현재 폴더 경로를 절대경로로 보여줌 (Print Working Directory)
  • cd : 경로, 폴더 이동 변경 (change directory)
  • echo : 터미널에 텍스트 출력
    • backtick `:1 왼쪽에 있는
      # 절대경로를 출력
      echo `pwd`
    
  • vi : vim 편집기 실행
    • Command Mode
      • dd : 현재 위치한 한 줄 삭제
      • i : INSERT 모드로 변경
      • x : 커서가 위치한 곳의 글자 1개 삭제(5x : 문자 5개 삭제)
      • yy : 현재 줄을 복사(1줄을 ctrl + c)
      • p : 현재 커서가 있는 줄 바로 아래에 붙여넣기
      • k : 커서 위로
      • j : 커서 아래로
      • l : 커서 오른쪽으로
      • h : 커서 왼쪽으로
    • Insert Mode
      • i : INSERT 모드로 변경
      • 입력이 가능한 모드
    • Last Line Mode
      • ESC를 누른 후 콜론(:)을 누르면 나오는 Mode
      • w : 현재 파일명으로 저장
      • q : vi 종료(저장되지 않음)
      • q! : vi 강제 종료(!는 강제를 의미)
      • wq : 저장한 후 종료
      • /문자 : 문자 탐색
        • 탐색한 후 n을 누르면 계속 탐색 실행
      • set nu : vi 라인 번호 출력
  • bash : 쉘 스크립트 실행
  • sudo : 관리자 권한, 슈퍼유저
  • cp : copy

      # -r 디렉토리 안에 있는 거 전부 복사
      # -f 복사 강제 실행
      cp vi-test.sh vi-test2.sh
    
  • mv : move
  • cat : 특정 파일 내용 출력 (concatenate)
    • 여러 파일을 인자로 주면 합쳐서 출력
    • Overwrite

        cat vi-test2.sh vi-test3.sh > new_test.sh
      
    • Append

        cat vi-test2.sh vi-test3.sh >> new_test.sh
      
  • clear : 화면 깨끗하게
  • history : 최근에 입력한 쉘 커맨드 History 출력
  • find : 파일 및 디렉토리 검색

      # 현재 폴더에서 "File" 이라는 이름이 포함된 파일 및 디렉토리 찾기
      find . -name “File”
    
  • export : 환경변수 설정
    • export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게 됨
  • alias : 별칭 설정
    • 긴 명령어를 짧게!
  • head, tail
    • 파일의 앞뒤 n 행 출력
  • sort
    • 행단위 정렬
    • -r: 내림차순으로
    • -n: Numeric Sort
  • uniq
    • 중복된 행이 연속으로 있는 경우 중복 제거
    • sort와 함께 사용
    • -c : 중복 행의 개수 출력
      cat fruits.txt | sort | uniq
      # word count line 수
      cat fruits.txt | sort | uniq | wc -l
    
  • grep
    • 파일에 주어진 패턴 목록과 매칭되는 라인 검색
    • grep 옵션 패턴 파일명
    • 옵션
      • -i : Insensitively하게, 대소문자 구분 없이 찾기
      • -w : 정확히 그 단어만 찾기
      • -v: 특정 패턴 제외한 결과 출력
      • -E : 정규 표현식 사용
  • cut
    • 파일에서 특정 필드 추출
    • 옵션
      • -f : 잘라낼 필드 지정
      • -d : 필드를 구분하는 구분자. Default는 \t
  • 표준 스트림
    • stdin : 0으로 표현, 입력(비밀번호, 커맨드 등)
    • stdout : 1로 표현, 출력 값(터미널에 나오는 값)
    • stderr : 2로 표현, 디버깅 정보나 에러 출력

2.4 Redirection & Pipe

  • Redirection : 프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달
  • Pipe : 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
    • A의 Output을 B의 Input으로 사용
      # grep “vi” 결과를 output.txt에 저장
      ls | grep “vi” > output.txt
    

2.5 서버에서 자주 사용하는 쉘 커맨드

  • ps : Process Status
    • -e : 모든 프로세스
    • -f : Full Format으로 자세히 보여줌
  • curl : Client URL
    • Command Line 기반의 Data Transfer 커맨드
      # 웹 서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음
      curl -X localhost:5000/ {data}
    
  • df : Disk Free
    • 현재 사용 중인 디스크 용량 확인
    • -h : 사람이 읽기 쉬운 형태로 출력
  • scp : Secure Copy(Remote file copy program)
    • 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 : 터미널 종료 후에도 계속 작업이 유지하도록 실행(백그라운드 실행)
    • nohup으로 실행될 파일은 Permission이 755여야 함
  • chmod : Change Mode
    • 파일의 권한을 변경하는 경우 사용
    • Permission
      • r = Read(읽기), 4
      • w = Write(쓰기), 2
      • x = eXecute(실행하기), 1
        • = Denied
      • r-x : 읽거나 실행할 수는 있지만 수정은 불가능
    • 755, 644로 퍼미션을 주세요! 라고 하는 경우가 존재
      • rwx를 더하면 4+2+1 = 7

2.6 쉘 스크립트

  • .sh 파일을 생성하고, 그 안에 쉘 커맨드를 추가
    • 쉘 커맨드의 조합
  • 파이썬처럼 if, while, case 문이 존재
  • 참고 자료
    • https://github.com/zzsza/shell-scripts
    • https://github.com/denysdovhan/bash-handbook
    • https://github.com/epety/100-shell-script-examples

3. Special Mission

  1. 학습한 쉘 커맨드 정리하기
  2. 카카오톡 그룹 채팅방에서 옵션 - 대화 내보내기로 csv로 저장 후, 쉘 커맨드 1줄로 카카오톡 대화방에서 2021년에 제일 메세지를 많이 보낸 TOP 3명 추출하기! 카카오톡에서 CSV로 변환할때 한글이 깨지는 경우에는 다음 링크를 참고해서 해결해주세요! https://mentha2.tistory.com/162

Reference

  • AI boot camp 2기 서빙 강의