웹사이트 검색

Awk 및 정규식을 사용하여 파일의 텍스트 또는 문자열을 필터링하는 방법


문자열이나 파일에서 텍스트를 읽거나 편집하기 위해 Unix/Linux에서 특정 명령을 실행할 때, 우리는 대부분 관심 있는 특정 섹션으로 출력을 필터링하려고 시도합니다. 이럴 때 정규식을 사용하면 편리합니다.

또한 읽어 보세요: 실용적인 예가 포함된 10가지 유용한 Linux 체인 연산자

정규 표현식이란 무엇입니까?

정규식은 여러 문자 시퀀스를 나타내는 문자열로 정의할 수 있습니다. 정규식의 가장 중요한 점 중 하나는 명령이나 파일의 출력을 필터링하고 텍스트 또는 구성 파일의 섹션을 편집하는 등의 작업을 수행할 수 있다는 것입니다.

정규식의 특징

정규식은 다음으로 구성됩니다.

  1. 공백, 밑줄(_), A-Z, a-z, 0-9와 같은 일반 문자.
  2. 일반 문자로 확장된 메타 문자에는 다음이 포함됩니다.

    1. (.) 개행 문자를 제외한 모든 단일 문자와 일치합니다.
    2. (*) 바로 앞에 있는 문자가 0개 이상 존재하는 것과 일치합니다.
    3. [ 문자 ] 문자에 지정된 문자 중 하나와 일치하며, 하이픈 (-)을 사용하여 다음과 같은 문자 범위를 의미할 수도 있습니다. [a-f], [1-5] 등입니다.
    4. ^ 파일의 줄 시작 부분과 일치합니다.
    5. $는 파일의 줄 끝과 일치합니다.
    6. \ 이스케이프 문자입니다.

텍스트를 필터링하려면 awk와 같은 텍스트 필터링 도구를 사용해야 합니다. awk를 자체 프로그래밍 언어로 생각할 수 있습니다. 그러나 awk 사용에 대한 이 가이드의 범위에서는 이를 간단한 명령줄 필터링 도구로 다루겠습니다.

awk의 일반적인 구문은 다음과 같습니다.

awk 'script' filename

여기서 'script'awk가 이해하고 파일, filename에서 실행되는 명령 집합입니다.

파일의 특정 줄을 읽고 해당 줄의 복사본을 만든 다음 해당 줄에서 스크립트를 실행하는 방식으로 작동합니다. 이는 파일의 모든 행에서 반복됩니다.

'스크립트''/pattern/action' 형식입니다. 여기서 pattern은 정규 표현식이고 action awk가 한 줄에서 주어진 패턴을 찾을 때 수행할 작업입니다.

Linux에서 Awk 필터링 도구를 사용하는 방법

다음 예에서는 awk의 기능에서 위에서 논의한 메타 문자에 중점을 둘 것입니다.

awk 사용의 간단한 예:

아래 예에서는 패턴이 지정되지 않았으므로 /etc/hosts 파일의 모든 행을 인쇄합니다.

awk '//{print}'/etc/hosts

패턴과 함께 Awk를 사용하세요:

아래 예에서는 localhost 패턴이 제공되었으므로 awk는 /etc/hosts 파일에 localhost가 있는 행과 일치합니다.

awk '/localhost/{print}' /etc/hosts 

패턴에서 (.) 와일드카드와 함께 Awk 사용

(.)는 아래 예에서 loc, localhost, localnet을 포함하는 문자열과 일치합니다.

즉, * l some_single_character c *입니다.

awk '/l.c/{print}' /etc/hosts

패턴에서 (*) 문자와 함께 Awk 사용

아래 예와 같이 localhost, localnet, lines, capable을 포함하는 문자열과 일치합니다.

awk '/l*c/{print}' /etc/localhost

또한 (*)가 감지할 수 있는 가능한 가장 긴 일치 항목을 얻으려고 시도한다는 것도 알게 될 것입니다.

이를 보여주는 사례를 살펴보겠습니다. 문자 t로 시작하고 t로 끝나는 문자열 일치를 의미하는 정규식 t*t를 사용합니다. 아래 줄에 :

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

/t*t/ 패턴을 사용하면 다음과 같은 가능성을 얻을 수 있습니다.

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

그리고 /t*t/ 와일드카드 문자의 (*)를 사용하면 awk가 마지막 옵션을 선택할 수 있습니다.

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

[ 문자 ] 세트와 함께 Awk 사용

예를 들어 [al1] 세트를 사용하면 여기서 awk는 a, l 또는 1 문자를 포함하는 모든 문자열과 일치합니다. /etc/hosts 파일의 한 줄에 있습니다.

awk '/[al1]/{print}' /etc/hosts

다음 예에서는 K 또는 k로 시작하고 뒤에 T가 오는 문자열을 일치시킵니다.

awk '/[Kk]T/{print}' /etc/hosts 

범위의 문자 지정

awk로 문자를 이해하세요.

  1. [0-9]는 단일 숫자를 의미합니다.
  2. [a-z]는 단일 소문자와 일치함을 의미합니다.
  3. [A-Z]는 단일 대문자와 일치함을 의미합니다.
  4. [a-zA-Z]는 단일 문자와 일치함을 의미합니다.
  5. [a-zA-Z 0-9]는 단일 문자 또는 숫자와 일치함을 의미합니다.

아래 예를 살펴보겠습니다.

awk '/[0-9]/{print}' /etc/hosts 

위 예에서 /etc/hosts 파일의 모든 행에는 최소한 하나의 숫자 [0-9]가 포함되어 있습니다.

(^) 메타 문자와 함께 Awk 사용

아래 예와 같이 제공된 패턴으로 시작하는 모든 줄과 일치합니다.

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

($) 메타 문자와 함께 Awk 사용

제공된 패턴으로 끝나는 모든 줄과 일치합니다.

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

(\) 이스케이프 문자와 함께 Awk 사용

이를 통해 뒤에 오는 문자를 리터럴로 사용할 수 있습니다. 즉, 있는 그대로 간주할 수 있습니다.

아래 예에서 첫 번째 명령은 파일의 모든 줄을 인쇄하고, 두 번째 명령은 $25.00이 있는 줄과 일치시키고 싶지만 이스케이프 문자가 사용되지 않기 때문에 아무것도 인쇄하지 않습니다.

세 번째 명령은 $을 그대로 읽는 데 이스케이프 문자를 사용했기 때문에 정확합니다.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt

요약

이것이 awk 명령줄 필터링 도구의 전부는 아닙니다. 위의 예는 awk의 기본 작업입니다. 다음 부분에서는 awk의 복잡한 기능을 사용하는 방법에 대해 알아볼 것입니다. 끝까지 읽어주셔서 감사하고 추가 사항이나 설명이 있으면 댓글 섹션에 댓글을 게시해 주세요.