[AI 서비스 개발 개론] Product Serving - Linux & Shell Command
AI 서비스 개발 개론
2. Linux & Shell Command
Linux
1) Linux를 알아야 하는 이유
- 서버에서 자주 사용하는 OS (mac, window도 서버로 활용은 가능하나 유료)
- free, 오픈 소스 : 여러 버전이 존재 => 우리도 버전을 만들 수 있음
- 안정성, 신뢰성 : 유닉스 기반이기 때문에 stability, reliability
- 쉘 커맨드, 쉘 스크립트 자주 사용
2) 대표적인 Linux 배포판
- Debian
- 온라인 커뮤니티에서 제작하여 배포
- Ubuntu
- 영국의 캐노니컬이라는 회사에서 만든 배포판으로 쉽고 편한 설치
- 초보자들이 쉽게 접근할 수 있도록 만듬
- Redhat
- 레드햇이라는 회사에서 배포한 리눅스
- CentOS
- Red Hat이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전
3) Linux 사용 가이드
- Linux, Shell script 사용 가이드
- 최초엔 자주 사용하는 쉘 커맨드, 쉘 스크립트 위주로 학습
- 필요한 코드가 있는 경우 검색해서 찾기
- 해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기
- 왜이렇게 되는가? 생각하며 배경 지식이 필요한 경우 Linux, OS 학습
- Linux 사용법
- VirtualBox에 Linux설치, Docker로 설치
- WSL 사용(윈도우)
- Notebook에서 터미널 실행
- 2.4 Cloud에서 띄우는 인스턴스에서 연습(추천)
Shell command
1) 쉘의 종류
- 쉘
- 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램
- 터미널, 콘솔
- 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터로 전달
- 프로그램의 출력을 화면에 작성
- sh
- 최초의 쉘
- bash
- Linux 표준 쉘
- zsh
- Mac 카탈리나 OS 기본 쉘
2) 쉘 UX
- username@hostname:current_folder
- hostname : 컴퓨터 네크워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장
3) 쉘을 사용하는 경우
- 서버에 접속해서 사용하는 경우
- crontab 등 Linux의 내장 기능을 활용하는 경우
- 데이터 전처리를 하기 위해 쉘 커맨드를 사용
- Docker를 사용하는 경우
- 수백대의 서버를 관리하는 경우
- jupyter notebook의 cell에서 앞에 !를 붙이면 쉘 커맨드가 사용됨
- 터미널에서 python3, jupyter notebook도 쉘 커맨드
- Test Code를 실행하는 경우
- 배포 파이프라인을 실행하는 경우(Github Action 등에서 실행)
4) 기본 쉘 커맨드
- man : 매뉴얼 문서 (종료 -> ':q')
- mkdir : 폴더 생성(make directory)
- ls : 현재 위치에 있는 폴더, 파일 확인 (list segments)
- 옵션
- -a : .으로 시작하는 파일, 폴더 포함 전체 출력
- -l : 퍼미션, 소유자, 만든 날짜, 용량까지 출력
- -h : 용량을 사람이 읽기 쉽게 GB, MB 등 으로 표현. -l과 같이 사용
- ls ~
- ls
- ls -al
- ls -lh
- pwd : 현재 폴더 경로를 절대 경로로 보여줌
- cd : 폴더 변경, 폴더로 이동
- echo : 터미널에 텍스트 출력( python print와 유사)
- 1왼쪽에 있는 backtick사이에 쉘커맨드 입력 시 쉘 커맨드 결과 출력
echo `pwd`
- vi : vim 편집기로 파일 생성
- vi vi-test.sh
- 새로운 창이 뜨면 i를 눌러서 INSERT 모드로 변경
- Command Mode
- vi 실행 직후 기본 모드
- dd : 현재 위치한 한 줄 삭제
- i : INSERT 모드로 변경
- x : 커서가 위치한 곳의 글자 1개 삭제(5x : 글자 5개 삭제)
- yy : 현재 줄을 복사
- p : 현재 커서가 있는 줄 바로 아래 붙여넣기
- k/j : 커서 위로 / 아래로
- l/h : 커서 오른쪽으로 / 왼쪽으로
- Insert Mode
- 파일을 수정할 수 있는 모드
- 다시 Command Mode로 가고 싶다면 ESC 입력
- Last Line Mode
- Insert Mode에서 ESC를 누른 후 콜론(:)을 누르면 나오는 Mode
- w : 현재 파일명으로 저장
- q : vi종료(저장되지 않음)
- q!: vi 강제 종료(!는 강제를 의미)
- wq : 저장한 후 종료
- \문자 : 문자 탐색 - 탐색 후 n을 무르면 계속 탐색 실행
- set nu : vi 라인 번호 출력
- bash : 쉘 스크립트 실행
- sudo : 관리자 권한으로 실행
- 관리자 권한 실행은 조심해서 사용
- 프로그램이 꼬일 수 있으므로 설치 할 때 sudo 대신 --user 사용 권장
- cp : 파일 또는 폴더 복사
- -r : 디렉토리를 복사할 때 디렉토리 안에 파일이 있으면 recursive하게 모두 복사
- -f : 복사할 때 강제로 실행
- mv : 파일, 폴더 이동하기(또는 이름 바꿀 때 활용)
- cat: 특정 파일 내용 출력(concatenate)
- 여러 파일을 인자로 주면 합쳐서 출력
- clear : 터미널 창을 깨끗하게
- history : 최근에 입력한 쉘 커맨드 history 출력
- history 결과에서 숫자가 나오는데 !붙이고 숫자 입력 시 그 커맨드를 다시 활용할 수 있음
- find: 파일 및 디렉토리를 검색할 때 사용
- find . -name 'File' : 현재 폴더에서 File이란 이름을 가진 파일 및 디렉토리 검색
- export : 환경 변수 설정
- export water='물'
- echo $water => 물
- export로 환경변수 설정한 경우, 터미널이 꺼지면서 사라지게 됨
- 매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc에 저장하면 됨
- (Linux) vi ~/.bashrc 또는 vi ~/.zshrc
- 파일 제일 하단에 export water='물'을 저장하고 나옴(ESC:wq)
- 그 후 source ~/.bashrc 또는 source ~/.zshrc 입력
- Linux 환경 설정을 재로그인 하지 않고 즉시 적용하고 싶을 때 source 사용
- alias : 기본 명령어를 간단히 줄일 수 있음
- 터미널에 alias라고 치면 현재 별칭으로 설정된 것을 볼 수 있음
5) 추가 쉘 커맨드
- head/tail -n : 파일의 앞/뒤 n행 출력
- sort : 행 단위 정렬
- -r : 정렬을 내림차순으로 정렬(default는 오름차순)
- -n : numeric sort
- 사용 예 ) cat fruits.txt | sort
- uniq : 중복된 행이 연속으로 있는 경우 중복 제거
- 자주 sort와 함께 사용
- -c : 중복 행의 개수 출력
- 사용 예) cat fruits.txt | sort | uniq
- grep : 파일에 주어진 패턴 목록과 매칭되는 라인 검색
- -i: insensitively하게, 대소문자 구분 없이 찾기
- -w : 정확히 그 단어만 찾기
- -v : 특정 패턴 제외한 결과 출력
- -E : 정규 표현식 사용
- 정규 표현식 패턴
- ^단어 : 단어로 시작하는 것 찾기
- 단어$ : 단어로 끝나는 것 찾기
- . : 하나의 문자 매칭
- cut : 파일에서 특정 필드 추출
- -f : 잘라낼 필드 지정
- -d : 필드를 구분하는 구분자. default는 \t
6) 표준 스트림(Stream)
- Unix 내에서 동작하는 프로그램은 커맨드 실행시 3개의 stream 이 생성
- stdin : 0으로 표현, 입력
- stdout : 1로 표현, 출력
- stderr : 2로 표현, 디버깅 정보나 에러 출력
7) Redirection & Pipe
-
Redirection : 프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달
- > : 덮어 쓰기. 파일이 없으면 생성하고 저장
- >> : 이어서 쓰기(맨 아래에 추가하기)
- 예) echo 'hi' > vi-test.sh
- 예) echo 'hi' >> vi-test.sh
-
Pipe(|) : 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
- A의 output을 B의 input으로 사용(다양한 커맨드를 조합)
- 예) 현재 폴더에 있는 파일 명 중 vi가 들어간 단어를 찾고 싶은 경우
- ls | grep "vi"
-
연습 문제
- test.txt 파일에 'hi!!!'를 입력(vi 사용 금지)
- test.txt 파일 맨 아래에 'kkkkk'를 입력(vi 사용 금지)
- test.txt 파일의 라인 수를 구하라.(hint : wc -l)
echo 'hi!!!' > test.txt
echo 'kkkkk' >> test.txt
cat test.txt | wc -l
8) 서버에서 자주 사용되는 쉘 커맨드
- ps : 현재 실행되고 있는 프로세스 출력하기
- -e : 모든 프로세스
- -f : full format으로 자세히 보여줌
- curl : request를 할 수 있는 명령어, 웹서버를 작성한 후 요청이 제대로 실행하는지 확인 가능(client url)
- curl외에 httpie도 있음(더 가독성 있게 출력)
- df : 현재 사용중인 디스크 용량 확인
- -h: 사람이 읽기 쉬운 형태로 출력
- scp : SSH를 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어 (secure copy)
- -r : 재귀적으로 복사
- -P : ssh포트 지정
- -i : ssh 설정을 활용해 실행
- 예) scp local_path user@ip:remote_directory user2@ip:target_remote_directory (local=> remote)
- nohup : 터미널 종료 후에도 게속 작업이 유지되도록 실행(백그라운드 실행)
- 예 ) nuhup python3 app.py &
- nohup으로 실행된 파일은 permission이 755이어야 함
- 종료는 ps ef|grep app.py한 후, pid(Process ID) 찾은 후 kill -9 pid로 프로세스 종료
- 로그는 nohup.out에 저장됨
- nohup 외에도 screen 이라는 도구도 존재
- chmod : 파일의 권한을 변경하는 경우 사용
- 유닉스에서 파일이나 디렉토리의 시스템 모드를 변경
- Permission
- r = Read(읽기), 4
- w = Write(쓰기), 2
- x = eXecute(실행하기), 1
- - = Denied
- ex) r-x : 읽거나 실행할 수 있지만 수정은 불가능
- ex) 755로 퍼미션 주세요!
-> (user=7, group=5, 기타 사용자=5) = (rwx =4+2+1 = 7, rx = 5, rx = 5)
9) 쉘 스크립트
- .sh 파일을 생성하고, 그 안에 쉘 커맨드 추가
- 파이썬처럼 if,while, case 문이 존재하며 작성 시 bash name.sh로 실행 가능
- 쉘스크립트 = 쉘커맨드의 조합
- 일단은 쉘 커맨드에 익숙해진 후, 추후에 스크립트도 생성해보기
- 참고 자료
https://github.com/zzsza/shell-scripts
https://github.com/denysdovhan/bash-handbook
https://github.com/epety/100-shell-script-examples
과제
Linux
1) Linux를 알아야 하는 이유
- 서버에서 자주 사용하는 OS (mac, window도 서버로 활용은 가능하나 유료)
- free, 오픈 소스 : 여러 버전이 존재 => 우리도 버전을 만들 수 있음
- 안정성, 신뢰성 : 유닉스 기반이기 때문에 stability, reliability
- 쉘 커맨드, 쉘 스크립트 자주 사용
2) 대표적인 Linux 배포판
- Debian
- 온라인 커뮤니티에서 제작하여 배포
- Ubuntu
- 영국의 캐노니컬이라는 회사에서 만든 배포판으로 쉽고 편한 설치
- 초보자들이 쉽게 접근할 수 있도록 만듬
- Redhat
- 레드햇이라는 회사에서 배포한 리눅스
- CentOS
- Red Hat이 공개한 버전을 가져와서 브랜드와 로고를 제거하고 배포한 버전
3) Linux 사용 가이드
- Linux, Shell script 사용 가이드
- 최초엔 자주 사용하는 쉘 커맨드, 쉘 스크립트 위주로 학습
- 필요한 코드가 있는 경우 검색해서 찾기
- 해당 코드에서 나오는 새로운 커맨드 학습해서 정리하기
- 왜이렇게 되는가? 생각하며 배경 지식이 필요한 경우 Linux, OS 학습
- Linux 사용법
- VirtualBox에 Linux설치, Docker로 설치
- WSL 사용(윈도우)
- Notebook에서 터미널 실행
- 2.4 Cloud에서 띄우는 인스턴스에서 연습(추천)
Shell command
1) 쉘의 종류
- 쉘
- 사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램
- 터미널, 콘솔
- 쉘을 실행하기 위해 문자 입력을 받아 컴퓨터로 전달
- 프로그램의 출력을 화면에 작성
- sh
- 최초의 쉘
- bash
- Linux 표준 쉘
- zsh
- Mac 카탈리나 OS 기본 쉘
2) 쉘 UX
- username@hostname:current_folder
- hostname : 컴퓨터 네크워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장
- hostname : 컴퓨터 네크워크에 접속된 장치에 할당된 이름. IP 대신 기억하기 쉬운 글자로 저장
3) 쉘을 사용하는 경우
- 서버에 접속해서 사용하는 경우
- crontab 등 Linux의 내장 기능을 활용하는 경우
- 데이터 전처리를 하기 위해 쉘 커맨드를 사용
- Docker를 사용하는 경우
- 수백대의 서버를 관리하는 경우
- jupyter notebook의 cell에서 앞에 !를 붙이면 쉘 커맨드가 사용됨
- 터미널에서 python3, jupyter notebook도 쉘 커맨드
- Test Code를 실행하는 경우
- 배포 파이프라인을 실행하는 경우(Github Action 등에서 실행)
4) 기본 쉘 커맨드
- man : 매뉴얼 문서 (종료 -> ':q')
- mkdir : 폴더 생성(make directory)
- ls : 현재 위치에 있는 폴더, 파일 확인 (list segments)
- 옵션
- -a : .으로 시작하는 파일, 폴더 포함 전체 출력
- -l : 퍼미션, 소유자, 만든 날짜, 용량까지 출력
- -h : 용량을 사람이 읽기 쉽게 GB, MB 등 으로 표현. -l과 같이 사용
- ls ~
- ls
- ls -al
- ls -lh
- 옵션
- pwd : 현재 폴더 경로를 절대 경로로 보여줌
- cd : 폴더 변경, 폴더로 이동
- echo : 터미널에 텍스트 출력( python print와 유사)
- 1왼쪽에 있는 backtick사이에 쉘커맨드 입력 시 쉘 커맨드 결과 출력
echo `pwd`
- 1왼쪽에 있는 backtick사이에 쉘커맨드 입력 시 쉘 커맨드 결과 출력
- vi : vim 편집기로 파일 생성
- vi vi-test.sh
- 새로운 창이 뜨면 i를 눌러서 INSERT 모드로 변경
- Command Mode
- vi 실행 직후 기본 모드
- dd : 현재 위치한 한 줄 삭제
- i : INSERT 모드로 변경
- x : 커서가 위치한 곳의 글자 1개 삭제(5x : 글자 5개 삭제)
- yy : 현재 줄을 복사
- p : 현재 커서가 있는 줄 바로 아래 붙여넣기
- k/j : 커서 위로 / 아래로
- l/h : 커서 오른쪽으로 / 왼쪽으로
- Insert Mode
- 파일을 수정할 수 있는 모드
- 다시 Command Mode로 가고 싶다면 ESC 입력
- Last Line Mode
- Insert Mode에서 ESC를 누른 후 콜론(:)을 누르면 나오는 Mode
- w : 현재 파일명으로 저장
- q : vi종료(저장되지 않음)
- q!: vi 강제 종료(!는 강제를 의미)
- wq : 저장한 후 종료
- \문자 : 문자 탐색 - 탐색 후 n을 무르면 계속 탐색 실행
- set nu : vi 라인 번호 출력
- bash : 쉘 스크립트 실행
- sudo : 관리자 권한으로 실행
- 관리자 권한 실행은 조심해서 사용
- 프로그램이 꼬일 수 있으므로 설치 할 때 sudo 대신 --user 사용 권장
- cp : 파일 또는 폴더 복사
- -r : 디렉토리를 복사할 때 디렉토리 안에 파일이 있으면 recursive하게 모두 복사
- -f : 복사할 때 강제로 실행
- mv : 파일, 폴더 이동하기(또는 이름 바꿀 때 활용)
- cat: 특정 파일 내용 출력(concatenate)
- 여러 파일을 인자로 주면 합쳐서 출력
- clear : 터미널 창을 깨끗하게
- history : 최근에 입력한 쉘 커맨드 history 출력
- history 결과에서 숫자가 나오는데 !붙이고 숫자 입력 시 그 커맨드를 다시 활용할 수 있음
- find: 파일 및 디렉토리를 검색할 때 사용
- find . -name 'File' : 현재 폴더에서 File이란 이름을 가진 파일 및 디렉토리 검색
- export : 환경 변수 설정
- export water='물'
- echo $water => 물
- export로 환경변수 설정한 경우, 터미널이 꺼지면서 사라지게 됨
- 매번 쉘을 실행할 때마다 환경변수를 저장하고 싶으면 .bashrc, .zshrc에 저장하면 됨
- (Linux) vi ~/.bashrc 또는 vi ~/.zshrc
- 파일 제일 하단에 export water='물'을 저장하고 나옴(ESC:wq)
- 그 후 source ~/.bashrc 또는 source ~/.zshrc 입력
- Linux 환경 설정을 재로그인 하지 않고 즉시 적용하고 싶을 때 source 사용
- alias : 기본 명령어를 간단히 줄일 수 있음
- 터미널에 alias라고 치면 현재 별칭으로 설정된 것을 볼 수 있음
5) 추가 쉘 커맨드
- head/tail -n : 파일의 앞/뒤 n행 출력
- sort : 행 단위 정렬
- -r : 정렬을 내림차순으로 정렬(default는 오름차순)
- -n : numeric sort
- 사용 예 ) cat fruits.txt | sort
- uniq : 중복된 행이 연속으로 있는 경우 중복 제거
- 자주 sort와 함께 사용
- -c : 중복 행의 개수 출력
- 사용 예) cat fruits.txt | sort | uniq
- grep : 파일에 주어진 패턴 목록과 매칭되는 라인 검색
- -i: insensitively하게, 대소문자 구분 없이 찾기
- -w : 정확히 그 단어만 찾기
- -v : 특정 패턴 제외한 결과 출력
- -E : 정규 표현식 사용
- 정규 표현식 패턴
- ^단어 : 단어로 시작하는 것 찾기
- 단어$ : 단어로 끝나는 것 찾기
- . : 하나의 문자 매칭
- 정규 표현식 패턴
- cut : 파일에서 특정 필드 추출
- -f : 잘라낼 필드 지정
- -d : 필드를 구분하는 구분자. default는 \t
6) 표준 스트림(Stream)
- Unix 내에서 동작하는 프로그램은 커맨드 실행시 3개의 stream 이 생성
- stdin : 0으로 표현, 입력
- stdout : 1로 표현, 출력
- stderr : 2로 표현, 디버깅 정보나 에러 출력
7) Redirection & Pipe
-
Redirection : 프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달
- > : 덮어 쓰기. 파일이 없으면 생성하고 저장
- >> : 이어서 쓰기(맨 아래에 추가하기)
- 예) echo 'hi' > vi-test.sh
- 예) echo 'hi' >> vi-test.sh
-
Pipe(|) : 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용하고 싶은 경우
- A의 output을 B의 input으로 사용(다양한 커맨드를 조합)
- 예) 현재 폴더에 있는 파일 명 중 vi가 들어간 단어를 찾고 싶은 경우
- ls | grep "vi"
-
연습 문제
- test.txt 파일에 'hi!!!'를 입력(vi 사용 금지)
- test.txt 파일 맨 아래에 'kkkkk'를 입력(vi 사용 금지)
- test.txt 파일의 라인 수를 구하라.(hint : wc -l)
echo 'hi!!!' > test.txt echo 'kkkkk' >> test.txt cat test.txt | wc -l
8) 서버에서 자주 사용되는 쉘 커맨드
- ps : 현재 실행되고 있는 프로세스 출력하기
- -e : 모든 프로세스
- -f : full format으로 자세히 보여줌
- curl : request를 할 수 있는 명령어, 웹서버를 작성한 후 요청이 제대로 실행하는지 확인 가능(client url)
- curl외에 httpie도 있음(더 가독성 있게 출력)
- df : 현재 사용중인 디스크 용량 확인
- -h: 사람이 읽기 쉬운 형태로 출력
- scp : SSH를 이용해 네트워크로 연결된 호스트 간 파일을 주고 받는 명령어 (secure copy)
- -r : 재귀적으로 복사
- -P : ssh포트 지정
- -i : ssh 설정을 활용해 실행
- 예) scp local_path user@ip:remote_directory user2@ip:target_remote_directory (local=> remote)
- nohup : 터미널 종료 후에도 게속 작업이 유지되도록 실행(백그라운드 실행)
- 예 ) nuhup python3 app.py &
- nohup으로 실행된 파일은 permission이 755이어야 함
- 종료는 ps ef|grep app.py한 후, pid(Process ID) 찾은 후 kill -9 pid로 프로세스 종료
- 로그는 nohup.out에 저장됨
- nohup 외에도 screen 이라는 도구도 존재
- chmod : 파일의 권한을 변경하는 경우 사용
- 유닉스에서 파일이나 디렉토리의 시스템 모드를 변경
- Permission
- r = Read(읽기), 4
- w = Write(쓰기), 2
- x = eXecute(실행하기), 1
- - = Denied
- ex) r-x : 읽거나 실행할 수 있지만 수정은 불가능
- ex) 755로 퍼미션 주세요!
-> (user=7, group=5, 기타 사용자=5) = (rwx =4+2+1 = 7, rx = 5, rx = 5)
9) 쉘 스크립트
- .sh 파일을 생성하고, 그 안에 쉘 커맨드 추가
- 파이썬처럼 if,while, case 문이 존재하며 작성 시 bash name.sh로 실행 가능
- 쉘스크립트 = 쉘커맨드의 조합
- 일단은 쉘 커맨드에 익숙해진 후, 추후에 스크립트도 생성해보기
- 참고 자료
https://github.com/zzsza/shell-scripts
https://github.com/denysdovhan/bash-handbook
https://github.com/epety/100-shell-script-examples
과제
카카오톡 그룹 채팅방 내용을 csv로 저장 후, 쉘 커맨드 한 줄로 카카오톡 대화방에서 2021년에 제일 메세지를 많이 보낸 top 3명 추출하기!
Author And Source
이 문제에 관하여([AI 서비스 개발 개론] Product Serving - Linux & Shell Command), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sujeongim/AI-서비스-개발-개론-Product-Serving-Linux-Shell-Command저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)