Linux & Shell Command

-·2022년 1월 12일
0

강의정리 - MLOps

목록 보기
6/18
  • Linux
    -- Linux를 알아야 하는 이유
    -- CLI,GUI
    -- 대표적인 Linux 배포판
    -- Linux, Shell Script 학습 가이드

  • Shell Command
    -- 쉘의 종류
    -- 쉘을 사용하는 경우
    -- 기본 쉘 커맨드
    -- Redirection & pipe
    -- 서버에서 자주 사용하는 쉘 커맨드
    -- 쉘 스크립트

Linux

개발하기전엔 Mac OS, Window OS에 익숙하신 분들이 대부분
프로그래밍에 본격 입문하면 Linux를 다룰 일들이 많음 (특히 서버와 관련된 직군이라면!)

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

CLI

CLI(-Command Line Interface) : Terminal
GUI(-Graphic User Interface) : Desktop

대표적인 Linux 배포판

다양한 Linux 배포판
-Wikipedia에서 큰 이미지로 확인 가능

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

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

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

  • CentOS
    -- RedHat이 공개한 버전을 가져와서 브랜드와 로보를 제거하고 배포한 버전

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

Linux를 사용하는 방법

  • VirtualBox에 Linux 설치, Docker로 설치

  • WSL 사용 (윈도우)

  • Notebook에서 터미널 실행

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

Shell Command

Shell의 종류


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

  • 터미널/콘솔
    -- 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터에 전달
    -- 프로그램의 출력을 화면에 작성

  • sh
    -- 최초의 쉘

  • bash
    -- Linux 표준 쉘

  • zsh
    -- Mac 카탈리나 OS 기본 쉘

쉘 UX
username@hostname:current_folder
hostname: 컴퓨터 네트워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장
HOST: 우리의 컴퓨터다 !

쉘을 사용하는 경우

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

기본 쉘 커맨드

man

쉘 커맨드의 메뉴얼 문서를 보고 싶은 경우
man python
종료 : esc -> ':q' 입력

mkdir

폴더 생성하기 : Make directory

mkdir linux-test

ls

현재 접근한 폴더의 폴더, 파일 확인 : List Segments
ls 뒤에 아무것도 작성하지 않으면 현재 폴더 기준으로 실행
폴더를 작성하면 폴더 기준에서 실행
옵션
-a .으로 시작하는 파일 폴더를 포함해 전체 파일 출력
-l 퍼미션,소유자,만든 날짜, 용량까지 출력
-h 용량을 사람이 읽기 쉽도록 GB, MB등 표현. '-l'과 같이 사용

ls ~
ls
ls -al
ls -lh

pwd

현재 폴더 경로를 절대 경로로 보여줌 : Print Working Driectory
pwd

cd

폴더 변경하기, 폴더로 이동하기 : Change Directory
cd linux-test

echo

python의 print처럼 터미널에 텍스트 출력
echo "hi"

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

echo 'pwd'

' 는 backtick != 따옴표

맥북에서 backtick 편하게 입력하기
아니 맥북은 ₩ ~ 가 있는데?! 사실 한영 바꾸고 ₩를 입력하면 잘 나온다 ㅎ
그래도 리눅스 배운거 써먹자
command+space terminal
cd ~/Library
mkdir KeyBindings
vi DefaultkeyBinding.dict
{
"₩" = ("insertText:","{\backtick}");
}
벨로그 익숙하지 않아서... \backtick부분은 ₩그.. 그 실제 빽틱이 들어거다 !

vi

vim 편집기로 파일 생성
-INSERT 모드에서만 수정할 수 있음
vi vi-test.sh
(새로운 창이 뜨면) i를 눌러서 INSERT모드로 변경
그 후 echo "hi" 작성
esc: ":wq"(저장하고 나가기, write and quit)
esc: ":wq!"(강제로 저장하고 나오기)
esc: ":q" (그냥 나가기)

vi 편집기의 Mode

  • 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"에서 유래하고, 최근엔 "substitute 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 // &입력 안하면 그냥 text로 판단되어 water 출력

export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게됨
매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc에 저장하면 됨
(Linux) vi ~/.bashrc 또는 vi ~/.zshrc (자신이 사용하는 쉘에 따라 다름)
제일 하단에 export water="물" 을 저장하고 나옴(ESC :wq)
그 후 source ~/.bashrc 또는 source ~/.zshrc
Linux 환경 설정을 재로그인하지 않고 즉시 적용하고 싶은 경우 source 사용

alias

터미널에서 alias 라고 치면 현재 별칭으로 설정된 것을 볼 수 있음
alias는 기본 명령어를 간단히 줄일 수 있는 것
예 ) ll는 ls -l로 별칭이 되어있음
alias ll2='ls -l'
ll2를 입력하면 ls -l이 동작됨

head, tail

파일의 앞/뒤 n행 출력
head -n 3 vi-test.sh (->파일의 형태 등)
tail -n 3 vi-test.sh (->log)

sort

행 단위 정렬
-r : 정렬을 내림차순으로 정렬(Default 옵션: 오름차순)
-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 fruites.txt|uniq
cat fruites.txt|sort|uniq
cat fruites.txt|uniq|wc -l
cat fruites.txt|sort|uniq|wc -l

grep

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

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

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

cut

파일에서 특정 필드 추출
-f : 잘라낼 필드 지정
-d : 필드를 구분하는 구분자. Default는 \t

표준 스트림(Stream)

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

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

0 -> 프로그램 -> 1 | 2

Redirection & Pipe

Redirection:프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달

>: 덮어쓰기 (Overwirte)파일이 없으면 생성하고 저장
>>: 맨아래에 추가하기 (append)

echo"hi" > vi-test3.sh
echo "hello" >> vi-test3.sh

cat vi-test3.sh 

pipe : 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
A의 Output을 B의 Input으로 사용(다양한 커맨드를 조합)
현재 폴더에 있는 파일명 중 vi가 들어간 단어를 찾고 싶은 경우

ls|grep "vi"
grep "vi": "vi"단어 찾기

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

Redirection & Pipe 연습 문제

test.txt파일에 "Hi!!!!!"를 입력 (vi 사용금지)
test.txt파일 맨아래에 "kkkkk"를 입력해주세요
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=>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_diretory

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

유닉스에서 파일이나 디렉토리의 시스템 모드를 변경함

r= Read, 4
w= Write, 2
x= eXecute(실행),1
-= denied
755,644로 퍼미션을 주세요! 라고 하는 경우가 존재
rwx를 하면 4+2+1 = 7
chmod 755 vi-test2.sh를 실행하면 파일의 Permissiondl 변경됨

쉘 스크립트

.sh 파일을 생성하고 그 안에 쉘 커맨드를 추가
파이썬처럼 if, while, case문이 존재하며 작성시 bash name.sh로 실행가능

예시

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

#!/bin/bash : Shebang

  • 이스크립트를 Bash 쉘로 해석
    &(data+%s): data를 %s(unix timestamp)로 변형
    START = $(data+%s): 변수 저장
profile
-

0개의 댓글