Linux에서 AWK 언어로 텍스트 처리하는 방법

Linux에서 AWK 언어로 텍스트 처리하는 방법

2022-06-01 last update

12 minutes reading Interactive Linux Basics System Tools Linux Commands

소개


Linux 유틸리티는 일반적으로 Unix의 디자인 이념을 따릅니다.소형 도구를 사용하고 순수한 텍스트 파일을 사용하여 입력과 출력을 하며 모듈식으로 조작하는 것을 권장합니다.이 남겨진 문제로 인해 우리는 sedawk 등 도구를 사용하여 강력한 텍스트 처리 기능을 가지고 있다.awk는 프로그래밍 언어와 텍스트 프로세서로 텍스트 데이터를 매우 유용하게 조작할 수 있습니다.이 안내서에서는 명령행 도구 awk 를 사용하는 방법과 텍스트를 처리하는 방법을 탐색합니다.

기본 문법

awk 명령은 기본적으로 모든 현대 Linux 시스템에 포함되어 있기 때문에 설치하지 않아도 사용할 수 있습니다.awk 예측 가능한 형식으로 포맷된 텍스트 파일을 처리할 때 가장 유용합니다.예를 들어 그것은 표 데이터를 해석하고 조작하는 데 매우 뛰어나다.그것은 한 줄씩 운행하고 전체 파일을 두루 돌아다닌다.
기본적으로 공백 (공간, 탭 등) 을 사용하여 필드를 구분합니다.다행히도 Linux 시스템의 많은 프로필에서 이런 형식을 사용합니다.awk 명령의 기본 형식은 다음과 같습니다.
  1. awk '/search_pattern/ { action_to_take_on_matches; another_action; }' file_to_parse
모든 명령에서 검색 섹션이나 작업 섹션을 생략할 수 있습니다.기본적으로 작업 섹션이 표시되지 않으면 플롯이 수행됩니다.이것은 일치하는 모든 줄을 인쇄할 뿐입니다.
검색 섹션이 표시되지 않으면 awk 각 행에 나열된 작업을 수행합니다.
둘 다 지정되면 awk 검색 섹션을 사용하여 현재 행에 패턴이 반영되었는지 확인한 다음 일치하는 항목에 대해 작업을 수행합니다.
가장 간단한 형식에서 awklikeawk를 사용하여 텍스트 파일의 모든 줄을 화면에 인쇄할 수 있습니다.
친구들이 가장 좋아하는 음식을 열거하는 cat 파일을 만듭니다.
  1. echo "carrot sandy
  2. wasabi luke
  3. sandwich brian
  4. salad ryan
  5. spaghetti jessica" > favorite_food.txt
현재 favorite_food.txt 명령을 사용하여 파일을 화면에 인쇄합니다.
  1. awk '{print}' favorite_food.txt
화면에 인쇄된 파일이 표시됩니다.
Output
carrot sandy wasabi luke sandwich brian salad ryan spaghetti jessica
이것은 그다지 유용하지 않다.파일에서 텍스트 "sand"를 검색하여 awk 검색 필터링 기능을 시도해 보겠습니다.
  1. awk '/sand/' favorite_food.txt
Output
carrot sandy sandwich brian
보시다시피, awk 현재 문자'sand'를 포함하는 줄만 인쇄합니다.
정규 표현식을 사용하면 텍스트의 특정 부분을 겨냥할 수 있다."sand"문자로 시작하는 줄만 표시하려면 정규 표현식awk을 사용합니다.
  1. awk '/^sand/' favorite_food.txt
이번에는 한 줄만 표시됩니다.
Output
sandwich brian
이와 같이 작업 섹션을 사용하여 인쇄할 정보를 지정할 수 있습니다.예를 들어, 첫 번째 열만 인쇄하려면 다음 명령을 사용합니다.
  1. awk '/^sand/ {print $1;}' favorite_food.txt
Output
sandwich
열 번호와 연관된 변수를 통해 각 열을 참조할 수 있습니다 (공백으로 구분).예를 들어 첫 번째 열은 ^sand, 두 번째 열은 $1 으로 전체 줄을 참조할 수 있습니다.

내부 변수 및 확장 형식

$2 명령은 파일을 처리할 때 내부 변수를 사용하여 정보를 분배합니다.$0 사용된 내부 변수는 다음과 같습니다.
  • 파일 이름: 현재 입력 파일을 참조합니다.
  • FNR: 현재 입력 파일에 대한 현재 레코드의 번호를 참조합니다.예를 들어, 두 개의 입력 파일이 있다면, 이것은 전체 파일이 아니라 각 파일의 기록 번호를 알려 줍니다.
  • FS: 레코드의 각 필드를 나타내는 현재 필드 구분자입니다.기본적으로 이 설정은 공백입니다.
  • NF: 현재 레코드의 필드 수입니다.
  • NR: 현재 기록된 번호입니다.
  • OFS: 데이터를 출력하는 필드 구분자입니다.기본적으로 이 설정은 공백입니다.
  • ORS: 출력 데이터의 레코드 구분자입니다.기본적으로 줄 바꿈 문자입니다.
  • RS: 입력 파일의 서로 다른 기록을 구분하는 데 사용되는 레코드 구분자입니다.기본적으로 줄 바꿈 문자입니다.
  • 이 변수의 값을 임의로 변경해서 파일의 수요를 충족시킬 수 있습니다.일반적으로 처리의 초기화 단계에서 이 작업을 수행합니다.
    이것은 우리에게 또 다른 중요한 개념을 가져왔다.awk 문법은 현재 사용하고 있는 문법보다 약간 복잡하며, 선택할 수 있는 awkawk 블록은 각각 파일 처리 전과 이후에 실행되는 명령을 포함합니다.
    이렇게 하면 확장 구문이 다음과 같이 표시됩니다.
    1. awk 'BEGIN { action; }
    2. /search/ { action; }
    3. END { action; }' input_file
    BEGINEND 키워드는 검색 매개 변수와 같은 특정 조건 집합입니다.그것들은 문서를 처리하기 전과 후에 일치한다.
    이것은 BEGIN 부분의 내부 변수를 변경할 수 있음을 의미합니다.예를 들어, END 파일은 공백이 아닌 콜론으로 구분됩니다.
    이 파일의 첫 번째 열을 인쇄하려면 다음 명령을 수행합니다.
    1. awk 'BEGIN { FS=":"; }
    2. { print $1; }' /etc/passwd
    Output
    root daemon bin sys sync games man . . .
    BEGIN/etc/passwd 블록을 사용하여 인쇄 중인 필드에 대한 정보를 인쇄할 수 있습니다.다음 명령을 사용하여 파일의 데이터를 테이블로 변환하고 : 탭을 사용하여 정확하게 구분합니다.
    1. awk 'BEGIN { FS=":"; print "User\t\tUID\t\tGID\t\tHome\t\tShell\n--------------"; }
    2. {print $1,"\t\t",$3,"\t\t",$4,"\t\t",$6,"\t\t",$7;}
    3. END { print "---------\nFile Complete" }' /etc/passwd
    다음 출력이 표시됩니다.
    Output
    User UID GID Home Shell -------------- root 0 0 /root /bin/bash daemon 1 1 /usr/sbin /bin/sh bin 2 2 /bin /bin/sh sys 3 3 /dev /bin/sh sync 4 65534 /bin /bin/sync . . . --------- File Complete
    보시다시피 BEGIN 의 일부 특성을 이용하여 내용을 잘 포맷할 수 있습니다.
    모든 전개 부분은 선택할 수 있다.사실상, 만약 다른 바이트를 정의한다면, 주 조작 바이트 자체는 선택할 수 있다.예를 들어, 다음을 수행할 수 있습니다.
    1. awk 'BEGIN { print "We can use awk like the echo command"; }'
    다음 출력이 표시됩니다.
    Output
    We can use awk like the echo command
    이제 출력된 필드에서 텍스트를 찾는 방법을 보여 줍니다.

    필드 검색 및 복합 표현식


    앞의 예시에서 END 파일에서 "sand"로 시작하는 줄을 인쇄했습니다.이것은 매우 쉽습니다. 왜냐하면 전체 줄의 시작을 찾고 있기 때문입니다.
    검색 모드가 필드 시작과 일치하는지 알고 싶으면 어떻게 해야 합니까?\t 파일의 새 버전을 만들고 각 사람의 음식 앞에 항목 번호를 추가합니다.
    1. echo "1 carrot sandy
    2. 2 wasabi luke
    3. 3 sandwich brian
    4. 4 salad ryan
    5. 5 spaghetti jessica" > favorite_food.txt
    이 파일에서 "사"로 시작하는 모든 음식을 찾으려면 이렇게 시작할 수 있습니다.
    1. awk '/sa/' favorite_food.txt
    이것은 "sa"를 포함하는 모든 줄을 표시합니다.
    Output
    1 carrot sandy 2 wasabi luke 3 sandwich brian 4 salad ryan
    여기에서 단어 중'사'의 모든 실례를 일치시키고 있습니다.마지막으로 중간에 도안이 있는 겨자나 원하는 열에 없는 산디를 포함한다.이 경우, 당신은 두 번째 열에서'sa'로 시작하는 단어에만 흥미를 느낍니다.
    다음 명령을 사용하면 awk 두 번째 열의 시작 부분에만 일치한다는 것을 알 수 있습니다.
    1. awk '$2 ~ /^sa/' favorite_food.txt
    보시다시피, 이것은 두 번째 열의 시작 부분에서만 일치하는 항목을 검색할 수 있도록 합니다.favorite_food.txt 일부 규정favorite_food.txt은 2열에만 주의해야 한다.
    Output
    3 sandwich brian 4 salad ryan
    '!'을 포함하여 일치하지 않는 내용을 쉽게 검색할 수 있습니다물결표 (~) 앞의 문자입니다.이 명령은 "sa"로 시작하지 않은 모든 음식의 줄을 되돌려줍니다.
    1. awk '$2 !~ /^sa/' favorite_food.txt
    Output
    1 carrot sandy 2 wasabi luke 5 spaghetti jessica
    나중에 "sa"로 시작하지 않는 줄에만 관심이 있고 항목 번호가 5보다 작으면 다음과 같은 복합 표현식을 사용할 수 있습니다.
    1. awk '$2 !~ /^sa/ && $1 < 5' favorite_food.txt
    이것은 약간의 새로운 개념을 도입했다.첫 번째는 awk 조작부호를 사용하여 일치하는 회선에 추가 요구를 추가하는 능력이다.이 옵션을 사용하면 줄을 일치시키기 위해 임의의 조건을 조합할 수 있습니다.이 예에서 이 연산자를 사용하여 첫 번째 열의 값이 5보다 작도록 검사를 추가합니다.
    다음 출력이 표시됩니다.
    Output
    1 carrot sandy 2 wasabi luke
    field_num ~ 를 사용하여 파일을 처리할 수도 있지만 다른 프로그램의 출력을 처리할 수도 있습니다.

    다른 프로그램의 출력을 처리하다

    awk 명령을 사용하여 파일 이름이 아닌 다른 프로그램의 출력을 확인할 수 있습니다.예를 들어, && 명령에서 IPv4 주소를 확인할 수 있습니다.awk 명령은 IP 주소, 브로드캐스트 주소 및 컴퓨터의 모든 네트워크 인터페이스에 대한 추가 정보를 표시합니다.awk라는 인터페이스에 대한 정보를 표시하려면 다음 명령을 사용합니다.
    1. ip a s eth0
    다음 결과가 표시됩니다.
    Output
    2571: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:0b brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.11/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
    awk 비헤이비어 대상을 대상으로 한 다음 IP 주소만 인쇄할 수 있습니다.
    1. ip a s eth0 | awk -F '[\/ ]+' '/inet / {print $3}'
    ip 표지판은 ip a 정규 표현식eth0을 사용하여 정사각형이나 공백을 통해 경계를 정한다는 것을 알려준다.이 필드는 행 awk 을 별도의 필드로 분할합니다.IP 주소는 세 번째 필드에 있습니다. 줄의 시작 공백도 필드로 간주됩니다. 공백과 슬래시로 구분되기 때문입니다.이 예에서는 inet 연속 공백을 단일 공백으로 간주합니다.
    출력 표시 IP 주소:
    Output
    172.17.0.11
    여러 곳에서 -F 다른 명령의 출력을 검색하거나 확인할 수 있습니다.

    결론


    이제 awk 명령을 사용하여 텍스트 파일과 텍스트 흐름을 조작하고 포맷하며 선택적으로 인쇄하는 방법을 기본적으로 알고 있을 것입니다.Awk는 더욱 큰 주제로서 실제적으로 완전한 프로그래밍 언어로 변수 부여, 제어 구조, 내장 함수 등을 포함한다.자신의 스크립트에서 텍스트를 신뢰할 수 있는 방식으로 포맷할 수 있습니다.[\/ ]+에 대한 자세한 내용은 free public-domain book by its creators 를 참조하십시오.