[부스트캠프 AI tech AI서비스개발기초] week05 (2022.02.16)

03 Linux & Shell Command

Linux

  • 서버에서 자주 사용하는 OS
  • 오픈소스
  • 안정성, 신뢰성, 유닉스(stability, reliability)
  • 쉘 커맨드, 쉘 스크립트

CLI: Terminal, Command Line Interface

GUI: Desktop, Graphic User Interface

Linux 배포판(wiki)

  • Debian

    : 온라인 커뮤니티에서 제작해 배포
  • Ubuntu**

    : 영국의 캐노니컬이라는 회사에서 만든 배포판
    : 초보자들이 쉽게 접근할 수 있도록 만듦
  • Redhat

    : 레드햇이라는 회사에서 배포한 리눅스
  • CentOS

    : Redhat 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전

Linux, Shell script 학습가이드

  • 처음엔 자주 사용하는 shell command, shell script 위주로 학습
  • 필요한 코드가 있는 경우 검색해서 찾기
  • 해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기
  • 왜 이렇게 되는가? 생각하기
  • 배경지식이 필요한 경우 Linux, OS학습

Linux를 사용하는 방법

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

Shell의 종류

  • : 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램
  • 터미널 / 콘솔
    : 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 전달
    : 프로그램의 출력을 화면에 작성
  • sh
    : 최초의 쉘
  • bash
    : Linux 표준 쉘
  • zsh
    : Mac 카탈리나 OS 기본 쉘

Shell을 사용하는 경우

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

vi 편집기의 Mode

  • Command Mode
    : vi 실행시 기본 모드, 방향키를 통해 커서 이동
    -dd: 현재 위치한 한 줄 삭제
    -i: INSERT모드로 변경
    -x: 커서가 위치한 곳의 글자 1개 삭제(5x: 5개 삭제)
    -yy: 현재 줄을 복사(ctrl+c)
    -p: 현재 커서가 있는 줄 바로 아래에 붙여넣기(ctrl+v)
    -k: 커서 위로
    -j: 커서 아래로
    -l: 커서 오른쪽으로
    -h: 커서 왼쪽으로

  • Insert mode
    : 파일을 수정할 수 있음, ESC 입력시 Command모드로 변경
  • Last Line Mode
    : ESC를 누른 후 :을 누르면 나오는 모드
    -w: 현재 파일명으로 저장
    -q: vi 종료(저장x)
    -q!: vi 강제종료
    -wq: 저장한 후 종료
    -/문자: 문자 탐색, n을 누르면 계속 탐색 실행
    -set nu: vi 라인 번호 출력

기본 shell command
(일상처럼 사용할 수 있도록 연습!)

  • man
    : shell command의 매뉴얼 문서를 보고 싶은 경우
    ex. man python / 종료: :q 입력
  • mkdir
    : 폴더 생성하기, make directory
    ex. mkdir linux-test
  • ls
    : 폴더, 파일 확인, List Segments
    : ls 뒤에 아무것도 작성하지 않으면 현재 폴더 기준
    : ls 뒤에 폴더를 작성하면 폴더 기준에서 실행
    옵션
    -a: .으로 시작하는 파일, 폴더를 포함해 전체 파일 출력
    -l: 퍼미션, 소유자, 만든날짜, 용량까지 출력
    -h: 용량을 사람이 읽기 쉽도록 GB, MB 등 표현. -l와 같이 사용
    ex. ls-al, ls -lh
  • pwd
    : 현재 폴더의 절대 경로, Print Working Directory
    ex. pwd
  • cd
    : 폴더 변경, 이동하기, Change Directory
    ex. cd linux-test
  • echo
    : print()처럼 터미널에 텍스트 출력
    ex. echo "hi"
    : echo `쉘 커맨드` 입력시 shell command의 결과를 출력
    ex. echo `pwd`
  • vi
    : vim 편집기로 파일 생성, INSERT모드에서만 수정할 수 있음
    ex. vi vi-test.sh, 새로운 창이 뜨면 i를 눌러서 INSERT 모드로 변경. 그 후 echo "hi"를 작성
    ESC :wq: 저장하고 나가기, write and quit
    ESC :wq!: 강제로 저장하고 나오기
    ESC :q: 그냥 나가기
  • bash
    : bash로 쉘 스크립트 실행
    ex. bash vi-test.sh, 앞에서 작성한 "hi"가 출력
  • sudo
    : 관리자의 권한으로 실행하고 싶은 경우
    : superuser do, substitute user do
  • cp
    : 파일 또는 폴더 복사, Copy
    ex. cp vi-test.sh vi-test2.sh
    --r: 디렉토리를 복사할 때 안에 파일이 있으면 재귀적으로 모두 복사
    --f: 복사할 때 문제가 있어도 강제로 실행
  • mv
    : 파일, 폴더 이동하기 또는 이름 바꿀 때, Move
    ex. mv vi-test.sh vi-test3.sh
  • cat
    : 특정 파일 내용 출력, concatenate
    : 여러 파일을 인자로 주면 합쳐서(CONCAT) 출력
    cat vi-test.sh
    cat vi-test2.sh vi-test3.sh
    : 파일에 저장하고(OVERWRITE) 싶은 경우(>)
    cat vi-test.sh vi-test3.sh > new_test.sh
    : 파일에 추가하고(APPEND) 싶은 경우(>>)
    cat vi-test2.sh vi-test3.sh >> new_test.sh
  • clear
    : 터미널 창을 깨끗하게 해줌
  • history
    : 최근에 입력한 shell command history 출력
    : history 결과에서 느낌표를 붙이고 숫자 입력시 그 커맨드를 다시 활용할 수 있음
    ex. !30: 30번째 커맨드 재활용
  • find
    : 파일 및 디렉토리를 검색할 때 사용
    ex. find . -name "File": 현재 폴더에서 File이라는 이름을 가지는 파일 및 디렉토리 검색
  • export
    : 환경변수 설정, 단 터미널이 꺼지면 사라짐
    ex. export water="물", echo $water => 출력
    : 매번 shell을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc에 저장하면 됨
    ex. (Linux) vi ~/.bashrc 또는 vi ~/.zshrc
    제일 하단에 export water="물"을 저장하고 나옴(ESC :wq)
    그 후 source ~/.bashrc 또는 source ~/.zshrc
    Linux 환경 설정을 재로그인하지 않고 즉시 적용하고 싶은 경우 source 사용
  • alias
    : 터미널에서 별칭으로 설정된 것을 볼 수 있음
    ex. ls -lll으로 지정되어 있음
    ex2. alias ll2='ls -l', ll2가 새로운 alias로 동작

Shell Command

  • head, tail
    : 파일 앞/뒤 n행 출력
    ex. head -n 3 vi-test.sh
  • sort
    : 행단위 정렬
    -r: 내림차순으로 정렬
    -n: Numeric Sort 아니면 String Sort
    |: 파이프
    ex. vi fruit.txt ~~ESC :wq
    cat fruit.txt | sort
    cat fruit.txt | sort -r
  • uniq
    : 중복된 행이 연속으로 있는 경우 중복 제거, sort와 함께 사용
    -c : 중복 행의 개수 출력
    wc -l: words count lines?
    ex.
    cat fruits.txt|uniq
    cat fruits.txt|sort|uniq
    cat fruits.txt|uniq|wc -l
    cat fruits.txt|sort|uniq|wc -l
  • grep
    : 파일 내에 주어진 패턴 목록과 매칭되는 라인 검색
    grep 옵션 패턴 파일명
    옵션
    -i: Insesitively하게, 대소문자 구분 없이 찾기
    -w: 정확히 그 단어만 찾기
    -v: 특정 패턴 제외한 결과 출력
    -E: 정규 표현식 사용
    정규표현식 패턴
    ^단어: 단어로 시작하는 것 찾기
    단어$: 단어로 끝나는 것 찾기
    .: 하나의 문자 매칭
  • cut
    : 파일에서 특정 필드 추출
    -f: 잘라낼 필드 지정
    -d: 필드를 구분하는 구분자. Default는 \t
    vi cut_file ~~ ESC :wq
    cat cut_file|cut -d : -f 1, 7: 1번째 7번째 값을 가져옴, :기준으로 구분

표준 스트림

Unix에서 동작하는 프로그램은 command 실행시 3개의 Stream이 생성

  • stdin: 0으로 표현, 입력(비밀번호, 커맨드 등)
  • stdout: 1로 표현, 출력 값(터미널에 나오는 값)
  • stderr: 2로 표현, 디버깅 정보나 에러 출력

Redirection & Pipe

Redirection: 프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달
>: 덮어쓰기(Overwrite), 파일이 없으면 생성하고 저장
>>: 맨 아래에 추가하기(Append)
echo "hi">vi-test3.sh: 덮어쓰기
echo "hello">>vi-test3.sh: 추가
cat vi-test3.sh: 출력


Pipe: 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
ls | grep "vi": 현재 폴더에 있는 파일명 중 vi가 들어간 단어를 찾고 싶은 경우
grep "vi": 특정 단어 찾기


ls | grep "vi" > outout.txt
history | grep "echo"
연습문제
test.txt 파일에 "Hi!!!!"를 입력해주세요(vi 사용 금지)
test.txt 파일 맨 아래에 "kkkkk"를 입력해주세요(vi 사용 금지)
test.txt의 라인 수를 구해주세요(힌트 : wc -l를 쓰면 라인 수를 구할 수 있음

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

  • ps

    : 현재 실행되고 있는 프로세스 출력하기, Process Status
    -e: 모든 프로세스
    -f: Full Format으로 자세히 보여줌
  • curl

    : command line 기반의 data transfer 커맨드, client URL
    : Request를 테스트할 수 있는 명령어
    : 웹서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음
    curl -X localhost:5000/{data}
    : curl 외에 httpie 등도 있음(더 가독성 있게 출력)
  • df

    : 현재 사용 중인 디스크 용량 확인, Disk Free
    -h: 사람이 읽기 쉬운 형태로 출력
  • scp

    : SSH를 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어, Secure Copy(Remote file copy program)
    -r: 재귀적으로 복사(폴더까지 복사)
    -P: ssh 포트 지정
    -i: SSH 설정을 활용해 실행
    local=>romote
    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 python3 app.py &
    : nohup으로 실행될 파일은 permission이 755여야함
    종료
    1. ps ef | grep app.py
    2. pid(Process ID) 찾은 후
    3. kill -9 pid로 프로세스를 kill
      로그는 nohup.out에 저장됨
      nohup 외에도 screen이란 도구도 있음
  • chmod

    : 파일의 권한을 변경하는 경우 사용, Change Mode
    : 유닉스에서 파일이나 디렉토리의 시스템 모드를 변경함
    ls -al(혹은 ll)
    permission
    r = read(읽기), 4
    w = write(쓰기), 2
    x = eXecute(실행하기), 1
    - = Denied
    r-x = 읽거나 실행할 수는 있지만 수정은 불가능
    ex. 755, 644로 퍼미션을 주세요!(user, group, others순서)
    -> rwx를 더하면 4+2+1=7
    ex2. chmod 755 vi-test2.sh를 실행하면 파일의 permission이 변경됨

쉘 스크립트

: .sh파일을 생성하고, 그 안에 쉘 커맨드를 추가
: 파이썬처럼 if, while, case 문이 존재하며 작성시 bash name.sh로 실행가능
: 쉘 스크립트 = 쉘 커맨드의 조합
: 쉘 커맨드에 익숙해진 후 스크립트로 생성(python)과 유사

쉘 스크립트 예시

special mission

1) 학습한 쉘 커맨드 정리하기
2) 카카오톡 그룹 채팅방에서 옵션 - 대화 내보내기로 csv로 저장 후, 쉘 커맨드 1줄로
카카오톡 대화방에서 2021년에 제일 메세지를 많이 보낸 TOP 3명 추출하기!

grep -o "^\[.*\>\] " kakaotalk.txt | \
cut -f 1 -d "]" | sort | uniq -c | \
sort -r | head -n 3

좋은 웹페이지 즐겨찾기