Linux & Shell Command

박정재·2022년 5월 18일
0

Linux

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

Linux를 알아야 하는 이유

  • 서버에서 자주 사용하는 OS(Free, 오픈소스). Mac, Window도 서버로 활용 가능하나 유료
  • 여러 버전이 존재해서 각자의 버전을 만들 수 있다.
  • 오래 되고 많은 사람들이 사용하여 안정성, 신뢰성. (유닉스 os라 Stability, Reliability)
  • 쉘 커맨드, 쉘 스크립트를 사용할 수 있다.

CLI(Command Line Interface)

CLI: Terminal
명령어 기반

GUI(Graphic User Interface)

GUI: Desktop

대표적인 Linux 배포판

https://www.reddit.com/r/linuxmasterrace/comments/7diwwi/linux_distro_timelin

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

보통 Ubuntu, Debian, CentOs를 많이 사용한다.

Linux를 사용하는 방법

  • VirtualBox에 Linux 설치
  • Docker로 설치
  • WSL 사용(윈도우)
  • Notebook에서 터미널 실행
  • Cloud에서 띄우는 인스턴스에서 연습 (환경설정에 쓰는 시간을 아낄 수 있다)

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

man == manual
종료: :q 입력

mkdir

폴더 생성하기: Make Directory

mkdir test

ls

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

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

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

ls ~
ls
ls -al
ls -lh

pwd

현재 폴더 경로를 절대 경로로 보여준다: Print Working Directory

pwd

cd

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

cd test

echo

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

echo "hi"

echo `쉘 커맨드` 입력 시 쉘 커맨드의 결과를 출력 ( ` : backtick)

echo `pwd`

vi

vim 편집기로 파일 생성
INSERT 모드에서만 수정할 수 있다.

vi vi_test.sh
새로운 창이 뜨면 i를 눌러서 INSERT 모드로 변경
그 후, echo "hi" 작성

ESC를 누른 후, :wq: 저장하고 나가기, write and quit
ESC :wq!: 강제 저장하고 나오기
ESC :q: 그냥 나가기

vi 편집기의 Mode

  • Command Mode
  • Insert Mode
  • Last Line Mode

Command Mode

vi 실행 시 기본 모드
방향키를 통해 커서 이동 가능

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

Insert Mode

파일을 수정할 수 있는 Mode
Command Mode로 다시 이동하고 싶으면 ESC 입력

Last Line Mode

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

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

bash

bash로 쉘 스크립트 실행
bash vi-test.sh

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

sudo

관리자 권한으로 실행하고 싶은 경우 커맨드 앞에 sudo를 붙임
최고 권한을 가진 슈퍼 유저로 프로그램을 실행
"superuser do"에서 유래, 최근엔 "substitue user do" (다른 사용자의 권한으로 실행)의 줄임말로 해석

cp

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

cp vi-test.sh vi-test2.sh

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

mv

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

vi-test.sh에서 vi-test3.sh으로 파일명 변경
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

csv나 json 파일 간단하게 합치고 싶은 경우 사용 가능

clear

터미널 창을 깨끗하게 해준다.

history

최근에 입력한 쉘 커맨드 History 출력

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

!30

find

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

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

export

export로 환경 변수 설정

water="물" 붙여서 써야한다.
export water="물"

echo $water

export로 환경 변수 설정한 경우, 터미널이 꺼지면 사라지게 된다.
매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc에 저장하면 된다.

Linux vi ~/.bashrc

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

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

alias

터미널에 alias를 치면 현재 별칭으로 설정된 것을 볼 수 있다.
기본 명령어를 간단히 줄일 수 있다.

예) llls -l로 별칭이 지정되어 있다.

alias ll2='ls -l'
ll2 입력하면 ls -l이 동작된다.

head, tail

파일의 앞/뒤 n행 출력

head -n 3 vi-test.sh

sort

행 단위 정렬

  • -r: 내림차순 정렬(Default 옵션: 오름차순)
  • -n: Numeric Sort

cat fruits.txt | sort
cat fruits.txt | sort -r

uniq

중복된 행이 연속으로 있는 경우 중복 제거
sort와 함께 사용 가능

-c: 중복 행의 개수 출력

cat fruits.txt | uniq
cat fruits.txt | sort | uniq

# wc -l: word count 라인 수 출력
cat fruits.txt | uniq | wc -l
cat fruits.txt | sort |uniq | wc -l

grep

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

grep 옵션 패턴 파일명

옵션

  • -i: Insensitive하게, 대소문자 구분 없이 ㅊ자기
  • -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번째 값을 가져옴

데이터 전처리 시 사용할 수 있을 것

표준 스트림(Stream)

Unix에서 동작하는 프로그램은 커맨드 실행 시 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)을 다른 프로그램의 입력으로 사용하고 싶은 경우
A의 Output을 B의 Input으로 사용(다양한 커맨드를 조합)

현재 폴더에 있는 파일명 중 vi가 들어간 단어를 찾고 싶은 경우
ls | grep “vi”

grep “vi” : 특정 단어 찾기

ls | grep “vi”

위 결과를 다시 output.txt에 저장하고 싶은 경우
ls | grep “vi” > output.txt

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

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

ps

현재 실행되고 있는 프로세스 출력하기: Process Status

-e: 모든 프로세스
-f: Full Format으로 자세히 보여준다.

curl

Command Line 기반의 Data Transfer 커맨드 : Client URL
Request를 테스트할 수 있는 명령어

웹 서버를 작성한 후 요청이 제대로 실행되는지 확인할 수 있음
curl -X localhost:5000/ {data}

Fast API 쓸 때 반환이 어떻게 되는지 확인 가능.

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_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

쉘 스크립트

쉘 스크립트 == 쉘 커맨드의 조합

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

예시

profile
Keep on dreaming and dreaming

0개의 댓글