Day_88 01. Linux & Shell Command

작성일

9 분 소요

Linux & Shell Command

1. Linux

Linux

개발하기 전엔 Mac OS, Window OS 에 익숙하신 분들이 대부분

프로그래밍에 본격 입문하면 Linux 를 다룰 일들이 많음(특히 서버와 관련된 직군이라면!)

PyTorch 설치 페이지

PyTorch 설치할때도 Linux 를 체크하는 부분도 있음

Linux 를 알아야 하는 이유

  • 서버에서 자주 사용하는 OS
    • Mac, Window 도 서버로 활용은 가능하나 유료
  • Free, 오픈소스
    • 여러 버전이 존재 $\rightarrow$ 여러분들의 버전을 만들 수도 있음
  • 안정성, 신뢰성, 유닉스라 Stability, Reliability
  • 쉘 커맨드, 쉘 스크립트 사용 가능

CLI

CLI : Terminal

  • Command Line Interface

GUI

GUI : Desktop

  • Graphic User Interface

CLI 에 익숙해질 필요가있고 작업을 많이함

대표적인 Linux 배포판

다양한 Linux 배포판

  • Wikipedia 에서 큰 이미지를 확인 가능

문파같은 느낌으로 계속해서 확장하고 있음

Debian

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

Ubuntu

  • 영국의 캐노니컬이라는 회사에서 만든 배포판으로 쉽고 편한 설치
  • 초보자들이 쉽게 접근할 수 있도록 만듦

Redhat

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

CentOS

  • Red Hat 이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전

보통 Ubuntu, Debian, CentOS 를 많이 사용

Linux, Shell Script 학습 가이드

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

Linux 를 사용하는 방법

  • VirtualBox 에 Linux 설치, Docker 로 설치
  • WSL 사용(윈도우)
  • Notebook 에서 터미널 실행

  • 2.4 Cloud 에서 띄우는 인스턴스에서 연습

2. Shell Command

쉘의 종류

  • 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램

터미널/콘솔

  • 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 젇날
  • 프로그램의 출력을 화면에 작성

sh

  • 최초의 쉘

bash

  • Linux 표준 쉘

zsh

  • Mac 카탈리나 OS 기본 쉘

쉘 UX

username@hostname:current_folder

hostname : 컴퓨터 네트워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장

쉘을 사용하는 경우

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

기본 쉘 커맨드 - man

쉘 커맨드의 매뉴얼 문서를 보고 싶은 경우

$ man python

종료 : :q 입력

기본 쉘 커맨드 - mkdir

폴더 생성하기 : Make Directory

$ mkdir linux-test

기본 쉘 커맨드 - ls

현재 접근한 폴더의 폴더, 파일 확인 : List Segments

ls 뒤에 아무것도 작성하지 않으면 현재 폴더 기준으로 실행
폴더를 작성하면 폴더 기준에서 실행

옵션 -a : .으로 시작하는 파일, 폴더를 포함해 전체 파일 출력 -l : 퍼미션, 소유자, 만든 날짜, 용량까지 출력 -h : 용량을 사람이 읽기 쉽도록 GB, MB 등 표현, ‘-l’ 과 같이 사용

$ ls ~
$ ls
$ ls -al
$ ls -lh

기본 쉘 커맨드 - pwd

현재 폴더 경로를 절대 경로로 보여줌 : Pring Working Directory

$ pwd

기본 쉘 커맨드 - cd

폴더 변경하기, 폴더로 이동하기 : Change Directory

$ cd linux-test

기본 쉘 커맨드 - echo

Python 의 print 처럼 터미널에 텍스트 출력

$ echo "hi"

$ echo '쉘 커맨드' 입력시 쉘 커맨드의 결과를 출력. ‘ : 1 왼쪽에 있는 backtick

echo 'pwd' $\rightarrow$ 여기선 ‘ 를 썼지만 실제론 1 왼쪽에 있는 backtick 이에요 조심!

기본 쉘 커맨드 - vi

vim 편집기로 파일 생성

  • INSERT 모드에서만 수정할 수 있음

$ vi vi-test.sh

(새로운 창이 뜨면) i 를 눌러서 INSERT 모드로 변경
그 후 ehoc “hi” 작성

ESC 를 누른 후 :wq (저장하고 나가기, write and quit)

ESC :wq! : 강제로 저장하고 나오기

ESC :q : 그냥 나가기

기본 쉘 커맨드 - Command Mode

vi 실행시 기본 Mode

  • 방향키를 통해 커서를 이동할 수 있음

  • dd: 현재 위치한 한 줄 삭제
  • i : INSERT 모드로 변경
  • x : 커서가 위차한 곳의 글자 1개 삭제(5x : 문자 5개 삭제)
  • yy : 현재 줄을 복사(1줄을 ctrl + c)
  • p : 현재 커서가 있는 줄 바로 아래에 붙여넣기
  • k : 커서 위로
  • j : 커서아래로
  • l : 커서 오른쪽으로
  • h : 커서 왼쪽으로

기본 쉘 커맨드 - Insert Mode

파이릉ㄹ 수정할 수 있는 Mode

만약 Command Mode 로 다시 이동하고 싶다면 ESC 입력

기본 쉘 커맨드 - Last Line Mode

ESC 를 누른 후 콜런(:)을 누르면 나오는 Mode

  • w : 현재 파일명으로 저장
  • q : vi 종료(저장되지 않음)
  • q! : vi 강제 종료(!는 강제를 의미)
  • wq : 저장한 후 종료
  • /문자 : 문자 탐색
    • 탐색한 후 n 을 누르면 계속 탐색 실행
  • set nu : vi 라인 번호 출력

기본 쉘 커맨드 - bash

bash 로 쉘 스크립트 실행

bash vi-test.sh

앞에서 작성한 “hi” 가 출력

터미널에서 Tab 을 누르면 자동완성(지원하지 않는 쉘도 존재)

기본 쉘 커맨드 - sudo

관리자 권한으로 실행하고 싶은 경우 커맨드 앞에 sudo 를 붙임

sudo 명령어 : 최고 권한을 가진 슈퍼 유저로 프로그램을 실행

“superuser do” 에서 유래하고, 최근엔 “subsitute user do” (다른 사용자의 권한으로 실행)의 줄임말로 해석

기본 쉘 커맨드 - cp

파일 또는 폴더 복사하기 : Copy

$ cp vi-test.sh vi-test2.sh

-r : 디렉토리를 복사할 때 디렉토리 안에 파일이 있으면 recursive(재귀적)으로 모두 복사
-f : 복사할 때 강제로 실행

기본 쉘 커맨드 - mv

파일, 폴더 이동하기(또는 이름 바꿀 때도 활용) : Move

$ mv vi-test.sh vi-test3.sh

기본 쉘 커맨드 - cat

특정 파일 내용 출력 : concatenate

$ cat vi-test.sh

여러 파일을 인자로 주면 합쳐서(CONCAT) 출력

$ cat vi-test2.sh vi-test3.sh

파일에 저장하고(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 출력

History 결과에서 느낌표를 붙이고 숫자 입력시 그 커맨드를 다시 활용할 수 있음

$ !30

기본 쉘 커맨드 - find

파일 및 디렉토리를 검색할 때 사용

$ find . -name "File" : 현재 폴더에서 File 이란 이름을 가지는 파일 및 디렉토리 검색

기본 쉘 커맨드 - export

export 로 환경 변수 설정

$ export water="물"

$ echo $water

쉘 커맨드에서는 water = "물" 이렇게 입력시 = 양 옆에 공백때문에 에러발생 무조건 붙여서 쓸 것!

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

매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc 에 저장하면 됨

(Linux) $ vi ~/.bashrc 또는 $ vi ~/.zshrc (자신이 사용하는 쉘에 따라 다름)

제일 하단에 export water="물" 을 저장하고 나옴(ESC :wq)

그 후 $ source ~/.bashrc 또는 $ source ~/.zshrc
Linux 환경 설정을 재로그인하지 않고 즉시 적용하고 싶은 경우 source 사용

기본 쉘 커맨드 - alias

터미널에서 alias 라고 치면 현재 별칭으로 설정된 것을 볼 수 있음

alias 는 기본 명령어를 간단히 줄일 수 있는 것

예) llls -al 로 별칭이 지정되어 있음
$ alias ll2='ls -l
ll2 를 입력하면 ls -l 이 동작됨

기본 쉘 커맨드

아래 커맫느는 일상처럼 사용할 수 있또록 연습!

  • mkdir, cd, ls
  • echo
  • vi
  • wget
  • pwd
  • mv
  • cp
  • clear
  • history
  • cat
  • bash
  • export
  • alias

쉘 커맨드 - head, tail

파일의 앞/뒤 n 행 출력

$ head -n 3 vi-test.sh

쉘 커맨드 - sort

행 단위 정렬

-r : 정렬을 내림차순으로 정렬(Default 옵션 : 오름차순)
-n : Numetric 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 -c

$ cat fruits.txt | uniq | wc -l

$ cat fruits.txt | sort | uniq | wc -l

wc -l 은 word count line 을 출력하는 것

쉘 커맨드 - grep

파일에 주어진 패턴 목록과 매칭되는 라인 검색

grep 옵션 패턴 파일명

옵션
-i : Insensitively 하게, 대소문자 구분 없이 찾기
-w : 정확히 그 단어만 찾기
-v : 특정 패턴 제외한 결과 출력
-E : 정규 표현식 사용

정규 표현식 패턴
^단어 : 단어로 시작하는 것 찾기
단어$ : 단어로 끝나는 것 찾기 . : 하나의 문자 매칭

쉘 커맨드 - cut

파일에서 특정 필드 추출

-f : 자랄낸 필드 지정
-d : 필드를 구분하는 구분자. Default 는 \t

$ 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번째 값을 가져옴

Redirection & Pipe

$ ls | grep "vi"

위 결과를 다시 output.txt 에 저장하고 싶은 경우

$ ls | grep "vi" > output.txt

최근 입력한 커맨드 중 echo 가 들어간 명령어를 찾고 싶은 경우

$ history | grep "echo"

Redirection & Pipe 연습 문제

test.txt 파일에 “Hi!!!!” 를 입력해주세요(vi 사용금지)

$ echo "Hi\!\!\!\! > test.txt

test.txt 파일 맨 아래에 “kkkkk” 를 입력해주세요(vi 사용금지)

$ echo "kkkkk" >> test.txt

test.txt 의 라인 수를 구해주세요(힌트 : wc -l 를 쓰면 라인 수를 구할 수 있음)

$ cat 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 $\rightarrow$ remote

$ scp local_path user@ip:remote_directory

remote $\rightarrow$ local

$ scp user@ip:remote_directory local_path

remote $\rightarrow$ remote

$ user@ip:remote_directory user2@ip2:target_remote_directory

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

터미널 종류 후에도 계속 작업이 유지하도록 실행(백그라운드 실행)

$ nohup python3 app.py &

nohup 으로 실행된 파일은 Permission 이 755여야 함

종료는 ps ef grep app.py 한 후, pid(Process ID) 찾은 후 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 : 읽거나 실행할 수는 있지만 수정은 불가능

755, 644로 퍼미션을 주세요! 라고 하는 경우가 존재
rwx 를 더하면 4 + 2 + 1 = 7

chmod 755 vi-test2.sh 를 실행하면 파일의 Permission 이 변경됨

처음엔 이런 Permission 이었다가

요렇게 변함

쉘 스크립트

.sh 파일을 생성하고, 그 안에 쉘 커맨드를 추가

파이썬처럼 if, while, case 문이 존재하며 작성시 bash name.sh 로 실행 가능

쉘 스크립트 예시

  • 쉘 스크립트 = 쉘 커맨드의 조합
  • 쉘 커맨드에 익숙해진 후, 스크립트로 생성(Python 과 유사)
  • 지금은 쉘 커맨드에 많이 익숙해진 후, 추후에 하나씩 만들어보기(쉘 커맨드가 항상 베이스)

https://github.com/zzsza/shell-scripts https://github.comdenysdovhan/bash-handbook https://github.com/epety/100-shell-script-examles

#!/bin/bash : Shebang

  • 이 스크립트를 Bash 쉘로 해석

$ (date + %s) : date 를 %s(unix timestamp)로 변형
START=$(date +%s) : 변수 저장

Special Mission

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

댓글남기기