반응형

정규식에는 많은 규칙이 있지만... 실제로 사용해 보지 않으면 그 묘미를 확인하기가 어렵죠 지금부터는 정규식을 활용해서 실제로 해볼수 있는 여러가지 작업에 대해 소개해보도록 하겠습니다.

 

먼저 시작하기 전에

https://regexper.com/

 

이사이트에서는 자신이 입력한 정규식에 대한 검증을 시각화로 도와주는 사이트 입니다. 혹시 자신이 작성한 정규식을 검증해 볼 필요가 있을때 유용하게 사용할 수 있는 사이트이니 참고해 주시고...

 

1. 핸드폰 번호

사람들이 많이 사용하는 핸드폰 번호는

형식이 010-1234-5678 이런식으로 숫자 3자리 - 4자리 - 4자리로 구성되어 있죠

 

이런 경우에는

 

1) /^\d{4}-\d{5}-\d{5}$/

 

2) /^010\-[0-9]{4}\-[0-9]{4}$/

 

2가지 경우로 표현할 수 있습니다.

 

첫번째는 10진수의 숫자 3개와 4개, 4개를 표현하는 것입니다. 물론 자유도가 다소 높죠

두번째는 앞에 010이라는 전재를 하고 각 자리수별로 가능한 범위를 지정합니다. 이때는 사용자에 따라서 특정 핸드폰을 구별해서 처리하고 싶을 때 가능한 방법입니다.

 

 

2. IP 주소

 

아이피주소는 간단하지만 예외가 많습니다

 

단순하게 ###.###.###.### 이렇게 생각하고 작성할 수 도 있습니다.

하지만  ##.##.###.## 이 경우도 있고 . 다시 말해 아까 전과는 달리 자릿수가 변동이 생길수가 있죠. 자릿수를 무조건 3자리로 정한다면 이야기는 달리지겠지만요...

 

/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/

 

정규식이 첫번째로 잡아낸 그룹은 실제로 매치된(captured)된 그룹이 아닙니다. 왜냐하면 ?: 가 그안에 위치하고 있기 때문입니다. ?:는 파서가 이 그룹을 잡아내지 않도록 합니다. 또한 이 잡히지 않는 그룹은 3번 반복되기를 원합니다.(그룹의 끝에 {3}) 이 그룹은 또다른 서브그룹과 점(.)을 담고 있고 파서는 점(.)이 뒤에 있는 서브그룹을 매치하려고 찾습니다.

서브그룹은 또다른 잡히지 않는(non-captured) 그룹입니다. 이것은 0~5가 뒤에 오는 "25"거나 0~4와 모든 숫자가 뒤에 오는 "2"이거나 옵션이 0 또는 2개의 숫자가 이어지는 숫자들의 문자셋의 묶음입니다.

이 3가지가 매치된 이후에 다음 캡쳐되지 않는 그룹으로 들어갑니다. 이것은 0~5가 이어지는 "25" 또는 0~4와 함께 오는 "2" 그리고 마지막에 다른 숫자(0이나 두자리 숫자)가 옵니다.

마지막 문자($)와 함께 이 복잡한 정규표현식이 끝납니다.

 

 

 

 3. URL

 

URL을 보는 방법에대해 알아보겠습니다.

 

URL을 수식으로 한번 풀어 보면

 

http[s]://XXXX.XXX/XXX 이런식으로 할 수가 있겠죠

 

 

/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w_\.-]*)*\/?$/

 

 

첫번째 그룹은 모두 옵션인데 이것은 URL이 "http://"나 "https://" 또는 둘다 없이 시작하도록 한다. s뒤에 물음표(?)는 URL이 http와 https를 모두 허용한다. 이 그룹전체를 선택사항으로 하기 위해서 뒤에 물음표(?)를 추가했습니다.

다음은 도메인명으로 한개이상의 숫자, 문자열, 점(.), 하이픈(-)뒤에 또다른 점(.)이 오고 그 뒤에 2~6개의 문자와 점이 옵니다. 이어지는 부분을 추가적인 파일과 디텍토리에 대한 부분으로 이 그룹에서는 갯수에 관계없이 슬래쉬(/), 문자, 숫자, 언더스코어(_), 스페이스, 점(.), 하이픈(-)이 나올 수 있으며 이 그룹은 많은 수의 디렉토리와 파일과 매치됩니다. 물음표(?)대신 별표(*)를 사용한 것은 별표는 0 또는 1이 아닌 0 또는 1개이상을 의미하기 때문입니다. 만약 물음표(?)를 사용했다면 오직 한개의 파일/디렉토리만 매치될 수 있었을 것입니다.

그 뒤에 슬래시(/) 매치되지만 이것은 선택사항이며 마지막으로 문자열의 끝($)이 나타납니다.

 

 

 

반응형
반응형

오늘은 ... 그간의 기술적인 이야기에서 벗어나서 약간은 개인적인 이야기를 하고자 합니다. 그것은 바로 직장인, 엔지니어라면 한번쯤은 해봤음직한 생각 이직입니다.

 

사실 이번글을 쓰기전에 많은 생각을 했습니다. 이직에 대해서 내가 남들에게 뭔가 충고를 줄 만큼 능력이 출중한가 아님 누군가에게 내가 충고를 할 만큼 이직에 대해서 많이 아는가?

 

물론 많이 부족하고 직장생활도 채 10년이 되지 않지만 1년간 퇴사 - 프리랜서 - 이직을 경험한 내용을 바탕으로 글을 써보려고 합니다. 사실 이 글은 누군가에게 충고와 도움이 되고 싶은 마음도 있지만, 지금의 감정을 솔직히 글에 담고 싶은 마음이 더 앞서 있기 때문입니다.

 

우선 이직을 말하기에 앞서서 이직을 하는데는 많은 이유가 있고 또한 준비가 필요합니다. 단순하게 회사가 싫어서, 직장상사가 괴롭해서는 이직을 결정하는데 좋은 사유가 되지 않는다고 생각합니다.

 

저도 이런 이유로 이직을 생각해 보지 않았다고 말하면 거짓말이겠지만... 제가 이직을 결정하게 된 원인은 "자기개발"이었습니다. 사실 5년동안 한 직장에 있으면서 많은 것을 배우기도 했지만 어느덧 타성에 젖은 내 모습을 보면서 많이 실망을 했고 보다 내 자신에게 변화가 있어야 되겠다고 생각했습니다. 또한 그 외 다른 요인들도 있지만...

 

이런 이유로 이직을 결심한 이후로 정확히 저는 1년4개월만에 이직을 하게 됩니다. 그만큼 시간이 걸린 이유는 뭘까요?? 1년4개월 동안 "철저한 이직준비"가 필요합니다.

 

 

이직은 힘들기는 하지만... 안락했던 기존의 회사라는 울타리에서 나와 다시 험란한 정글을 넘어서 다른 회사라는 울타리로 들어가는 과정이라고 볼 수 있습니다. 그런 과정을 넘기 위해서는 반드시 그에 따라는 준비과정이 필요하겠습니다. 저는 이 과정에서 가장 중요한 부분이 "포트폴리오"라고 생각합니다.

 

학생들에게는 성적표라는 기준으로 평가를 하지만 직장인을 평가하는데는 적합한 기준이 없습니다. 자격증을 바탕으로 자기의 능력을 들어낼 수는 있지만 이것 또한 실무에서의 능력을 보장하지는 않기 때문에 자기를 표현하는 "포트폴리오" 작성이 중요합니다.

 

"포트폴리오"를 작성하는 많은 방법이 있지만 제가 생각하는 가장 중요한 부분은 "기술 명세서""프로젝트 요약서"입니다

 

"기술명세서"는 말 그대로 자신이 갖고있는 능력들을 나열하는 것입니다. 단순히 나열하는데서 그치지 않고 상, 중, 하로 나눠서 기술의 숙련도를 자가 평가하고 기술을 사용해서 할 수 있는 일들을 간략히 요약합니다. 그러는 과정에서 자기 자신을 좀 더 냉정하게 평가할 수 있는 계기를 갖게 되고 부족한 부분을 찾아서 이직을 준비하는 기간동안 보완할 수 있게됩니다.

 

"프로젝트 요약서"는 자신의 했던 중요 프로젝트를 Case By Case로 한 장에 요약하는 것입니다. 물론 회사의 기밀을 적을 필요는 없고 자신이 했던 부분을 위주로 누구나 이해할 수 있게 정리를 합니다. 그리고 부족한 점과 더 발전시킬 부분을 찾고 무엇보다 중요한 점은 자신만의 장점의 찾아서 하나의 스토리로 만드는 과정이 중요합니다.

 

물론 이 방법인 100% 정답이 아닐수도 있습니다. 하지만 저는 이런 방법으로 이직을 준비했었고 지금도 한해가 마무리 될 때 쯤이면 스스로를 반성하고 발전하는 계기로 만들기 위해 이런 과정을 하게 됩니다.

 

어쩌면 지금도 이직에 대해 고민하고 있을 사람들에게 조금이나마 도움이 되었으면 하네요

 

혹시... 라도 질문이 있으시면 댓글을 통해 남겨 주세요

 

감사합니다.

반응형
반응형

커널과 통신

  1. 시스템 호출은 하드웨어와 사용자 공간 프로세스 사이에 있는 계층
  2. 이 계층은 세가지 역할을 수행
  • 사용자 공간에 하드웨어 인터페이스를 추상화된 형태를 제공
  • 시스템 호출은 시스템보안 및 안정성을 제공
  • 사용자 공간과 기타 시스템 사이에 계층을 둠으로써 프로세스 별 가상 시스펨 환경을 제공

 

API, POSIX, C 라이브러리

  • 애플리캐이션으 일반적으로 시스템 호출을 직접 사용하지 않고 사용하지 않고, 사용자 공간에 구현된 애플리케이션 프로그래밍 인터페이스(API)를 이용
  • API는 애플리케이션이 사용하는 프로그래밍 인터페이스
  • API는 하나 또는 이상의 시스템 호출을 사용해 구현되며 경우에 따라 시스템 호출을 사용하지 않을 수 있다.

  < printf() 호출 시 애플리케이션, C 라이브러리, 커널사이의 관계>

 

 

  • 유닉스에서 가장 유명한 API는 POSIX 표준이다.
  • POSIX는 API와 시스템 호출간의 관계를 보여주는 예
  • 리눅스의 시스템 호출 인터페이스는 다른 유닉스 시스템과 마찬가지로 C라이브러리 형태로 제공
  • C라이브러리는 표준 C라이브러리와 시스템 호출 인터페이스 등 유닉스 시스템의 주요 API가 구현
  • C라이브러리는 모든 C프로그램이 사용하며, 대다수의 POSIX API를 추가로 제공
  • 유닉스 인터페이스의 공통적인 모토는 "정책이 아닌 방식을 제공하라" → 유닉스 시스템 호출은 특정 기능을 아주 일반적인 형태로 제공

 

시스콜

  • 시스템 호출 (리눅스에서는 syscall)은 보통 C 라이브러리에 정의된 함수를 호출하는 방식으로 사용
  • 이 함수는 0개 혹은 하나 이상의 인자를 받고 하나 이상 부수효과를 발생 가능
  • 시스템 호출에서 오류가 발생할 경우 C라이브러리는 전역 변수인 errno에 특정 오류 코드를 기록
  • 라이브러리 함수인 perror() 를 사용하여 이 변수를 사람이 보기 편한 문자열 형태로 변환 가능
  • 시스템 호출은 정의된 특정 동작을 수행, 그렇지만 함수 정의로는 구현 내용에 대해 아무것도 알 수없음에 주의
  • 시스템 호출 정의 방법 : 함수 정의 부분에 asmlinkage 지시자가 있으며 이 자시자는 해당 함수의 인자를 스택에서만 찾으라고 컴파일러에게 알려준다 → 이는 리눅스의 모든 시스템 호출이 사용하는 명명규칙

 

 

 

시스템 호출 번호

  • 리눅스의 모든 시스템 호출에는 시스콜 번호가 할당
  • 이 번호는 특정 시스템 호출을 참조하는데 사용하는 고유번호
  • 사용자 공간 프로세스가 시스템 호출을 실행 할 때 시스콜 번호를 통해 실행 할 시스템 호출을 확인
  • 프로세스는 이름을 사용해 시스콜을 참조하지 않는다
  • 시스콜 번호는 한번 할당 하면 변경할 수 없으므로 매우 중요
  • 커널은 등록된 모든 시스템 호출의 목록을 sys_call_table이라는 시스템 호출 테이블에 저장

 

시스템 호출 성능

  • 리눅스 시스템 호출은 다른 운영체제 보다 빠르다.
  • 첫번째, 리눅스의 빠른 Context switch 시간이며
  • 다음은 시스템 호출 핸드러의 구현이 간단하게 되어 있다.

 

반응형
반응형

쉘 스크립트에서 문자열을 다루기 위해서는 awk, cut, grep의 기본 명령어만으로도 충분하지만, 보다 코드를 간결하게 작성하고 싶고 복잡한 미션을 수행하기 위해서는 정규표현식이 필요합니다.

 

물론, 제 생각에는 정규표현식은 필요악??? 이라고 생각되는 측면이 많이 있습니다. 일단 프로그램언어나 시스템 별로 차이점도 존재하고 쓰는 사람만다 다양한 방법으로 사용이 가능하고 제일 중요한 점은 가독성이 떨어지기 때문에 추후 유지보수 측면에서도 떨어지는 단점이 있습니다.

 

그렇지만 정규표현식은 감히 말하건데... MSG같은 마법으로 우리에게 다가오기 때문에 문자열 관련 측면이 아니더라도 알아두면 좋을거 같습니다.

 

표현식(expression)이란 문자 그대로의 의미 이상으로 해석되는 메타문자(metacharacters)라고 부르는 문자들의 집합을 말합니다.

 

예를 들어, 인용 부호(quote symbol)는 어떤 사람이 말한 것을 나타내 주기도 하지만 또한 그 뒤에 나오는 심볼에 대해서 메타적 의미를 부여하기도 합니다. 정규 표현식은 유닉스에 특별한 특징을 부여하는 문자들과 메타문자들의 집합입니다.

 

정규 표현식은 주로 텍스트 탐색과 문자열 조작에 쓰입니다. 정규 표현식은 하나의 문자와 일치(match)하거나, 혹은 문자열의 일부분(substring)이나 전체 문자열인 문자 집합들과 일치하게 됩니다.

 

<기초>

 

1. 별표(*)는 바로 앞의 문자열이나 정규 표현식에서 0개 이상 반복되는 문자를 나타냅니다.

"113*" 은 11 + 하나 이상의 3 + 가능한 다른 문자들 을 나타냅니다: 113, 1133, 11312, 기타 등등.

 

2. 점(.)은 뉴라인을 제외한 오직 한 개의 글자와 일치합니다.

"13." 은 13 + 빈칸을 포함한 최소 한 글자 를 나타냅니다: 1133, 11333, 하지만 13은 뒤에 한 글자가 빠져 있기 때문에 아닙니다.

 

3. 캐럿(^)은 줄의 시작을 나타내지만 가끔 문맥에 따라서는 정규 표현식에서 문자 집합의 의미를 반대로 해석해 줍니다.


4. 정규 표현식의 제일 끝에 나오는 달러 표시($)는 줄 끝과 일치합니다.

"^$" 는 빈 줄과 일치합니다.

 

5. 대괄호([...])는 단일 정규 표현식에서 표현하기 위해 문자들을 집합으로 묶어 줍니다.

"[xyz]" 는 x, y, z 중에 한 글자와 일치합니다.

"[c-n]" 는 c에서 n 사이에 들어 있는 한 문자와 일치합니다.

"[B-Pk-y]" 는 B에서 P까지 중이나 k에서 y까지 중의 한 글자와 일치합니다.

"[a-z0-9]" 는 소문자나 숫자중의 한 문자와 일치합니다.

"[^b-d]" 는 b에서 d사이의 문자를 제외한 모든 문자를 나타냅니다. ^은 바로 뒤에 나오는 정규 표현식의 의미를 반대로 해석하게 해 줍니다(다른 문맥에서 !의 의미와 비슷함).

여러개의 대괄호로 묶인 문자들은 일반적인 낱말 패턴을 나타냅니다. "[Yy][Ee][Ss]"는 yes, Yes, YES, yEs, 등등을 나타냅니다. "[0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"는 주민등록번호와 일치합니다.

 

6. 역슬래쉬(\)는 특수 문자를 원래의 문자 의미대로 해석하게 해줍니다(escape).

"\$" 는 정규 표현식에서 줄 끝(end-of-line)을 나타내는 의미대신 "$" 문자 그대로 해석하게 해줍니다. 비슷하게 "\\"는 그냥 "\" 문자 그 자체를 나타냅니다.

 

 

<메타 문자 정리>

 

1) ^ : 문자열의 처음을 나타냄

맞는 문자열
^group group으로 시작하는 문자열 group, groups, group program, …

 

2) $ : 문자열의 끝을 나타냄

맞는 문자열
ing$ ing로 끝나는 문자열 ing, sing, hosting, booting, …
^code$ code로 시작하고 끝남 code

3) . : 임의의 한문자를 나타냄

맞는 문자열
a.b a와 b 사이에 한 문자가 낀 문자열 aab, abb, acb, …
ab. ab 다음에 한 문자가 붙은 문자열 aba, abb, abc, …
a..b a와 b 사이에 두 문자가 낀 문자열 a11a, aabb, abbb, …
^.ape ape 앞에 한 문자가 낀 문자열로 시작함 tape, caper, …


 

4) * : 바로앞의 문자가 없거나 하나 이상이 있는 겅유

맞는 문자열
m*r r 앞에 m이 없거나 하나 이상 있음 r, mr, mmr, mmmr, …
mr*s m 다음에 r이 없거나 하나 이상 있고 s가 맨 뒤에 있음 ms, mrs, mrrs, mrrrs, …
mrs* mr 다음에 s가 없거나 하나 이상 있음 mr, mrs, mrss, mrsss, …
5) + : 바로 앞의 문자가 하나 이상 있음
맞는 문자열
m+r r 앞에 m이 하나 이상 있음 mr, mmr, mmmr, …
mr+s m 다음에 r이 하나 이상 있고 s가 맨 뒤에 있음 mrs, mrrs, mrrrs, …
mrs+ mr 다음에 s가 하나 이상 있음 mrs, mrss, mrsss, …
6) ? : 앞의 문자가 없거나 하나임

 

맞는 문자열
m+r r 앞에 m이 하나 이상 있음 mr, mmr, mmmr, …
mr+s m 다음에 r이 하나 이상 있고 s가 맨 뒤에 있음 mrs, mrrs, mrrrs, …
mrs+ mr 다음에 s가 하나 이상 있음 mrs, mrss, mrsss, …
7) [] (꺽쇠묶음, 대괄호):

  - 꺼꾀묶음은 한 문자를 가리킴

  - 묶음안의 내용은 가리키는 문자의 범위를 나타냄

    (문자 클래스로서 정규 표현식과는 언어가 다름)

  - 특정한 문자열을 제외하려면 묶음안에 '^'를 사용

맞는 문자열
[w]s s 앞에 w가 붙음 ws
[ws]p p 앞에 w나 s가 붙음 wp, sp
[a-z]8 8 앞에 잔 로마자(소문자) 하나가 붙음 a8, b8, c8, … , z8
[a-zA-z][0-9] 로마자 하나 뒤에 숫자 하나가 붙음 a0, b5, K3, …
[^w]s s 바로 앞에 w가 아닌 문자 하나가 붙음 as, 2s, es, …
[^ws]p p 바로 앞에 w나 s가 아닌 문자 하나가 붙음 ap, hp, op, …
[^a-z]8 8 바로 앞에 잔 로마자가 아닌 문자 하나가 붙음 A8, C8, 38, #8, …
^[^gh][^ij]$ g나 h가 아닌 한 문자로 시작하고  i나 j가 아닌 한 문자로 끝남
(꺾쇠묶음 밖의 ^는 문자열의 처음을 나타냄)
ab, ty, ig, jh, …

8) { } : 중괄호

  - 중괄호는 앞에 있는 문자의 개수를 나타냄

  - 묶음안에서 ' , '는  문자 개수의 범위를 나타낼때 씀

맞는 문자열
w{0}s s 앞에 w가 없음 s
w{1}s s 앞에 w가 하나 붙음 ws
ws{3}p w가 앞에 오고 s가 셋 붙으면서 p가 뒤에 붙음 wsssp
w{1,3}s s 앞에 w가 1~3개 붙음 ws, wws, wwws
w{,2}s s 앞에 w가 두 개 이하 붙음 s, ws, wws
w{2,}s s 앞에 w가 두 개 이상 붙음 wss, wsss, …

9) | : 또는 / or와 같은 선택문에 사용

맞는 문자열
word|phrase word 또는 phrase word, phrase
mount(ed|ing) mounted 또는 mounting mounted, mounting
[^(a|b|c)].+ a 또는 b 또는 c로 시작하지 않는 문자열  

10) \(거꿀빗금) : 메터문자의 성분을 없앨때 사용

맞는 문자열 안 맞는 문자열
\[[^\[\]]+\] 꺾쇠묶음으로 한 겹만 싸인 문자열 [a], [ab], [abc], … [], [[abcd]], [a[]], …
[^\.]+\.(com|net) com, net로 끝나는 바탕 도메인 이름
(서브 도메인이 아닌 것)
a.com, b.net, … b.a.com, .a.com, .net …

반응형
반응형

이번에는 리눅스 커널에서 중요한 부분인 I/O (Storage) Stack에 대해 알아보고자 합니다. I/O (Storage) Stack은 리눅스 커널 시스템에서 가장 중요한 부분중에 하나이며 현재 리눅스 커널 소스 코드에서 다양하게 업데이트 되고 있는 부분입니다.

 

이유는, 메모리 관리 / 스케줄러 / 프로세스 등 리눅스&유닉스의 핵심이자 가장 전통적인 기능들은 수십년을 거쳐오면서 거의 안정화 되어가고 있으며 현재는 최적화에 초점이 맞춰 있습니다.

 

그렇지만 스토리지는 지금도 새로운 디바이스가 출시되고 있으며 특히 SSD의 보급화로 통해 기존의 HDD와는 전혀 다른 메커니즘을 갖고 있기때문에 지금도 I/O (Storage) Stack 부분은 많이 수정이 되고 있습니다.

 

현재 리눅스 커널은 현재까지 4.14 버젼까지 출시된 상태이고 stable version : 4.9, 로 되어 있습니다.

 

간단하게 I/O (Storage) Stack의 구조를 보게 되면

크게 보게 되면

Application → VFS(Virtual File System) → Block I/O Layer → I/O Scheduler → SCSI Layer → Block Device

 

각각의 기능을 보게 되면

 

Application은 read / write / open ... 통해 I/O Stack을 호출하게 됩니다.

 

VFS(Virtual File System) : 가장 파일시스템으로서 block F/S, Network F/S, Special Purpose F/S 등 다양종류의 파일 시스템을 지원을 하고 이들의 구동 방식은 Direct I/O 나 Page cache(MMAP)을 사용하여 I/O를 수행하게 됩니다. 또한 부가적으로 LVM, SW Raid 등의 기능을 지원하게 됩니다.

 

Block I/O Layer는 QUEUE를 이용해서 상위 레이어에서 받은 데이터를 저장하게 되고 이를 통해 구동을 하게 됩니다. 또한 다양한 Storage Device에 대한 추상화 작업을 1차적으로 진행하게 됩니다. 예전에는 이부분에서 추상화 작업은 진행하지 않았지만 nvme를 비롯한 SCSI 계열이 아닌 Storage 디바이스가 나오게 되면서 이부분의 기능이 추가 되었습니다.

 

I/O Scheduler는 noop, cfq, deadline의 기능을 지원하게 됩니다.

 

앞으로 storage stack에 대해서는 추가적으로 연재를 하도록 하겠습니다

 

끝으로 storage stack full diagram입니다.

 

 

 

출처 : https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram#License

반응형
반응형

리눅스 시스템을 사용하게 되면 필연적으로 문자열을 처리해야 되는 상황이 있습니다. 그 상황에 대비하여 기초적인 단계부터 심화 단계까지 한번 살펴보는 시간을 갔다록 하겠습니다.

 

우선 처음으로는 간단한 명령어로 문자열을 파싱하는 그렇지만 아주 강력한 문자열을 다루는 방법을 알아보도록 하겠습니다.

 

어쩌면 지금 소개하는 방법은 문자열을 다루는 기초이자 핵심임을 알아 두셨으면 합니다.

 

먼저 grep은 해당 열에 찾고 싶은 문자열이 있는지를 찾는 명령어 입니다.

 

<sample.txt>

root@ubuntu:/shell# cat sample.txt
I am a boy
I am a girl

<grep.sh>

root@ubuntu:/shell# cat grep.sh
#!/bin/bash

cat $1 |grep boy

root@ubuntu:/shell# ./grep.sh sample.txt
I am a boy

보시는 바와 같이 grep을 사용하면 boy가 있는 문자열을 찾게 됩니다.

 

다음은 cut입니다. cut을 활용하게 되면 구분자(char)를 이용하여 문자열을 추출하게 됩니다. 다시말하면 열로서 구분을 한다는 의미입니다. 여기서 중요한 점은 구분자 한글자이여야만 됩니다. 예를 들면 csv 파일 같은 형식에 적합하겠습니다.

 

<sample.csv>

root@ubuntu:/shell# cat sample.csv
name,category,score
choi,math,90
park,english,80
kim,korean,100

<cut.sh>

root@ubuntu:/shell# cat cut.sh
#!/bin/bash

cat $1 |cut -d',' -f1

root@ubuntu:/shell# ./cut.sh sample.csv
name
choi
park
kim

 

마지막으로는 awk 입니다. cut과는 다르게 파라미터 단위로 파싱을 하게 됩니다. 예제 파일을 통해 확인 해보겠습니다

<sample1.csv>

root@ubuntu:/shell# cat sample1.csv
name       category               score
choi   math             90
park         english           80
kim    korean          100

<cut.sh>

root@ubuntu:/shell# cat awk.sh
#!/bin/bash

cat $1 |awk '{print $1}'

root@ubuntu:/shell# ./awk.sh sample.csv
name
choi
park
kim

보시는 바와 같이 불규칙한 공백이 있는 파일에서 공백을 기준으로 파라미터화 해서 원하는 출력을 뽑아내는 모습을 확인 할 수 있습니다.

 

반응형

+ Recent posts