이번 포스팅에서는 GitHub 간단 사용법에 대해서 소개하겠습니다.

 

GitHub은 여러 명의 개발자들이 언제 어디서나 협업을 하면서 코드를 공유하고 버전 관리를 할 수 있게 해주는 분산형 Git Repository 호스팅 서비스 플랫폼입니다.

 

GitGitHub은 다른 것인데요, Stackoverflow[1]에 둘을 비교 설명한 내용이 있어서 소개합니다.

 


Git은 버전 관리 시스템이며소스 코드 이력을 관리하는 툴입니다

(Git is a revision control system, a tool to manage your source code history.)


GitHub은 Git repositories를 위한 호스팅 서비스 입니다

(GitHub is a hosting service for Git repositories.)


따라서 Git과 GitHub은 똑같은 것이 아닙니다

Git 은 툴이며, GitHub은 Git을 사용하는 프로젝트를 위한 서비스입니다. 

(So they are not the same thing: Git is the toolGitHub is the service for projects that use Git.)

 



Git
은 리눅스의 창시자인 Linus Torvalds2005년에 기존의 리눅스 커널 개발에 사용하고 있던 버전 관리 시스템의 라이센스가 변경되면서 새로운 시스템을 찾는 과정에서 Git 
을 만들었다고 합니다. (진정 Linux Torvalds는 오픈소스계의 아버지인가 봅니다!)[2]

 

아이러니 한 것은 오픈소스에 적대적이었던 마이크로소프트가 세계 최대 오픈소스 공유 플랫폼인 GitHub2018 6월에 75억 달러(8조원)에 인수를 했다는 점입니다. 세상 참 오래 살고 볼 일입니다. (MS에 대한 불신 때문일까요? MSGitHub 인수 발표 이후에 GitHub과 같은 Git Repository 호스팅서비스인 GitLab으로 망명하는 개발자들도 있습니다)

 

만약 이 포스팅을 보고 있는 분이 팀으로 협업을 하는 개발자가 아니라면, 개인용 랩탑 컴퓨터로 R이나 Python, SAS, MATLAP 등으로 혼자 분석 업무 만 담당하는 분이라면 GitHub을 왜 써야 하나(Why GitHub?) 궁금증이 생길 것입니다. 아래의 그림은 Vincent Driessen 이라는 개발자께서 ‘A successful Git branching model’[3]이라는 제목으로 Why Git?, Decentralized but centralized, The main branches, Supporting branches 등에 대해서 블로그에 소개한 내용입니다. 시간의 흐름에 따라서 여러 명의 개발자가 협업하면서 코드 버전을 관리하는 과정을 볼 수 있을 텐데요, Git과 같은 버전관리 시스템이 없다면 무척 애를 먹을 것이라고 예상할 수 있습니다


비단 협업 뿐만이 아니더라도, 분석가가 여러 버전의 분석 코드를 작성하다 보면 그저께 코딩했던 데이터 전처리 R코드가 어디있더라?’, ‘어제 분석했던 Random Forest Hyperparameter 설정값을 수정하고 덮어써버렸네뭐였더라?’, ‘000로 부터 그저께 Python 코드를 이메일로 받았었는데 그게 어디있지?’와 같은 종류의 어려움에 처할 수 있는데요, 버전 관리 시스템이 있다면 이를 피할 수 있게됩니다.

 


[ 그림 1. A successful Git branching model (by Vincent Driessen) ]


* Source: https://nvie.com/posts/a-successful-git-branching-model/

 


코드 버전 관리를 도와주는 버전 관리 시스템은 크게 (1) 로컬 버전 관리 시스템 (Local Version Control System), (2) 중앙 집중식 버전 관리 시스템 (Centralized Version Control System), (3) 분산 버전 관리 시스템(Distributed Version Control System)으로 구분할 수 있으며, Git은 이중에서 분산 버전 관리 시스템에 해당합니다.

(* Reference: https://git-scm.com/book/ko/v1)

 

 

[ 그림 2. 버전 관리 시스템 (Version Control System) ]

 


 

중앙 집중식 버전 관리 시스템(Subversion, Perforce )은 사용 방법이 분산형 대비 상대적으로 쉽다는 장점이 있습니다. 하지만 코드가 저장되어 있는 중앙 서버에 장애가 발생했다 거나, 개발자 중에 한명이 코드 커밋을 완료하지 않고 퇴근을 해버린다거나 하면 버전 관리 기능이 마비가 되어 협업을 할 수가 없는 단점이 있습니다.

 

분산 버전 관리 시스템은 중앙 집중식 버전 관리 시스템과 장점과 단점이 정반대입니다. 장점으로는 클라이언트가 저장소 자체를 복제하게 되므로 중앙 서버에 장애가 발생해도 클라이언트에서 개발 작업을 진행하는데 문제가 없으며, 여러 그룹과 협업을 진행하는데도 문제가 없습니다. 반면에, 처음 분산형을 사용하는 분이라면 전체 구조와 흐름을 이해하고 능숙하게 사용하는데 (중앙 집중형 대비 상대적으로) 어렵다는 단점이 있습니다.

(저는 5년 전에 Coursera에서 처음으로 GitHub에 대해 20여분짜리 동영상 강의를 접하였었는데요, 뭐가 여기 저기를 왔다 갔다 하는데요, 강사가 무슨 얘기를 하는지 도통 이해할 수가 없었던 기억이 있습니다. ‘그냥 코드 카피해서 게시판에 페이스트 해서 숙제 제출하면 안되나?’ 라고 투덜거렸었습니다. ^^;)

 

아래의 그림3은 GitHub에서 여러 명의 개발자가 협업을 할 때, 소스 코드를 수정하고 이를 소스 코드에 반영해달라고 요청하는 Pull Request를 하는 절차를 도식화한 것입니다. [2] 클라우드 상의 GitHub에서 타인의 git과 자기의 git 사이의 흐름, 그리고 자신의 로컬 개발환경 사이의 전체 흐름에 대해서 살펴보면 GitHub의 사용 절차를 이해하는데 도움이 될 것이라고 생각합니다.


아래의 그림3 에서는 (1) 다른 사람의 master branch를 자신의 github으로 Fork 해서 (2) 로컬 개발환경으로 pull 하고, (3) topic branch를 만들어서 (4) 수정 작업을 한 후, (5) 자신의 github에 원격 branch 작성을 push하고, (6) original master branch를 가진 사람에게 pull request를 전송해서 피드백을 요청하면, (7) original master branch 주인이 pull request를 열고 차이점을 비교한 후 만족스러우면 merge 하는 절차입니다. 



[ 그림 3. Git Pull Request Workflow ]

 

 

 

최근 Mac 에는 Git이 기본으로 설치되어 있으며, 리눅스나 윈도우즈는 자신이 사용하는 종류에 맞게 다운받아서 설치를 해주어야 합니다. Git 설치는 https://git-scm.com/book/ko/v2/시작하기-Git-설치를 참고하세요. [4]

 

GitHub.com account 생성 및 SSH 인증(https://github.com/join)을 모두 끝마쳤다는 가정 하에 이제부터 GitHub의 간단한 사용을 예를 들어서 소개하겠습니다

 

아래의 예는 GitHub hello world (https://guides.github.com/activities/hello-world/) 튜토리얼을 한글로 번역한 내용입니다. [5]  위의 그림3은 다른 사람의 git을 fork 하는 것으로 시작하는데요, 아래의 예는 좀더 간단하게 다른 사람의 git이 아니라 자기 자신의 github 안의 repository 를 가지고 pull request 해보는 예입니다. pull request 는 Git의 꽃이므로 정확하게 이해하는게 좋겠습니다. 


  • Repository 생성하고 사용하기
  • 새로운 Branch 시작하고 관리하기
  • 파일에 변경사항 만들고 GitHubpush 하기 (commit)
  • Pull request 열고 합치기(merge)

 

[1 단계] Repository 생성


Repository는 보통 하나의 프로젝트를 구성하기 위해 사용합니다. Repository는 여러 개의 폴더, 파일, 이미지, 동영상, 데이터셋을 가질 수 있습니다. Repository에 코드를 저장하고, 다른 개발자와 코드를 공유하며, 의견도 나누고, 코드 수정도 같이 할 수 있습니다.

 

(1)   GitHub.com 의 우측 상단에 ‘+’ 메뉴를 클릭한 후,

(2)   ‘New repository’ 하위 메뉴를 선택하면 아래와 같은 화면이 나타납니다.

(3)   Repository name‘hello-world’라고 이름을 기입해주고,

(4)   ‘Public’ 외부 공개 모드를 선택해주세요. 참고로, Private은 비공개인 대신에 유료 서비스 입니다.

(5)   ‘Initialize this repository with a README’ 를 선택 후 ‘Create repository’ 단추를 눌러주세요.




 

짜잔~! ‘hello-world’ Repository가 생성되었습니다.



 

 

[2 단계] Branch 생성

 

Repository에 다른 버전의 작업을 할 때 새로운 Branch를 만듭니다. Repository를 처음 만들면 디폴트 설정으로 master 라는 이름의 최종적인 Branch가 만들어집니다. Branch에서 작업을 실험도 하고 수정을 한 후에 master에 커밋합니다.

 Master branch에서 새로운 branch를 만들게 되면 그 시점의 master를 그대로 복사합니다. 만약 당신이 당신의 branch에서 작업을 하는 동안 다른 누군가가 master branch에서 수정을 한 경우에 당신은 변경사항을 pull해서 가져올 수 있습니다.

 

아래의 다이어그램은 [5]

Ÿ   Master branch 에서

Ÿ   Feature라는 이름의 새로운 branch를 생성하고,

Ÿ   Pull request 와 변경했으면 하는 사항에 대한 토론을 진행한 후,

Ÿ   Master branch ‘feature branch’를 병합(merge)하는

작업 절차를 보여줍니다.

 

 

 

새로운 branch를 만드는 방법은

(1)   ‘hello-world’ repository로 가서

(2)   ‘branch: master’라는 파일 리스트의 제일 위에 있는 drop down 메뉴를 선택 후

(3)   Branch 텍스트 상자에 ‘readme-edits’이라는 이름의 Branch 이름을 입력하고,

(4)   파란색의 ‘Create branch’ 상자를 선택하거나 키보드의 ‘Enter’를 치면 됩니다.

 

이제 ‘hello-world’ repository 안에 ‘master’ branch 그리고 master branch를 복사한 ‘readme-edits’ branch의 두개 branch가 생겼습니다.

 

 


[3 단계] 수정 후 commit 하기

 

(1)   README.md 파일을 선택 후 우측 상단의 연필 모양 아이콘을 클릭

(2)   편집창에서 수정사항 쓰기

(3)   편집창 아래에 있는 ‘commit message’란에 수정사항에 대한 부연설명 쓰기
(
무엇을, 왜 수정했는가를 써서 다른 개발자가 쉽게 이해할 수 있도록)

(4)   ‘Commit changes’ 단추 클릭

하면 Master에서 복사한 ‘readme-edits’ branch를 수정할 수 있습니다. 이제 애초의 master branch와 방금 수정한 readme-edits branch는 서로 다른 branch가 되었습니다.

 



 

 

[4 단계] Pull Request 열기

 

Pull Request를 통해서 당신이 만든 수정사항을 제안하고 다른 사람이 검토해줄 것을 요청하며 수정사항을 master branch에 반영하도록 할 수 있습니다. Pull Request master branch와 새로 만든 branch 간의 다른 점(differences, diffs)을 녹색이나 빨간색으로 보여줍니다. 


GitHub @mention 시스템을 이용하여 특정 팀이나 사람에게 피드백을 요청할 수도 있습니다.


(1)   Pull Request 탭을 클릭하여 나타난 페이지에서 ‘New pull request’ 단추를 클릭



 

(2)   변경점 비교 창에서 비교를 하려고 하는 ‘readme-edits’ branch를 선택하면 master branch와 차이점을 비교하게 됩니다. 비교 페이지에서 추가(+), 삭제(-), 변경사항을 살펴봅니다.



 

(3)   비교한 변경사항이 원하는 내용임을 확인하였으면 Pull request의 제목과 설명을 추가한 후에 ‘Create pull request’ 단추를 누릅니다.

 


 

 

[5 단계] Pull Request 합치기 (merge)

 

마지막 단계로서, ‘readme-edits’ branch에서 수정한 사항을 원래의 master branch에 합쳐보겠습니다.

 

(1)   Master branch에 변경점을 반영하기 위해 ‘Merge pull request’ 녹색 단추 클릭

(2)   ‘Confirm merge’ 클릭

(3)   변경사항이 master branch에 모두 반영이 되었으므로 ‘Delete branch’ 자주색 단추를 눌러서 ‘readme-edits’ branch 삭제하기


 

드디어 pull requestoriginal master branch에 합치는 것을 끝마쳤습니다. ^^b

‘readme-edits’ branch에서 수정했던 사항들이 original ‘master’ branch에 합쳐진 것을 확인할 수 있습니다.



다음번 포스팅에서는 터미널에서 Git을 사용해서 GitHub Repository에 commit 하는 방법을 소개하겠습니다. 


많은 도움이 되었기를 바랍니다. 

 

* Reference

[1] https://stackoverflow.com/questions/13321556/difference-between-git-and-github

[2] ‘소셜 코딩으로 이끄는 GitHub 실천 기술’, 오오츠카 히로키 지음/윤인성 옮김, Jpub

[3] https://nvie.com/posts/a-successful-git-branching-model/

[4] Git 설치 및 명령어 참고: https://git-scm.com/

[5] GitHub hello world: https://guides.github.com/activities/hello-world/

 

Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 리눅스 정규 표현식 (Linux Regular Expression)에 대해서 알아보겠습니다. 


정규 표현식은 데이터 검색, 복잡한 패턴 매칭을 도와주는 특별한 문자입니다. 정규표현식(regular expression)은 줄여서 'regexp' 또는 'regex' 라고도 합니다. 


정규 표현식은 리눅스 뿐만 아니라 유닉스, SQL, R, Python 등 에서도 사용할 수 있습니다. 지난번 포스팅에서 소개했던 grep 문과 함께 사용하면 정말로 강력하게 문자열 패턴 매칭, 검색을 할 수가 있습니다. 


정규 표현식(Regular expressions)에 대해서 모르는 상태에서 다른 사람이 짜놓은 정규 표현식을 처음으로 보게 되면 '에잉? 이게 뭐지? 갓난 아기가 컴퓨터 자판를 가지고 마구잡이로 장난하면서 두둘겨 놓은건가?' 이런 생각이 들겁니다.  알면 해독이 되는데요, 모르면 도통 이게 뭐에 쓰는 물건인가, 이게 프로그래밍 언어 맞나 싶게 요상하게 보이거든요. ^^;  암튼, 알아두면 문자열 패턴 매칭, 검색 시 정말 유용합니다. 



정규 표현식에는 3가지 유형이 있습니다. 


  • 기본 정규 표현식 (Basic Regular Expressions)
  • 간격 정규 표현식 (Interval Regular Expressions)
  • 확장 정규 표현식 (Extended Regular Expression)





다음은 예제로 사용할 텍스트 문서입니다. 



[MacBook-Pro:Documents rfriend$ cat mylove.txt 

drum

photography

data science

greenplum

python

R

book

movie

dancing

singing

milk

english

gangnam style

new face

soccer

pingpong

sleeping

martial art

jogging

blogging

apple

grape

banana

tomato

bibimbab

kimchi

@email

123_abc_d4e5

xyz123_abc_d4e5

123_abc_d4e5.xyz

xyz123_abc_d4e5.xyz

 



먼저 기본 정규 표현식 (Basic Regular Expressions)을 예를 들어서 살펴보겠습니다. 

정규표현식은 큰 따옴표(" ")안에 매칭할 문자와 함께 사용합니다.  



1. 문자열의 처음 시작 부분 매칭: ^


참고로 -n 은 행번호를 출력하라는 뜻입니다. 



[MacBook-Pro:Documents rfriend$ grep -n "^m" mylove.txt 

8:movie

11:milk

18:martial art

 




2. 문자열의 끝 부분 매칭$



[MacBook-Pro:Documents rfriend$ grep -n "m$" mylove.txt 

1:drum

4:greenplum

 




3. 점의 개수만큼 아무 문자나 대체: ...



[MacBook-Pro:Documents rfriend$ grep -n "m..." mylove.txt 

8:movie

11:milk

13:gangnam style

18:martial art

24:tomato

25:bibimbab

26:kimchi


[MacBook-Pro:Documents rfriend$ grep -n "m......" mylove.txt 

13:gangnam style

18:martial art


[MacBook-Pro:Documents rfriend$ grep -n "..m..." mylove.txt 

13:gangnam style

24:tomato

25:bibimbab

26:kimchi


[MacBook-Pro:Documents rfriend$ grep -n "....m" mylove.txt 

4:greenplum

13:gangnam style

25:bibimbab

 




4. * 부호 앞의 문자와 여러개 매칭 : *



[MacBook-Pro:Documents rfriend$ grep "app*" mylove.txt 

photography

apple

grape


[MacBook-Pro:Documents rfriend$ grep "^app" mylove.txt 

apple

 




5. 특수 문자와 매칭\



[MacBook-Pro:Documents rfriend$ grep "\@" mylove.txt 

@email

 




6. a나 b로 시작하는 모든 행을 찾아서 출력 : ^[ab]



[MacBook-Pro:Documents rfriend$ grep "^[ab]" mylove.txt 

book

blogging

apple

banana

bibimbab

 




7. 0~9 사이 숫자로 시작하는 단어 :  ^[0-9]



[MacBook-Pro:Documents rfriend$ grep ^[0-9] mylove.txt 

123_abc_d4e5

123_abc_d4e5.xyz

 




8. x~z 사이 알파벳으로 끝나는 단어 : [a-e]$



[MacBook-Pro:Documents rfriend$ grep [x-z]$ mylove.txt 

photography

123_abc_d4e5.xyz

xyz123_abc_d4e5.xyz

 




다음의 예는 간격 정규 표현식(Interval Regular Expressions) 입니다.  

간격 정규 표현식은 문자열 안에서 특정 문자가 몇 번 출현 했는지를 가지고 패턴 매칭할 때 사용합니다. 


9. 앞의 문자와 'n'번 정확하게 매칭: {n}


grep -E "character"\{n} 의 형식으로 사용합니다. 



[MacBook-Pro:Documents rfriend$ grep "g" mylove.txt 

photography

greenplum

dancing

singing

english

gangnam style

pingpong

sleeping

jogging

blogging

grape


[MacBook-Pro:Documents rfriend$ grep -E "g"\{2} mylove.txt 

jogging

blogging

 




마지막으로, 확장 정규 표현식(Extended Regular Expressions) 입니다.  확장 정규 표현식은 한 개 이상의 표현식(combinations of more than one expressions)을 결합하여 사용할 수 있게 해줍니다. 



10. \+ 앞의 문자가 한번 이상 출현한 문자열과 매칭 \+



[MacBook-Pro:Documents rfriend$ grep "k" mylove.txt 

book

milk

kimchi


-- 문자 'k'의 앞에 'o'가 출현한 문자열만 선별하고 싶은 경우 "o\+k" 정규표현식 사용

[MacBook-Pro:Documents rfriend$ grep "o\+k" mylove.txt 

book

 



* Reference : https://www.guru99.com/linux-regular-expressions.html


많은 도움이 되었기를 바랍니다. 

Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 리눅스의 grep 을 사용하여 하나의 파일이나 디렉토리 안의 여러개의 파일에서 특정 패턴에 매칭되는 행을 찾아서 출력하는 다양한 옵션, 방법을 소개하겠습니다.  특히 정규 표현식(regular expression) 까지 함께 사용하면 매우 강력하게 파일 내 특정 패턴을 찾을 수 있어서 굉장히 유용합니다. 



[ LINUX grep command : 문자열 패턴 검색 후 출력 ]





먼저, 예제로 사용할 수 있도록 demo_file.txt의 텍스트 파일을 준비하였습니다. 



[MacBook-Pro:~ rfriend$ ssh gpadmin@192.168.188.131

gpadmin@192.168.188.131's password: xxxxxxxx

Last login: Sat Dec  9 01:06:33 2017 from 192.168.188.1

[gpadmin@mdw ~]$ ls -al

합계 544860

drwx------  8 gpadmin gpadmin      4096 2017-12-09 01:12 .

drwxr-xr-x. 4 root    root         4096 2017-11-08 20:04 ..

-rw-------  1 gpadmin gpadmin      4792 2017-12-09 01:10 .bash_history

-rw-r--r--  1 gpadmin gpadmin        18 2014-10-16 22:56 .bash_logout

-rw-r--r--  1 gpadmin gpadmin       398 2017-12-04 13:45 .bash_profile

-rw-r--r--  1 gpadmin gpadmin       124 2014-10-16 22:56 .bashrc

-rw-rw-r--  1 gpadmin gpadmin        28 2017-11-08 20:12 .gphostcache

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-04 13:43 .oracle_jre_usage

-rw-------  1 gpadmin gpadmin        32 2017-11-08 20:21 .pgpass

-rw-rw-r--  1 gpadmin gpadmin         0 2017-11-08 20:21 .pgpass.1510140115

-rw-------  1 gpadmin gpadmin      2066 2017-12-09 00:21 .psql_history

drwx------  2 gpadmin gpadmin      4096 2017-11-08 20:05 .ssh

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-06 20:10 command

-rw-r--r--  1 gpadmin gpadmin       233 2017-12-09 01:12 demo_file.txt

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-08 09:45 gpAdminLogs

drwxr-xr-x  2 gpadmin gpadmin      4096 2017-11-08 20:14 gpconfigs

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-07 20:29 gptext

-rwxr-xr-x  1 gpadmin gpadmin      2916 2017-12-04 13:42 gptext_install_config

-rwxr-xr-x  1 gpadmin gpadmin 192264305 2017-09-19 09:20 greenplum-text-2.1.3-rhel6_x86_64.bin

-rw-r--r--  1 gpadmin gpadmin 191435368 2017-12-04 12:36 greenplum-text-2.1.3-rhel6_x86_64.tar.gz

-rw-r--r--  1 gpadmin gpadmin 174157387 2017-12-04 13:28 jdk-8u161-linux-x64.rpm


[gpadmin@mdw ~]$ cat demo_file.txt

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.


[gpadmin@mdw ~]$ 

 



grep 의 기본 syntax 는 다음과 같습니다. 


  grep [OPTIONS] PATTERN [FILE...] 



하나씩 예를 들어가면서 설명하겠습니다. 




1. 하나의 파일에서 한개의 패턴을 검색하여 해당되는 행 출력하기: grep PATTERN [FILE]



[gpadmin@mdw ~]$ grep "line" demo_file.txt

this line is the 1st lower case line in this file.

Two lines above this line is empty.

And this is the last line.

[gpadmin@mdw ~]$ 

 




2. grep 검색 패턴에 맞는 부분은 색깔을 다르게 해서 보기: --color



[gpadmin@mdw ~]$ grep  --color  "line"  demo_file.txt

this line is the 1st lower case line in this file.

Two lines above this line is empty.

And this is the last line.

[gpadmin@mdw ~]$ 

 



grep --color 앞부분에 GREP_COLOR="1;32" 로 패턴과 매칭되는 부분의 색깔을 지정할 수 있습니다. 

  • GREP_COLOR="1;32"  : 초록색 (green)
  • GREP_COLOR=:1;34"  : 보라색 (violet)
  • GREP_COLOR="1;36"  : 하늘색 (light blue)




3. 대소문자 구분없이(case in-sensitive) 패턴 검색하여 행 출력: -i


2번에서는 검색이 안되었던 대문자 "LINE"도 이번에는 검색이 되었습니다. 



[gpadmin@mdw ~]$ grep  --color  -i  "line"  demo_file.txt

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.

[gpadmin@mdw ~]$ 

 




4. 파일 이름에 와이드카드 *(Asterisk)를 사용하여 다수의 파일에서 패턴 검색하여 행 출력: filename*.txt


먼저 cp를 사용하여 demo_file.txt 파일을 demo_file2.txt 라는 파일 이름으로 복사를 해서 2개의 파일을 만들었습니다. 



[gpadmin@mdw ~]$ cp  demo_file.txt  demo_file2.txt




다음으로 파일 이름의 중간에 와이드카드 '*(Asterisk)'를 사용하여 파일 이름 demo_*.txt 에서 * 부분에 무엇이 있든지 간에 이에 해당하는 다수의 파일을 찾아서 패턴 검색 후 출력을 하게 됩니다. 3번에서와는 달리 이번에는 출력이 될 때 파일 이름(demo_file.txt, demo_file2.txt)이 행의 출력 맨 앞 부분에 나타납니다. 



[gpadmin@mdw ~]$ grep --color -i "line" demo_*.txt

demo_file.txt:THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

demo_file.txt:this line is the 1st lower case line in this file.

demo_file.txt:This Line Has All Its First Character Of The Word With Upper Case.

demo_file.txt:Two lines above this line is empty.

demo_file.txt:And this is the last line.

demo_file2.txt:THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

demo_file2.txt:this line is the 1st lower case line in this file.

demo_file2.txt:This Line Has All Its First Character Of The Word With Upper Case.

demo_file2.txt:Two lines above this line is empty.

demo_file2.txt:And this is the last line.





5. 서브 디렉토리까지 반복적으로 패턴 검색하여 행 출력: * (Asterisk only, without filename)



[gpadmin@mdw ~]$ grep  --color -i  "line"  *

demo_file.txt:THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

demo_file.txt:this line is the 1st lower case line in this file.

demo_file.txt:This Line Has All Its First Character Of The Word With Upper Case.

demo_file.txt:Two lines above this line is empty.

demo_file.txt:And this is the last line.

demo_file2.txt:THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

demo_file2.txt:this line is the 1st lower case line in this file.

demo_file2.txt:This Line Has All Its First Character Of The Word With Upper Case.

demo_file2.txt:Two lines above this line is empty.

demo_file2.txt:And this is the last line.

greenplum-text-2.1.3-rhel6_x86_64.bin:support, invoicing, and online services. Licensee is responsible for obtaining

greenplum-text-2.1.3-rhel6_x86_64.bin:    if tablog.getNumLines() > 1:

greenplum-text-2.1.3-rhel6_x86_64.bin:        for line in open(to_append_file).readlines():

greenplum-text-2.1.3-rhel6_x86_64.bin:            line = line.strip()

greenplum-text-2.1.3-rhel6_x86_64.bin:            if line.startswith('#') or line == '':

greenplum-text-2.1.3-rhel6_x86_64.bin:            if len(line.split()) != 1:

greenplum-text-2.1.3-rhel6_x86_64.bin:        for line in open(to_append_file).readlines():

greenplum-text-2.1.3-rhel6_x86_64.bin:            line = line.strip()

greenplum-text-2.1.3-rhel6_x86_64.bin:            if line.startswith('#') or line == '':

greenplum-text-2.1.3-rhel6_x86_64.bin:            if line.find('=>') == -1:

greenplum-text-2.1.3-rhel6_x86_64.bin:            parts = line.split('=>')

greenplum-text-2.1.3-rhel6_x86_64.bin:        for line in open(to_append_file).readlines():

greenplum-text-2.1.3-rhel6_x86_64.bin:            line = line.strip()

greenplum-text-2.1.3-rhel6_x86_64.bin:            if line.startswith('#') or line == '':

greenplum-text-2.1.3-rhel6_x86_64.bin:            if line.find('=>') != -1:

greenplum-text-2.1.3-rhel6_x86_64.bin:                parts = line.split('=>')

greenplum-text-2.1.3-rhel6_x86_64.bin:            sys.stdin.readline()

-- 중간 생략 --

Binary file greenplum-text-2.1.3-rhel6_x86_64.tar.gz matches

Binary file jdk-8u161-linux-x64.rpm matches





6. 검색 조건을 뒤집어서(invert), 매칭되지 않는 행을 검색하여 출력: -v



[gpadmin@mdw ~]$ cat demo_file.txt

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.

[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ grep  -i  -v  "case"  demo_file.txt


Two lines above this line is empty.

And this is the last line.





7. 매칭되는 행의 번호 같이 보기: -n



[gpadmin@mdw ~]$ grep  --color  --n  "case"  demo_file.txt

1:THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

2:this line is the 1st lower case line in this file.

3:This Line Has All Its First Character Of The Word With Upper Case.





8. 전체 행이 정확히 일치하는 행만 검색하여 출력: -x



[gpadmin@mdw ~]$ grep  -n  -x  "this line is the 1st lower case line in this file."  demo_file.txt

2:this line is the 1st lower case line in this file.





9. 각 인풋 파일의 매칭되는 행의 개수 출력: -c, --count



[gpadmin@mdw ~]$ grep  -c  "line"  demo_file.txt

3

[gpadmin@mdw ~]$ grep  --count  "line"  demo_file.txt

3





10. 패턴 매칭된 행의 전(Before), 후(After), 중간(Center)의 전/후 행 NUM 개수 만큼 같이 출력하기  : -B NUM, -A NUM, -C NUM



--   10-1. 패턴 매칭된 행의 이전(Before) 행도 NUM 개수 만큼 출력: -B NUM



[gpadmin@mdw ~]$ cat  demo_file.txt

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.


[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ grep  --color -n  -B 2 "First"  demo_file.txt

1-THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

2-this line is the 1st lower case line in this file.

3:This Line Has All Its First Character Of The Word With Upper Case.

[gpadmin@mdw ~]$ 

 



--   10-2. 패턴 매칭된 행의 이후(After) 행도 NUM 개수 만큼 출력: -A NUM



[gpadmin@mdw ~]$ cat demo_file.txt

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.


[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ grep  --color  -n  -A 2  "First"  demo_file.txt

3:This Line Has All Its First Character Of The Word With Upper Case.

4-

5-Two lines above this line is empty.

[gpadmin@mdw ~]$ 

 



--   10-3. 패턴 매칭된 행을 가운데(Center)에 두고 앞 뒤 행도 NUM 개수 만큼 출력: -C NUM



[gpadmin@mdw ~]$ cat demo_file.txt

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.


[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ grep --color -n  -C 2 "First" demo_file.txt

1-THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

2-this line is the 1st lower case line in this file.

3:This Line Has All Its First Character Of The Word With Upper Case.

4-

5-Two lines above this line is empty.

[gpadmin@mdw ~]$ 

 




11. 매칭되는 행의 개수가 NUM 을 넘으면 파일 읽기 중단: -m NUM



[gpadmin@mdw ~]$ grep  --color  -n  -i  -m 2  "line"  demo_file.txt

1:THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.

2:this line is the 1st lower case line in this file.

[gpadmin@mdw ~]$ 

 




12. 매칭되는 행 중에서 오직 일치하는(Only matching) 부분만 출력: -o, --only-matching



[gpadmin@mdw ~]$ grep  -n  -o  "First"  demo_file.txt

3:First

[gpadmin@mdw ~]$ grep  -n  --only-matching  "First"  demo_file.txt

3:First

 




13. 행 안에서 패턴과 매칭되는 위치(position)를 출력: -b



[gpadmin@mdw ~]$ grep  -o  -b "First" demo_file.txt

124:First

 




14. 패턴과 매칭되는 파일 이름 출력: -l



[gpadmin@mdw ~]$ grep  -l  "First"  demo_*

demo_file.txt

demo_file2.txt

 




15. grep 옵션 요약 출력 후 exit: --help


오늘 포스팅 내용 중에서 제일 중요한(?), 다른 건 다 까먹어도 이것 하나만 기억하고 있으면 든든한 옵션이 되겠습니다. 

도와주세요 help~!  ^^



[gpadmin@mdw ~]$ grep --help

사용법: grep [옵션]... 패턴 [파일]...

Search for PATTERN in each FILE or standard input.

PATTERN is, by default, a basic regular expression (BRE).

Example: grep -i 'hello world' menu.h main.c


Regexp selection and interpretation:

  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)

  -F, --fixed-strings       PATTERN is a set of newline-separated fixed strings

  -G, --basic-regexp        PATTERN is a basic regular expression (BRE)

  -P, --perl-regexp         PATTERN is a Perl regular expression

  -e, --regexp=PATTERN      use PATTERN for matching

  -f, --file=FILE           obtain PATTERN from FILE

  -i, --ignore-case         ignore case distinctions

  -w, --word-regexp         force PATTERN to match only whole words

  -x, --line-regexp         force PATTERN to match only whole lines

  -z, --null-data           a data line ends in 0 byte, not newline


Miscellaneous:

  -s, --no-messages         suppress error messages

  -v, --invert-match        select non-matching lines

  -V, --version             print version information and exit

      --help                display this help and exit

      --mmap                ignored for backwards compatibility


Output control:

  -m, --max-count=NUM       stop after NUM matches

  -b, --byte-offset         print the byte offset with output lines

  -n, --line-number         print line number with output lines

      --line-buffered       flush output on every line

  -H, --with-filename       print the filename for each match

  -h, --no-filename         suppress the prefixing filename on output

      --label=LABEL         print LABEL as filename for standard input

  -o, --only-matching       show only the part of a line matching PATTERN

  -q, --quiet, --silent     suppress all normal output

      --binary-files=TYPE   assume that binary files are TYPE;

                            TYPE is `binary', `text', or `without-match'

  -a, --text                equivalent to --binary-files=text

  -I                        equivalent to --binary-files=without-match

  -d, --directories=ACTION  how to handle directories;

                            ACTION is `read', `recurse', or `skip'

  -D, --devices=ACTION      how to handle devices, FIFOs and sockets;

                            ACTION is `read' or `skip'

  -R, -r, --recursive       equivalent to --directories=recurse

      --include=FILE_PATTERN  search only files that match FILE_PATTERN

      --exclude=FILE_PATTERN  skip files and directories matching FILE_PATTERN

      --exclude-from=FILE   skip files matching any file pattern from FILE

      --exclude-dir=PATTERN  directories that match PATTERN will be skipped.

  -L, --files-without-match  print only names of FILEs containing no match

  -l, --files-with-matches  print only names of FILEs containing matches

  -c, --count               print only a count of matching lines per FILE

  -T, --initial-tab         make tabs line up (if needed)

  -Z, --null                print 0 byte after FILE name


Context control:

  -B, --before-context=NUM  print NUM lines of leading context

  -A, --after-context=NUM   print NUM lines of trailing context

  -C, --context=NUM         print NUM lines of output context

  -NUM                      same as --context=NUM

      --color[=WHEN],

      --colour[=WHEN]       use markers to highlight the matching strings;

                            WHEN is `always', `never', or `auto'

  -U, --binary              do not strip CR characters at EOL (MSDOS)

  -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS)


`egrep' means `grep -E'.  `fgrep' means `grep -F'.

Direct invocation as either `egrep' or `fgrep' is deprecated.

With no FILE, or when FILE is -, read standard input.  If less than two FILEs

are given, assume -h.  Exit status is 0 if any line was selected, 1 otherwise;

if any error occurs and -q was not given, the exit status is 2.


Report bugs to: bug-grep@gnu.org

GNU Grep home page: <http://www.gnu.org/software/grep/>

General help using GNU software: <http://www.gnu.org/gethelp/>

[gpadmin@mdw ~]$ 

 



다음번 포스팅에서는 정규 표현식(regular expression)에 대해서 알아보겠습니다. 


많은 도움이 되었기를 바랍니다. 


* Reference: https://www.computerhope.com/unix/ugrep.htm








Posted by R Friend R_Friend

댓글을 달아 주세요

이번 포스팅에서는 Linux 위에 설치된 DB에 접속해서 분석을 하려고 했을 때 자주 사용하는 가장 기본적인 Linux Shell Script 를 소개하겠습니다. 


참고로, 저는 MacBook Pro, MacOS sierra를 사용하고 있구요, VMware에 Linux CentOS 6.6 version을 설치한 후, CentOS에 Greenplum Database 4.3.18 버전 (Master node 1, Segment node 1, Segment node 2)를 설치하여 사용하고 있습니다. 


아래의 예시는 Greenplum DB 에 연결해서 사용하는 Linux script 간단 예제가 되겠습니다. 



1. 파일 리스트 확인하기: ls


script

description 

  ls

  list files 

  ls -l

  list more info

  ls -a

  list all

  ls -t

  list by time

  ls -lat

  combine (list more info & all & by time)

  ls *sh

  파일 이름의 끝부분에 'sh'를 포함한 모든 파일 list




2. Terminal Console 창 지우기: clear




3. 파일의 텍스트 내용 확인하기: cat file_name



[gpadmin@mdw ~]$ ls -al

합계 544856

drwx------  8 gpadmin gpadmin      4096 2017-12-06 19:57 .

drwxr-xr-x. 4 root    root         4096 2017-11-08 20:04 ..

-rw-------  1 gpadmin gpadmin      4462 2017-12-09 00:21 .bash_history

-rw-r--r--  1 gpadmin gpadmin        18 2014-10-16 22:56 .bash_logout

-rw-r--r--  1 gpadmin gpadmin       398 2017-12-04 13:45 .bash_profile

-rw-r--r--  1 gpadmin gpadmin       124 2014-10-16 22:56 .bashrc

-rw-rw-r--  1 gpadmin gpadmin        28 2017-11-08 20:12 .gphostcache

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-04 13:43 .oracle_jre_usage

-rw-------  1 gpadmin gpadmin        32 2017-11-08 20:21 .pgpass

-rw-rw-r--  1 gpadmin gpadmin         0 2017-11-08 20:21 .pgpass.1510140115

-rw-------  1 gpadmin gpadmin      2066 2017-12-09 00:21 .psql_history

drwx------  2 gpadmin gpadmin      4096 2017-11-08 20:05 .ssh

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-06 20:10 command

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-08 09:45 gpAdminLogs

drwxr-xr-x  2 gpadmin gpadmin      4096 2017-11-08 20:14 gpconfigs

drwxrwxr-x  2 gpadmin gpadmin      4096 2017-12-07 20:29 gptext

-rwxr-xr-x  1 gpadmin gpadmin      2916 2017-12-04 13:42 gptext_install_config

-rwxr-xr-x  1 gpadmin gpadmin 192264305 2017-09-19 09:20 greenplum-text-2.1.3-rhel6_x86_64.bin

-rw-r--r--  1 gpadmin gpadmin 191435368 2017-12-04 12:36 greenplum-text-2.1.3-rhel6_x86_64.tar.gz

-rw-r--r--  1 gpadmin gpadmin 174157387 2017-12-04 13:28 jdk-8u161-linux-x64.rpm

[gpadmin@mdw ~]$

[gpadmin@mdw ~]$

[gpadmin@mdw ~]$ cd command

[gpadmin@mdw command]$ ls -al

합계 32

drwxrwxr-x 2 gpadmin gpadmin 4096 2017-12-06 20:10 .

drwx------ 8 gpadmin gpadmin 4096 2017-12-06 19:57 ..

-rw-rw-r-- 1 gpadmin gpadmin  830 2017-12-06 20:04 check_tb.txt

-rw-rw-r-- 1 gpadmin gpadmin   41 2017-12-06 20:10 gp_command.txt

[gpadmin@mdw command]$

[gpadmin@mdw command]$

[gpadmin@mdw command]$ cat gp_command.txt

# starting gpdb

gpstart -a

# stopping gpdb

gpstop -af


[gpadmin@mdw command]$ 

[gpadmin@mdw command]$ 

 



>> CentOS 버전 확인, Local Host 확인 하기: cat /etc/redhat-release, cat /etc/hosts


[root@4e6b947be0d6 setup]# su - gpadmin

-bash-4.1$ cat /etc/redhat-release

CentOS release 6.7 (Final)


-bash-4.1$ cat /etc/hosts

127.0.0.1       localhost

::1      localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2     4e6b947be0d6

127.0.0.1 72ba20be3774


-bash-4.1$ exit

logout

 


>> 권한 부여: chown


[root@4e6b947be0d6 setup]# chown gpadmin:gpadmin plr-2.3.1-GPDB4.3-rhel6-x86_64.gppkg

 




4. 파일을 열고 편집하기: vi


script

description 

  vi filename

  편집창에 file 열기 

  esc 을 누른 후에 :q!

  저장하지 않고 vi 편집창 닫기 (not save and exit)

  esc 을 누른 후에 :wq!

  변경사항을 저장하고 vi 편집창 닫기 (save and exit)




5. Greenplum Database에 연결하기: ssh gpadmin@ip



[MacBook-Pro:~ rfriend$ ssh gpadmin@192.168.188.131

gpadmin@192.168.188.131's password: xxxxxxxx 

Last login: Fri Dec  8 22:23:24 2017 from 192.168.188.1

[gpadmin@mdw ~]$ 

 




6. con.sh 파일에 저장해놓고 파일 실행으로 Greenplum Database에 연결하기


여러개의 DB에 바꾸어 가면서 접속해야 하는 경우 IP를 모두 외우고 일일이 치기 힘들 때 유용합니다. 아래 예제는 gpdb, gpdb2, gpdb3 의 3개 DB에 접속하기 편하도록 DB별로 alias를 준 예제입니다. 


chmod +x con.sh 는 con.sh 파일에 들어있는 script가 나중에 실행될 수 있도록 파일 형태를 바꾸어 줍니다. (chmod: change mode)


./con.sh gpdb 는 현재 경로의 con.sh 파일 안의 gpdb 라는 이름 아래에 있는 script (즉, ssh gpadmin@192.168.188.131)를 실행하라는 뜻입니다. 



[MacBook-Pro:~ rfriend$ cd


[MacBook-Pro:~ rfriend$ ls *.sh

con.sh


[MacBook-Pro:~ rfriend$ vi con.sh


#!/bin/bash

  

case $1 in

gpdb)

ssh gpadmin@192.168.188.131

;;


gpdb2)

ssh gpadmin@192.168.188.141

;;


gpdb3)

ssh gpadmin@192.168.188.151

;;


*)


echo $"Usage: $0 target"

exit

esac

~

~

:wq!



[MacBook-Pro:~ rfriend$ chmod +x con.sh


[MacBook-Pro:~ rfriend$ ./con.sh gpdb

gpadmin@192.168.188.131's password:xxxxxxxx 

Last login: Fri Dec  8 23:05:01 2017 from 192.168.188.1

[gpadmin@mdw ~]$ 





7. Greenplum DB 시작하기, 멈추기: gpstart, spstop


script

descriptionn 

  gpstart

  Greenplum Database 시작하기

  gpstart -a

  Greenplum Database 시작할 때 자동으로 YES 입력하게 해서 시작하기

  gpstart -m

  Greenplum Database 마스터 노드만 maintenance mode로 시작하기

  gpstop -af

  실행 중인 모든 코드를 멈추고 Greenplum Database 내리기(중단하기)

  gpstop -r

  Greenplum Database를 내렸다가 다시 시작하기

  gpstop -u

  Greenplum Database 시스템을 방해하는 것 없이 

  configuration file 변경 사항만 다시 로딩하기 




8. Greenplum DB 상태 확인하기: gpstate


script

description 

  gpstate

  Greenplum Database 작동 상태 확인하기

  : PostgreSQL, Greenplum DB의 version 확인 가능함

  gpstate -e

  Greenplum Database primary/segment mirror 세부 이슈 확인하기


Show details on primary/mirror segment pairs that have potential issues such as 1) the active segment is running in change tracking mode, meaning a segment is down 2) the active segment is in resynchronization mode, meaning it is catching up changes to the mirror 3) a segment is not in its preferred role, for example, a segment that was a primary at system initialization time is now acting as a mirror, meaning you may have one or more segment hosts with unbalanced processing load.



[MacBook-Pro:~ rfriend$ ssh gpadmin@192.168.188.131

gpadmin@192.168.188.131's password: xxxxxxxx 

Last login: Fri Dec  8 23:48:08 2017 from 192.168.188.1


[gpadmin@mdw ~]$ gpstate

20171208:23:50:17:109233 gpstate:mdw:gpadmin-[INFO]:-Starting gpstate with args: 

20171208:23:50:17:109233 gpstate:mdw:gpadmin-[INFO]:-local Greenplum Version: 'postgres (Greenplum Database) 4.3.18.0 build 1'

20171208:23:50:17:109233 gpstate:mdw:gpadmin-[INFO]:-master Greenplum Version: 'PostgreSQL 8.2.15 (Greenplum Database 4.3.18.0 build 1) on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.4.2 compiled on Nov 22 2017 18:54:31'

20171208:23:50:17:109233 gpstate:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...

20171208:23:50:17:109233 gpstate:mdw:gpadmin-[INFO]:-Gathering data from segments...

. 

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-Greenplum instance status summary

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-----------------------------------------------------

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Master instance                                = Active

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Master standby                                 = No master standby configured

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total segment instance count from metadata     = 4

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-----------------------------------------------------

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Primary Segment Status

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-----------------------------------------------------

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total primary segments                         = 4

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total primary segment valid (at master)        = 4

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total primary segment failures (at master)     = 0

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number of postmaster.pid files missing   = 0

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number of postmaster.pid files found     = 4

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number of postmaster.pid PIDs missing    = 0

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number of postmaster.pid PIDs found      = 4

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number of /tmp lock files missing        = 0

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number of /tmp lock files found          = 4

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number postmaster processes missing      = 0

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Total number postmaster processes found        = 4

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-----------------------------------------------------

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Mirror Segment Status

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-----------------------------------------------------

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-   Mirrors not configured on this array

20171208:23:50:18:109233 gpstate:mdw:gpadmin-[INFO]:-----------------------------------------------------

[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ gpstate -e

20171208:23:50:28:109293 gpstate:mdw:gpadmin-[INFO]:-Starting gpstate with args: -e

20171208:23:50:28:109293 gpstate:mdw:gpadmin-[INFO]:-local Greenplum Version: 'postgres (Greenplum Database) 4.3.18.0 build 1'

20171208:23:50:28:109293 gpstate:mdw:gpadmin-[INFO]:-master Greenplum Version: 'PostgreSQL 8.2.15 (Greenplum Database 4.3.18.0 build 1) on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.4.2 compiled on Nov 22 2017 18:54:31'

20171208:23:50:28:109293 gpstate:mdw:gpadmin-[INFO]:-Obtaining Segment details from master...

20171208:23:50:28:109293 gpstate:mdw:gpadmin-[INFO]:-Physical mirroring is not configured

[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ 

 




9. Greenplum DB에서 ZooKeeper, GPText 시작하기


script

description 

  zkManager start

  ZooKeeper 시작하기 

  (아래의 gptext-start 를 하기 전에 ZooKeeper를 먼저 실행시켜야 함)

  gptext-start

  GPText 시작하기




10. Greenplum DB에서 나오기: exit



[gpadmin@mdw ~]$ 

[gpadmin@mdw ~]$ exit

logout

Connection to 192.168.188.131 closed.

[MacBook-Pro:~ rfriend$ 

 




11. 터미널에서 psql 로 Schema, Table 조회하기, SQL로 조회하기, psql 종료


script

description 

  $ psql

  터미널에서 psql 시작하기

  # \l
  Database 리스트 보기

  # \dn

  Schema 리스트 보기

  # \dt

  Table 리스트 보기

  # \dt public.e*

  public Schema안의 Table 중에서

  'e'로 시작하는 모든 Table 리스트 보기

  # select * from table_name

  table에서 모든 변수의 값 조회하기

  # alter role gpadmin password 'newpassword';

  Password 변경

  # \q

  psql 종료



[MacBook-Pro:~ rfriend$ ssh gpadmin@192.168.188.131

gpadmin@192.168.188.131's password: xxxxxxxx

Last login: Fri Dec  8 23:50:12 2017 from 192.168.188.1

[gpadmin@mdw ~]$ psql

psql (8.2.15)

Type "help" for help.


testdb=# \l
                  List of databases
   Name    |  Owner  | Encoding |  Access privileges 
-----------+---------+----------+---------------------
 gpperfmon | gpadmin | UTF8     | gpadmin=CTc/gpadmin
                                : =c/gpadmin
 postgres  | gpadmin | UTF8     |
 template0 | gpadmin | UTF8     | =c/gpadmin         
                                : gpadmin=CTc/gpadmin
 template1 | gpadmin | UTF8     | =c/gpadmin         
                                : gpadmin=CTc/gpadmin
 testdb    | gpadmin | UTF8     |
(5 rows)


testdb=# \dn

       List of schemas

        Name        |  Owner  

--------------------+---------

 gp_toolkit         | gpadmin

 gpdemo             | gpadmin

 gptext             | gpadmin

 information_schema | gpadmin

 madlib             | gpadmin

 pg_aoseg           | gpadmin

 pg_bitmapindex     | gpadmin

 pg_catalog         | gpadmin

 pg_toast           | gpadmin

 plp                | gpadmin

 public             | gpadmin

 test               | gpadmin

(12 rows)


testdb=# \dt public.e*

                 List of relations

 Schema |     Name     | Type  |  Owner  | Storage 

--------+--------------+-------+---------+---------

 public | edge         | table | gpadmin | heap

 public | employeelist | table | gpadmin | heap

 public | enron        | table | gpadmin | heap

(3 rows)



testdb=# select eid, firstname, lastname, email_id from employeelist limit 5;

 eid | firstname | lastname |          email_id          

-----+-----------+----------+----------------------------

  19 | Lindy     | Donoho   | lindy.donoho@enron.com

 115 | Lisa      | Gang     | lisa.gang@enron.com

 127 | Kenneth   | Lay      | kenneth.lay@enron.com

 107 | Louise    | Kitchen  | louise.kitchen@enron.com

  43 | Larry     | Campbell | larry.f.campbell@enron.com

(5 rows)

testdb=# 

testdb=#


testdb=# alter role gpadmin password 'newpassword';


testdb=# \q

[gpadmin@mdw ~]$ 







12. IP, 네트워크 인터페이스 확인하기: ifconfig



[gpadmin@mdw ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:4E:9B:86  
          inet addr:192.168.188.131  Bcast:192.168.188.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe4e:9b86/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1069849 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1586899 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:973723679 (928.6 MiB)  TX bytes:1690761826 (1.5 GiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:3683 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3683 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:519553 (507.3 KiB)  TX bytes:519553 (507.3 KiB)

 





13. Downloads 폴더에 있는 파일을 GPDB 폴더 안으로 원격 복사하기

      : scp file_name gpadmin@ip:directory


pwd 로 현재 작업 경로 (current working directory)를 확인하고, 

cd Downloads 로 파일을 다운로드 받아놓은 Downloads 폴더로 작업 디렉토리를 변경 후에, 

scp file_name directory 로 파일을 복사하는 예제입니다. 



[MacBook-Pro:~ rfriend$ pwd

/Users/rfriend

[MacBook-Pro:~ rfriend$ cd Downloads/

[MacBook-Pro:Downloads rfriend$ scp file_name gpadmin@192.168.188.131:/home/gpadmin/gpdb

gpadmin@192.168.188.131's password: xxxxxxxx 

file_name                                         100%   72MB  79.0MB/s   00:00    

[MacBook-Pro:Downloads rfriend$ 

 




14. 문자열 패턴 검색: grep

은 다음번 포스팅에서 예를 들어서 설명하겠습니다. 




15. GPDB 버전, master, segment node configuration, MADlib 버전, PL/Language 확인하기



-- GPDB 버전 확인


# select version()


PostgreSQL 8.2.15 (Greenplum Database 4.3.18.0 build 1) on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.4.2 compiled on Nov 22 2017 18:54:31




-- GPDB master, segment node configuration 확인

# select * from pg_catalog.gp_segment_configuration

 




-- MADlib 버전 확인


# select madlib.version()

MADlib version: 1.12, git revision: rc/1.12-rc1, cmake configuration time: Wed Aug 23 22:33:09 UTC 2017, build type: Release, build system: Linux-2.6.18-238.27.1.el5.hotfix.bz516490, C compiler: gcc 4.4.0, C++ compiler: g++ 4.4.0


select * from madlib.migrationhistory





-- PL/Language 확인


# select * from pg_catalog.pg_language







많은 도움이 되었기를 바랍니다. 




Posted by R Friend R_Friend

댓글을 달아 주세요