카일 스쿨 3주차

  • Hits
  • #1. 쉘 관련 용어 정의 및 데이터 직군에서 쉘 사용하는 경우
  • #2. 기본 쉘 커맨드
  • #3. 데이터 전처리시 사용할 쉘 커맨드
  • 종합 실습
  • #4. 서버에서 주로 사용하는 쉘 커맨드
  • 오늘 쉘 커맨드를 충분히 익히고, 쉘 스크립트는 다음 주에 진행

1. 쉘 관련 용어 정의 및 데이터 직군에서 쉘 사용하는 경우

  • 쉘 스크립트란?
    • 데이터 그룹에서 이거 왜 해야되는거죠? 라고 물어볼 수 있음
    • 쉘 스크립트는 쉘에서 사용하는 스크립트
  • 사실 리눅스에 대해 잘 알아야 하는데 자세히 가면 어렵기 때문에 우선 스킵
    • 운영체제에서 제공하는 명령을 실행하는 프로그램
    • (리눅스의) 쉘은 명령어와 프로그램을 실행할 때 사용하는 인터페이스
    • 쉘은 커널과 사용자간의 다리 역할을 함
  • 쉘의 종류
    • sh : 최초의 쉘
    • bash : 리눅스 표준 쉘
    • zsh : 맥 카탈리나 OS 기본 쉘
  • CLI
    • 커맨드 라인 인터페이스(CLI: Command Line Interface)
  • 쉘과 터미널
    • 요새는 혼용해서 씀
    • 터미널/콘솔 : 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 전달 or 컴퓨터의 출력을 문자 화면에 쓰는 프로그램
      • byeon : user_name
      • byeon_Macbook : hostname
        • hostname : 컴퓨터 네트워크에 접속된 장치들에 할당된 이름, IP 대신 기억하기 쉽게 작성한 것
    • 쉘 : 사용자가 문자를 입력하여 컴퓨터에 명령할 수 있도록 하는 프로그램
  • 데이터 직군에서 쉘을 사용하는 경우
    • Github Repo에서 볼 경우(참고 : pandas)
    • 서버에 직접 접속해서 사용할 경우(접속 후 crontab을 돌린다거나, 딥러닝 모델을 flask로 serving한다거나, Airflow를 재실행 등)
    • 맥북 사용할 경우(터미널에서 open . 사용하면 새 창 띄워주고, 이동 가능)
    • GUI 환경이 아닌 경우 CLI 사용
    • 리눅스를 직접 사용할 경우
    • docker를 사용할 경우(도커 파일을 만들고 python3 설치하고, pandas 설치하고, jupyter notebook 설치하고 등을 쉘 스크립트에 한번에 저장)
    • jupyter notebotok에서 앞에 !를 붙이면 쉘 명령어를 칠 수 있음
    • 수백대의 시스템을 관리할 경우
    • 이미 여러분은 터미널에서 python, jupyter notebook 등을 치고 있을텐데 그것도 쉘 커맨드

2. 기본 쉘 커맨드

  • 기본 : 이동, 복사, 현재 폴더 확인, 다운로드 등
  • 따라치며 들어주세요
    • 맥 : Terminal, iTerm2 등 실행
    • 윈도우 : Prompt, Power Shell 실행
  • man

    • 쉘 커맨드의 manual을 보여주는 명령어

      man python
    • 종료하는 법 : :q 입력

  • mkdir

    • 폴더 생성하기

      mkdir kyle-school-week3
  • cd

    • Change Directory

      cd kyle-school-week3
  • echo

    • Python의 print처럼 텍스트 출력
    • echo "출력할 텍스트"로 사용

      echo "Awesome Kyle School!"
    • echo `커맨드`를 하면 커맨드를 실행한 결과가 출력됨(` : backtick)

      echo `ls`
  • vi

    • vi 편집기로 파일 생성
    • INSERT 모드에만 수정할 수 있음. INSERT 모드가 아니면 키보드에서 i 입력
    • vim 사용 팁이 궁금하면 VIM 자주 사용하는 명령어 및 Tip 참고

      man vi
      vi hi.sh
      
      (새로운 창이 뜨면) echo "hi"
      
      ESC :wq
      
      vi .hello.sh
      (새로운 창이 뜨면) echo "hello"
      
      ESC :wq
    • ESC :wq : 저장하고 나오기

    • ESC :wq! : 강제로 저장하고 나오기
      • 파일의 Permission이 읽기 전용일 경우 readonly option is set(add ! to override)라고 뜸
  • ls

    • list segments의 약자로 파일의 목록을 표시
    • ls 뒤에 아무것도 작성하지 않으면 현재 폴더 기준으로 하고, 폴더를 작성하면 폴더 기준으로 됨
    • 옵션

      • -a : .으로 시작하는 파일, 폴더 포함해(전체 파일) 출력
        • (참고) .으로 시작하는 파일은 ls만 할 경우 보이지 않음
      • -l : 퍼미션, 소유자, 만든 날짜, 용량까지 출력
      • -h : 용량을 사람이 읽기 쉽도록(GB, MB 등) 표현
      ls ~
      ls
      ls -al
      ls -alh
      ls -l
      ls -lh
  • wget

    • 네트워크 상에서 데이터를 다운로드함

      wget www.naver.com
  • pwd

    • Print Working Directory의 약어로 현재 작업중인 디렉토리의 절대 경로를 출력함
  • mv

    • 파일 또는 폴더 이동하기(또는 이름 바꾸기)

      mv hi.sh hi2.sh
  • clear

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

    • 파일 또는 폴더 복사하기

      cp hi2.sh hi3.sh
      cp hi2.sh hi.sh
    • 옵션

      • -r : 디렉토리를 복사할 때 폴더 안에 내용이 있다면 recursive(재귀적으로) 복사해야 하는데, 이럴 경우 사용
      • -f : 복사할 때 강제로 실행하기(파일이 존재해도 강제로 저장)
      • -p : 그냥 cp할 경우 현재 사용자의 기본 쇼유권, 퍼미션이 지정되는데 p 옵션을 줄 경우 원본 파일의 속성을 그대로 복사함
  • history
    • 최근에 입력한 커맨드들 출력
  • 정리
    • 이 명령어들은 기본적으로 많이 사용하기 때문에 암기해서 자연스럽게 쓸 수 있길!
    • mkdir
    • cd
    • echo
    • vi
    • ls
    • wget
    • pwd
    • mv
    • clear
    • cp
    • history

3. 데이터 전처리시 사용할 쉘 커맨드

  • cat

    • concatenate의 약자로 파일 이름을 인자로 받아 concat한 후 내용을 출력함
    • 여러 파일을 인자로 주면 합쳐서 출력

      cat hi.sh
      cat hi.sh .hello.sh
  • Redirect(>, >>) (★★★★★)

    • command의 출력을(stdout) filename에 기록하고 파일이 없으면 생성함
    • 만약 존재하는 파일에 추가하려면(append) >> 사용
    • 그 외에 <, << 등도 있긴한데 >, >>를 제일 많이 사용

      echo "kyle-school" > kyle.sh
      cat kyle.sh
      
      echo "kyle-school" > kyle.sh
      cat kyle.sh    
      
      echo "kyle-school2222" >> kyle.sh
      echo "kyle-school3" >> kyle.sh
      echo "kyle-school5" >> kyle.sh
      echo "kyle-school4" >> kyle.sh
      
      cat kyle.sh
  • 표준 스트림(stream)
    • 유닉스에서 동작하는 프로그램은 실행시 3개의 스트림이 생김
    • stdin : 0로 표현, 입력 값(비밀번호, 커맨드 등)
    • stdout : 1로 표현, 출력 값(터미널에 나오는 값)
    • stderr : 2로 표현, 디버깅 정보나 에러가 출력되는 곳
  • Pipe(|) (★★★★★)

    • 특정 프로그램의 출력 결과를 다른 프로그램의 입력으로 사용하고 싶은 경우 활용
    • A의 Output을 B의 Input으로 사용(다양한 커맨드들을 조합할 때 사용)
    • 현재 폴더에 있는 파일명 중 hi가 들어가는 것을 찾고 싶은 경우

        ls | grep "hi"
  • 위 결과를 output.txt에 저장하고 싶은 경우

      ls | grep "hi" > output.txt
  • 최근에 입력한 커맨드 중 echo가 들어가는 명령어를 찾고 싶은 경우

      history | grep "echo"
  • 특정 파일 마지막 줄에 단어 추가하고 싶은 경우

      echo "hi" >> output.txt

Pipe, Redirect 연습 문제

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

cat test.txt | wc -l
  • head, tail

    • 파일의 앞/뒤 n행 출력

      head -n 5 kyle.sh
  • wc

    • word count의 약자로 사용자가 지정한 파일의 행, 단어, 문자수를 셈
    • 옵션

      • -l : 라인 수(행)을 count
    • 표준 출력을 count하는 방식으로 많이 사용

      cat kyle.sh | wc -l
  • sort

    • 행 단위 정렬로 default 옵션은 오름차순
    • 옵션
      • -r : 정렬을 내림차순으로 정렬
      • -n : numeric sort
    • 파일 생성

        vi fruits.txt
      
        banana
        orange
        apple
        apple
        orange
        orange
        apple
        banana
      
        # ESC :wq로 저장
cat fruits.txt | sort
cat fruits.txt | sort -r
  • uniq

    • 중복된 행이 연속으로 있는 경우 중복을 하나의 행으로 만들어줌
    • sort와 함께 사용함
    • 옵션

      • -c : 중복 행의 개수를 출력
      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 : insensitively하게, 대소문자 구분 없이 찾기
      • -w : 정확히 그 단어만 설정
      • -v : 특정 패턴 제외한 결과 출력
      • -E : 정규 표현식 사용
      • -B : before 행 출력
  • 파일 생성
vi demo_file

THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.

Two lines above this line is empty.
And this is the last line
empty is umm
cat demo_file
  • 특정 단어가 들어간 줄을 찾고 싶은 경우 : -i 사용
grep -i "the" demo_file
grep -i "is" demo_file
  • 특정 단어 중 정확히 그 단어만 찾고 싶은 경우(대소문자 상관없이) : -iw 사용
grep -iw "is" demo_file
  • 정규 표현식으로 매칭 : -E 사용
grep -E "lines.*empty" demo_file
  • OR 조건 : | 사용
grep -E 'is|this' demo_file
  • AND 조건 : * 사용
grep -E "this.*last" demo_file
  • 특정 조건 이전 n행 추출 : -B 사용
grep -B 2 "And" demo_file

grep 연습 문제

  • (demo_file에서)
  • empty가 들어간 행을 출력해주세요
  • First와 Upper가 들어간 행을 출력해주세요
  • above가 들어간 행의 단어는 몇개 있을까요?
  • empty가 마지막에 들어간 행을 출력해주세요(정규 표현식 사용)
grep "empty" demo_file
grep -E "First|Upper" demo_file
grep -iw "above" | wc -m
grep -E "
  • cut

    • 파일에서 특정 필드를 뽑아냄
    • 옵션

      • -f : 잘라낼 필드를 지정
      • -d : 필드를 구분하는 문자 지정. 디폴트는 탭
      vi cut_file
      
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      
      ESC :wq
      cat cut_file | cut -d : -f 1,7
      # 1번째, 7번째 값을 가져옴

cut 연습 문제

  • cut_file을 / 기준으로 split한 후 처음 부분만 출력
  • cut_file을 / 기준으로 split한 후 : 기준으로 또 split하고 처음 부분만 출력
cat cut_file | cut -d / -f 1 
cat cut_file | cut -d / -f 1 | cut -d : -f 1
  • find
    • 리눅스에서 파일 및 디렉토리를 검색할 때 사용
    • find . -name "File"
    • fine . -name -*.h" -delete : 검색 후 삭제

종합 실습

  • 커맨드 한줄로 카카오톡 대화방에서 2019년에 말 많이한 TOP10명 추출하기
  • 우선 카카오톡에서 대화 내보내기로 csv 저장해주세요
  • hint : 오늘 배운 다양한 것들을 다 사용합니다
  • 일단 대화에 뭐가 들었는지 봅시다
head kakao-chat.csv

# 또는
cat kakao-chat.csv
  • 2019가 앞에 있는 것들을 출력합시다
cat kakao-chat.csv | grep -E '^2019'
  • 쉼표로 split해봅시다
cat kakao-chat.csv | grep -E '^2019' | cut -d ','
  • 두번째가 뭔가 이름 같습니다
cat kakao-chat.csv | grep -E '^2019' | cut -d ',' -f 2
  • 자 이제 2019년의 대화를 봤습니다! 개수를 세기 위해 wc -l을 사용할 수 있지만, 저는 sort 후 uniq -c를 사용
cat kakao-chat.csv | grep -E '^2019' | cut -d ',' -f 2 | sort 
cat kakao-chat.csv | grep -E '^2019' | cut -d ',' -f 2 | sort | uniq -c
  • 큰 숫자부터 내림차순하고 싶기 때문에 sort -rn 사용
cat kakao-chat.csv | grep -E '^2019' | cut -d ',' -f 2 | sort | uniq -c | sort -rn
  • TOP 10만 추출
cat kakao-chat.csv | grep -E '^2019' | cut -d ',' -f 2 | sort | uniq -c | sort -rn | head -n 10

4. 서버에서 주로 사용하는 쉘 커맨드

  • 사실 더 많지만 오늘은 일단 이정도만..! (머리 아플듯)
  • ps
    • process status. 현재 시스템에 돌고 있는 프로세스를 보여줌
    • 옵션
      • -e : 모든 프로세스
      • -f : full format으로 자세히 보여줌
  • 목적은 비슷한 두 도구
  • curl

    • cURL : 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리

        curl -X localhost:5000/ {data}
  • httpie : python으로 개발된 http client 유틸리티

    • curl에 비해 사용이 쉽고
    • json 지원 기능 내장
    • 출력을 포매팅해줘서 가독성이 뛰어남

        pip3 install httpie
        http -v localhost:5000/ {data}
  • curl과 httpie 비교
    • 기상청에서 초단기실황 데이터 가져오는 경우
    • curl
  • httpie
  • df

    • 디스크 용량 확인
    • 옵션

      • -h : 사람이 읽기 쉬운 형태로 출력

정리

  • 쉘 커맨드를 잘 알면 쉘 스크립트를 쉽게 사용 가능한 편
  • 특정 경우엔 python이 아니라 쉘에서 바로 진행하면 더 편함
  • 서버에서 무언가 작업을 한다면 필수적으로 익히는 것이 좋음

더 공부하고 싶다면?

  • 만화로 배우는 리눅스 시스템 관리 : 표지가 유일한 단점. 처음 접할 때 매우 좋음
  • 김태용의 리눅스 쉘 스크립트 프로그래밍 입문 : 엄청 두껍지만, 한번 보면 매우 도움
  • Data Science at the Command Line : 원서지만 특정 부분만 볼만함
    • 책을 온라인에 공개해둠. 링크 참고

다음 수업

  • awk, sed, xargs, htop, nohup, screen 등 오늘 다루지 못한 쉘 커맨드에 대해 알려준 후
  • 쉘 스크립트에 대해서 진행할 예정

  • 오늘 숙제

    • 실습했던 내용 쭈루룩 한번씩 해보기
    • 카카오톡 채팅에서 말 많이 한 사람 한줄로 출력해보기