[리눅스] 13장 정규 표현식

aramjs·2023년 12월 11일

Linux

목록 보기
10/14
post-thumbnail

13.1 grep 명령어와 정규 표현식

  • grep : 검색할 때 사용. 필터링 기능이다.

  • gerp bash/etc/passwd : passwd에서 bash가 들어간 부분을 보여준다.

  • cat /etc/passwd | grep bash : 파이프로 넘겨서 검색한다.

  • grep -i : ignore case. 대소문자를 구분하지 않고 검색한다. 출력 결과가 없으면 출력하지 않는다.

  • grep -v : invert match 검색할 문자열이 나타나지 않는 행을 출력한다.

  • ls/etc | grep cron : ls/etc의 결과 중 cron이 있는 것만 출력한다.

  • grep 은 해당 문자열이 포함된 행 전체를 출력한다.

정규 표현식이란

  • 정규 표현식이라는 검색 패턴을 줄 수 있다.
    조건에 일치하는 문자열 집합을 표현할 수 있다.
    특정 문자열로 시작하거나 숫자 없이 알파벳으로만 구성된 문자열 등을 찾으라고 할 수 있다.
    조건에 맞는 문자열들을 모두 찾을 때 사용한다.

  • ^ : 행의 시작을 의미한다.

  • ls /etc | gerp '^cron' : ls /etc 결과에서 cron으로 시작하는 문자열이 있는 행을 출력한다.

    • cron으로 시작하는 행만 출력한다.
  • 정규 표현식은 항상 작은따옴표로 감싸는 것이 좋다.

    • 이는 셸이 정규 표현식을 확장하지 않도록 하기 위해서이다.
    • 정규 표현식에서는 *, {}, $ 등의 기호가 특별한 의미로 사용된다.
    • 이러한 문자를 메타 문자 라고 부른다.
    • * 는 셸에서 와일드카드로 해석되어 경로가 확장된다.
    • 정규 표현식을 작은 따옴표로 감싸지 않으면 셸이 먼저 해석한다.

13.2 임의의 문자를 지정하는 메타 문자

  • . : 임의의 문자 하나를 의미한다. 알파벳, 숫자, 기호, 문자를 포함한다.

    • grep 't..t' example.txt : example.txt에서 t..t에 해당하는 행을 출력한다.

    • .org로 검색하면 borg와 .org가 검색된다.

    • 임의의 문자가 아니라 기호 자체를 검색하고 싶으면 \. 을 입력한다.

    • grep \.org example.txt : .org를 검색한다.

  • ? : 셸에서는 문자 하나이다.

  • grep t[ef]st example.txt : e 또는 f일 때 출력한다. 대괄호는 한 문자를 의미한다.

    • [abcdefg] : [a-g]

    • grep 'mail[1-4]' example.txt : mail1, mail2, mail3을 찾아라는 의미이다.

  • grep 'mail[^13]' example.txt : mail1, mail3이외의 문자를 찾아라. [] 안에 포함되지 않는 문자가 있는 행만 출력하라.

  • \ : 다음의 문자를 메타 문자로 인식하지 않는다.


13.3 위치를 지정하는 메타 문자

  • ^ : 문장의 처음을 나타낸다.

  • $ : 문장의 마지막을 나타낸다. net$로 검색하면 끝이 net인 것만 출력한다.

  • grep '^net$' example.txt : net으로 시작하고 net으로 끝나는 행을 출력한다.

  • grep '^$' example.txt : 빈 행만 출력하라.
    vi에서 o 로 줄 사이 빈 행을 넣을 수 있다.

  • grep -v '^$' example.txt : 빈 행을 제외하고 출력한다.
    -v옵션은 검색할 문자가 나타나지 않는 행을 출력한다. invert match이다.

  • grep -v '^$' example.txt > example2.txt : 빈 행을 없앤 것을 파일로 출력한다.


13.4 반복을 지정하는 메타 문자

  • 직전의 정규 표현식이 일정 횟수만큼 반복되는 것을 의미한다.
    항상 뒤에 오며 같이 쓰인다.

  • * : 0회 이상 반복을 의미한다. 직전의 문자가 나타나지 않는 것도 포함한다.

    • Br-0회 반복, Ber-1회 반복, Beer-2회 반복
    • Be*r은 Br도 해당된다. Bear은 해당되지 않는다.
  • grep 'Be*r' test.txt : 앞의 문자 0회 이상 반복되는 행을 출력한다. 0회도 출력한다.

  • grep '^B[ea]*r$' test.txt : B로 시작하고, e 또는 a가 0번 이상 반복, r로 끝나는 행을 출력한다.

    • Beeaeaer도 출력된다. Ber, Br도 출력된다.

확장 정규 표현식

  • 지금까지의 정규 표현식은 기본 정규 표현식이라 불리는 것으로 정규 표현식을 지원하는 모든 명령어에서 사용할 수 있다.

    • 사용할 수 있는 메타 문자가 늘어난 확장 정규 표현식도 있다.

    • 확장 정규 표현식을 지원하지 않는 명령어도 있기 때문에 이 둘을 구분해서 사용해야 한다.

  • -E 옵션을 지정하면 확장 정규 표현식으로 해석한다.

  • + : 바로 전 문자가 1회 이상 반복되는 것 의미

    • grep -E 'Be+r' test.txt : e가 1회 이상 반복되는 문자열이 있는 행을 출력한다.

    • * 과 비슷하지만 0번 나타나는 것은 포함하지 않는다. Br은 검색되지 않는다.

  • ? : 바로 전 문자가 0회 혹은 1회 반복을 의미한다.

    • grep -E 'Wine ?Wine' test.txt : 두 wine 사이에 공백이 하나 있는 경우와 없는 경우 행이 출력된다.
  • {m,n} : 바로 전 문자가 m회 이상 n회 이하 반복을 의미한다.

    • grep -E 'Be{1,2}r' test.txt : e 가 1회, 2회 반복인 행을 출력한다.

    • grep -E 'Be{2}r' test.txt : e가 정확하게 2번 반복인 행을 출력한다.

    • [0-9]{3}-[0-9]{4}-[0-9]{3} : 0-9중 하나가 3번 반복 - 4번 반복 - 3번 반복 인 행을 출력한다. (전화번호 010-9999-999)

  • grep -E 'Be{4,}r' drink.txt : 바로 전 문자가 4회 이상 반복인 경우 행을 출력한다.

  • {}를 기본 정규 표현식에서 사용하려면 \를 앞에 붙여야 한다.

반복 횟수를 지정하는 메타 문자 정리

  • * : 0회 이상 반복
  • + : 확장 정규 표현식만 가능. 1회 이상 반복
  • ? : 확장 정규 표현식만 가능. 0 또는 1회
  • {m,n} : m회 이상 n회 이하 반복 기본 정규 표현식은 \{m,n\}으로 사용.
  • {m} : 정확히 m회 반복, \ 사용해야함.
  • {m,} : m회 이상 반복, \ 사용해야 함.

13.5 그 외의 메타 문자

  • () : 정규 표현식을 그룹화한다.

  • grep -E 'Wine{2,}' test.txt : Winee ~ 인 경우 출력한다.

  • grep -E '(Wine){2,}' test.txt : WineWine ~인 경우 출력한다.

  • | : 여러 정규 표현식을 or조건으로 연결할 때 사용

    • grep -E (abc|xyz) test.txt : abc 또는 xyz라는 문자열에 해당 하는 경우 행 출력

    • grep -E 'my (vodka|wine)' test.txt : my vodka 또는 my wine인 경우 행이 출력된다.

  • 기본 정규 표현식에서 ()를 사용하려면 \를 앞에 붙인다.

  • |는 기본 정규 표현식에서 사용할 수 없다.


13.6 정규 표현식 사용하기

  • /Be*r : vim에서 정규 표현식으로 검색이 가능하다.

  • sed, awk에서도 정규 표현식을 사용할 수 있다.

  • 펄, 루비, 자바에서도 사용할 수 있다.

profile
안녕하세요.

0개의 댓글