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


Unix/Linux에서 특정 명령을 실행하여 문자열이나 파일에서 텍스트를 읽거나 편집 할 때 대부분의 경우 특정 관심 섹션으로 출력을 필터링하려고합니다. 정규 표현식을 사용하는 것이 편리합니다.

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

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

  1. Ordinary characters such as space, underscore(_), A-Z, a-z, 0-9.
  2. Meta characters that are expanded to ordinary characters, they include:
    1. (.) it matches any single character except a newline.
    2. (*) it matches zero or more existences of the immediate character preceding it.
    3. [ character(s) ] it matches any one of the characters specified in character(s), one can also use a hyphen (-) to mean a range of characters such as [a-f], [1-5], and so on.
    4. ^ it matches the beginning of a line in a file.
    5. $ matches the end of line in a file.
    6. \ it is an escape character.

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

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

    # awk 'script' filename
    

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

    파일에서 주어진 행을 읽고 행의 사본을 만든 다음 해당 행에서 스크립트를 실행합니다. 이것은 파일의 모든 행에서 반복됩니다.

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

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

    다음 예제에서는 awk의 기능에 대해 위에서 논의한 메타 문자에 초점을 맞출 것입니다.

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

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

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

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

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

    즉, * l some_single_character c *.

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

    아래 예제와 같이 localhost, localnet, 라인, 가능을 포함하는 문자열과 일치합니다.

    # 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
    

    예를 들어 [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] means a single number
    2. [a-z] means match a single lower case letter
    3. [A-Z] means match a single upper case letter
    4. [a-zA-Z] means match a single letter
    5. [a-zA-Z 0-9] means match a single letter or number

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

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

    위의 예에서/etc/hosts 파일의 모든 행에는 하나 이상의 숫자 [0-9] 가 포함됩니다.

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

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

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

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

    그것은 당신이 그 뒤에 오는 문자를 그대로 고려하는 리터럴로 취할 수 있습니다.

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

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

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

    요약

    awk의 기본 작업 위의 예제 인 awk 명령 줄 필터링 도구로는 이것이 전부가 아닙니다. 다음 부분에서는 awk의 복잡한 기능을 사용하는 방법에 대해 설명하겠습니다. 읽어 주셔서 감사합니다. 추가 사항이나 설명이 있으시면 댓글 섹션에 댓글을 남겨주세요.